From a32e9656b08f70a7c81caa8fd08b694e2a7fbc01 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Mon, 13 Apr 2020 17:26:45 +0200 Subject: [PATCH 1/9] Add class PathUpToH. --- gklearn/kernels/__init__.py | 1 + gklearn/kernels/path_up_to_h.py | 643 ++++++++++++---- gklearn/kernels/shortest_path.py | 2 +- gklearn/preimage/experiments/xp_median_preimage.py | 825 ++++++++++++++++++--- gklearn/preimage/median_preimage_generator.py | 16 +- gklearn/tests/test_graph_kernels.py | 270 +++++++ gklearn/utils/__init__.py | 1 + gklearn/utils/dataset.py | 14 +- gklearn/utils/graph_files.py | 4 +- 9 files changed, 1520 insertions(+), 256 deletions(-) create mode 100644 gklearn/tests/test_graph_kernels.py diff --git a/gklearn/kernels/__init__.py b/gklearn/kernels/__init__.py index 73147ba..60fea24 100644 --- a/gklearn/kernels/__init__.py +++ b/gklearn/kernels/__init__.py @@ -10,3 +10,4 @@ __date__ = "November 2018" from gklearn.kernels.graph_kernel import GraphKernel from gklearn.kernels.structural_sp import StructuralSP from gklearn.kernels.shortest_path import ShortestPath +from gklearn.kernels.path_up_to_h import PathUpToH diff --git a/gklearn/kernels/path_up_to_h.py b/gklearn/kernels/path_up_to_h.py index 4b35463..26639cf 100644 --- a/gklearn/kernels/path_up_to_h.py +++ b/gklearn/kernels/path_up_to_h.py @@ -7,22 +7,23 @@ Created on Fri Apr 10 18:33:13 2020 @references: - [1] Liva Ralaivola, Sanjay J Swamidass, Hiroto Saigo, and Pierre - Baldi. Graph kernels for chemical informatics. Neural networks, - 18(8):1093–1110, 2005. + [1] Liva Ralaivola, Sanjay J Swamidass, Hiroto Saigo, and Pierre + Baldi. Graph kernels for chemical informatics. Neural networks, + 18(8):1093–1110, 2005. """ import sys -from itertools import product -# from functools import partial from multiprocessing import Pool from tqdm import tqdm import numpy as np +import networkx as nx +from collections import Counter +from functools import partial from gklearn.utils.parallel import parallel_gm, parallel_me -from gklearn.utils.utils import getSPGraph from gklearn.kernels import GraphKernel +from gklearn.utils import Trie -class PathUpToH(GraphKernel): +class PathUpToH(GraphKernel): # @todo: add function for k_func == None def __init__(self, **kwargs): GraphKernel.__init__(self) @@ -35,231 +36,557 @@ class PathUpToH(GraphKernel): def _compute_gm_series(self): - # get shortest path graph of each graph. - if self._verbose >= 2: - iterator = tqdm(self._graphs, desc='getting sp graphs', file=sys.stdout) - else: - iterator = self._graphs - self._graphs = [getSPGraph(g, edge_weight=self.__edge_weight) for g in iterator] - - # compute Gram matrix. - gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) + self.__add_dummy_labels(self._graphs) from itertools import combinations_with_replacement - itr = combinations_with_replacement(range(0, len(self._graphs)), 2) + itr_kernel = combinations_with_replacement(range(0, len(self._graphs)), 2) if self._verbose >= 2: - iterator = tqdm(itr, desc='calculating kernels', file=sys.stdout) + iterator_ps = tqdm(range(0, len(self._graphs)), desc='getting paths', file=sys.stdout) + iterator_kernel = tqdm(itr_kernel, desc='calculating kernels', file=sys.stdout) else: - iterator = itr - for i, j in iterator: - kernel = self.__sp_do_(self._graphs[i], self._graphs[j]) - gram_matrix[i][j] = kernel - gram_matrix[j][i] = kernel + iterator_ps = range(0, len(self._graphs)) + iterator_kernel = itr_kernel + + 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] + for i, j in iterator_kernel: + kernel = self.__kernel_do_trie(all_paths[i], all_paths[j]) + gram_matrix[i][j] = kernel + gram_matrix[j][i] = kernel + else: + all_paths = [self.__find_all_paths_until_length(self._graphs[i]) for i in iterator_ps] + for i, j in iterator_kernel: + kernel = self.__kernel_do_naive(all_paths[i], all_paths[j]) + gram_matrix[i][j] = kernel + gram_matrix[j][i] = kernel return gram_matrix def _compute_gm_imap_unordered(self): - # get shortest path graph of each graph. + self.__add_dummy_labels(self._graphs) + + # get all paths of all graphs before calculating kernels to save time, + # but this may cost a lot of memory for large datasets. pool = Pool(self._n_jobs) - get_sp_graphs_fun = self._wrapper_get_sp_graphs itr = zip(self._graphs, range(0, len(self._graphs))) if len(self._graphs) < 100 * self._n_jobs: chunksize = int(len(self._graphs) / self._n_jobs) + 1 else: chunksize = 100 + all_paths = [[] for _ in range(len(self._graphs))] + if self.__compute_method == 'trie' and self.__k_func is not None: + get_ps_fun = self._wrapper_find_all_path_as_trie + elif self.__compute_method != 'trie' and self.__k_func is not None: + get_ps_fun = partial(self._wrapper_find_all_paths_until_length, True) + else: + get_ps_fun = partial(self._wrapper_find_all_paths_until_length, False) if self._verbose >= 2: - iterator = tqdm(pool.imap_unordered(get_sp_graphs_fun, itr, chunksize), - desc='getting sp graphs', file=sys.stdout) + iterator = tqdm(pool.imap_unordered(get_ps_fun, itr, chunksize), + desc='getting paths', file=sys.stdout) else: - iterator = pool.imap_unordered(get_sp_graphs_fun, itr, chunksize) - for i, g in iterator: - self._graphs[i] = g + iterator = pool.imap_unordered(get_ps_fun, itr, chunksize) + for i, ps in iterator: + all_paths[i] = ps pool.close() pool.join() # compute Gram matrix. gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) - - def init_worker(gs_toshare): - global G_gs - G_gs = gs_toshare - do_fun = self._wrapper_sp_do + + if self.__compute_method == 'trie' and self.__k_func is not None: + def init_worker(trie_toshare): + global G_trie + G_trie = trie_toshare + do_fun = self._wrapper_kernel_do_trie + elif self.__compute_method != 'trie' and self.__k_func is not None: + def init_worker(plist_toshare): + global G_plist + G_plist = plist_toshare + do_fun = self._wrapper_kernel_do_naive + else: + def init_worker(plist_toshare): + global G_plist + G_plist = plist_toshare + do_fun = self.__wrapper_kernel_do_kernelless # @todo: what is this? parallel_gm(do_fun, gram_matrix, self._graphs, init_worker=init_worker, - glbv=(self._graphs,), n_jobs=self._n_jobs, verbose=self._verbose) + glbv=(all_paths,), n_jobs=self._n_jobs, verbose=self._verbose) return gram_matrix def _compute_kernel_list_series(self, g1, g_list): - # get shortest path graphs of g1 and each graph in g_list. - g1 = getSPGraph(g1, edge_weight=self.__edge_weight) + self.__add_dummy_labels(g_list + [g1]) + if self._verbose >= 2: - iterator = tqdm(g_list, desc='getting sp graphs', file=sys.stdout) + iterator_ps = tqdm(g_list, desc='getting paths', file=sys.stdout) + iterator_kernel = tqdm(range(len(g_list)), desc='calculating kernels', file=sys.stdout) else: - iterator = g_list - g_list = [getSPGraph(g, edge_weight=self.__edge_weight) for g in iterator] - - # compute kernel list. + iterator_ps = g_list + iterator_kernel = range(len(g_list)) + kernel_list = [None] * len(g_list) - if self._verbose >= 2: - iterator = tqdm(range(len(g_list)), desc='calculating kernels', file=sys.stdout) + + if self.__compute_method == 'trie': + paths_g1 = self.__find_all_path_as_trie(g1) + paths_g_list = [self.__find_all_path_as_trie(self._graphs[i]) for i in iterator_ps] + for i in iterator_kernel: + kernel = self.__kernel_do_trie(paths_g1, paths_g_list[i]) + kernel_list[i] = kernel else: - iterator = range(len(g_list)) - for i in iterator: - kernel = self.__sp_do(g1, g_list[i]) - kernel_list[i] = kernel + paths_g1 = self.__find_all_paths_until_length(g1) + paths_g_list = [self.__find_all_paths_until_length(self._graphs[i]) for i in iterator_ps] + for i in iterator_kernel: + kernel = self.__kernel_do_naive(paths_g1, paths_g_list[i]) + kernel_list[i] = kernel return kernel_list def _compute_kernel_list_imap_unordered(self, g1, g_list): - # get shortest path graphs of g1 and each graph in g_list. - g1 = getSPGraph(g1, edge_weight=self.__edge_weight) + self.__add_dummy_labels(g_list + [g1]) + + # get all paths of all graphs before calculating kernels to save time, + # but this may cost a lot of memory for large datasets. pool = Pool(self._n_jobs) - get_sp_graphs_fun = self._wrapper_get_sp_graphs itr = zip(g_list, range(0, len(g_list))) if len(g_list) < 100 * self._n_jobs: chunksize = int(len(g_list) / self._n_jobs) + 1 else: chunksize = 100 + 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) + 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) + get_ps_fun = partial(self._wrapper_find_all_paths_until_length, True) + else: + paths_g1 = self.__find_all_paths_until_length(g1) + get_ps_fun = partial(self._wrapper_find_all_paths_until_length, False) if self._verbose >= 2: - iterator = tqdm(pool.imap_unordered(get_sp_graphs_fun, itr, chunksize), - desc='getting sp graphs', file=sys.stdout) + iterator = tqdm(pool.imap_unordered(get_ps_fun, itr, chunksize), + desc='getting paths', file=sys.stdout) else: - iterator = pool.imap_unordered(get_sp_graphs_fun, itr, chunksize) - for i, g in iterator: - g_list[i] = g + iterator = pool.imap_unordered(get_ps_fun, itr, chunksize) + for i, ps in iterator: + paths_g_list[i] = ps pool.close() pool.join() # compute Gram matrix. kernel_list = [None] * len(g_list) - - def init_worker(g1_toshare, gl_toshare): - global G_g1, G_gl - G_g1 = g1_toshare - G_gl = gl_toshare + + def init_worker(p1_toshare, plist_toshare): + global G_p1, G_plist + G_p1 = p1_toshare + G_plist = plist_toshare do_fun = self._wrapper_kernel_list_do def func_assign(result, var_to_assign): var_to_assign[result[0]] = result[1] itr = range(len(g_list)) len_itr = len(g_list) parallel_me(do_fun, func_assign, kernel_list, itr, len_itr=len_itr, - init_worker=init_worker, glbv=(g1, g_list), method='imap_unordered', n_jobs=self._n_jobs, itr_desc='calculating kernels', verbose=self._verbose) - + init_worker=init_worker, glbv=(paths_g1, paths_g_list), method='imap_unordered', n_jobs=self._n_jobs, itr_desc='calculating kernels', verbose=self._verbose) + return kernel_list def _wrapper_kernel_list_do(self, itr): - return itr, self.__sp_do(G_g1, G_gl[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: + return itr, self.__kernel_do_kernelless(G_p1, G_plist[itr]) def _compute_single_kernel_series(self, g1, g2): - g1 = getSPGraph(g1, edge_weight=self.__edge_weight) - g2 = getSPGraph(g2, edge_weight=self.__edge_weight) - kernel = self.__sp_do(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) + 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) return kernel + + + def __kernel_do_trie(self, trie1, trie2): + """Calculate path graph kernels up to depth d between 2 graphs using trie. + + Parameters + ---------- + trie1, trie2 : list + Tries that contains all paths in 2 graphs. + k_func : function + A kernel function applied using different notions of fingerprint + similarity. + + Return + ------ + kernel : float + Path kernel up to h between 2 graphs. + """ + if self.__k_func == 'tanimoto': + # traverse all paths in graph1 and search them in graph2. Deep-first + # search is applied. + def traverseTrie1t(root, trie2, setlist, pcurrent=[]): + for key, node in root['children'].items(): + pcurrent.append(key) + if node['isEndOfWord']: + setlist[1] += 1 + count2 = trie2.searchWord(pcurrent) + if count2 != 0: + setlist[0] += 1 + if node['children'] != {}: + traverseTrie1t(node, trie2, setlist, pcurrent) + else: + del pcurrent[-1] + if pcurrent != []: + del pcurrent[-1] + + + # traverse all paths in graph2 and find out those that are not in + # graph1. Deep-first search is applied. + def traverseTrie2t(root, trie1, setlist, pcurrent=[]): + for key, node in root['children'].items(): + pcurrent.append(key) + if node['isEndOfWord']: + # print(node['count']) + count1 = trie1.searchWord(pcurrent) + if count1 == 0: + setlist[1] += 1 + if node['children'] != {}: + traverseTrie2t(node, trie1, setlist, pcurrent) + else: + del pcurrent[-1] + if pcurrent != []: + del pcurrent[-1] + + setlist = [0, 0] # intersection and union of path sets of g1, g2. + # print(trie1.root) + # print(trie2.root) + traverseTrie1t(trie1.root, trie2, setlist) + # print(setlist) + traverseTrie2t(trie2.root, trie1, setlist) + # print(setlist) + kernel = setlist[0] / setlist[1] + + elif self.__k_func == 'MinMax': # MinMax kernel + # traverse all paths in graph1 and search them in graph2. Deep-first + # search is applied. + def traverseTrie1m(root, trie2, sumlist, pcurrent=[]): + for key, node in root['children'].items(): + pcurrent.append(key) + if node['isEndOfWord']: +# print(node['count']) + count1 = node['count'] + count2 = trie2.searchWord(pcurrent) + sumlist[0] += min(count1, count2) + sumlist[1] += max(count1, count2) + if node['children'] != {}: + traverseTrie1m(node, trie2, sumlist, pcurrent) + else: + del pcurrent[-1] + if pcurrent != []: + del pcurrent[-1] + + # traverse all paths in graph2 and find out those that are not in + # graph1. Deep-first search is applied. + def traverseTrie2m(root, trie1, sumlist, pcurrent=[]): + for key, node in root['children'].items(): + pcurrent.append(key) + if node['isEndOfWord']: + # print(node['count']) + count1 = trie1.searchWord(pcurrent) + if count1 == 0: + sumlist[1] += node['count'] + if node['children'] != {}: + traverseTrie2m(node, trie1, sumlist, pcurrent) + else: + del pcurrent[-1] + if pcurrent != []: + del pcurrent[-1] + + sumlist = [0, 0] # sum of mins and sum of maxs +# print(trie1.root) +# print(trie2.root) + traverseTrie1m(trie1.root, trie2, sumlist) +# print(sumlist) + traverseTrie2m(trie2.root, trie1, sumlist) +# print(sumlist) + kernel = sumlist[0] / sumlist[1] + else: + raise Exception('The given "k_func" cannot be recognized. Possible choices include: "tanimoto", "MinMax".') + + return kernel + + + def _wrapper_kernel_do_trie(self, itr): + i = itr[0] + j = itr[1] + return i, j, self.__kernel_do_trie(G_trie[i], G_trie[j]) + + + def __kernel_do_naive(self, paths1, paths2): + """Calculate path graph kernels up to depth d between 2 graphs naively. + + Parameters + ---------- + paths_list : list of list + List of list of paths in all graphs, where for unlabeled graphs, each + path is represented by a list of nodes; while for labeled graphs, each + path is represented by a string consists of labels of nodes and/or + edges on that path. + k_func : function + A kernel function applied using different notions of fingerprint + similarity. + + Return + ------ + kernel : float + Path kernel up to h between 2 graphs. + """ + all_paths = list(set(paths1 + paths2)) + + if self.__k_func == 'tanimoto': + length_union = len(set(paths1 + paths2)) + kernel = (len(set(paths1)) + len(set(paths2)) - + length_union) / length_union + # vector1 = [(1 if path in paths1 else 0) for path in all_paths] + # vector2 = [(1 if path in paths2 else 0) for path in all_paths] + # kernel_uv = np.dot(vector1, vector2) + # kernel = kernel_uv / (len(set(paths1)) + len(set(paths2)) - kernel_uv) + + elif self.__k_func == 'MinMax': # MinMax kernel + path_count1 = Counter(paths1) + path_count2 = Counter(paths2) + vector1 = [(path_count1[key] if (key in path_count1.keys()) else 0) + for key in all_paths] + vector2 = [(path_count2[key] if (key in path_count2.keys()) else 0) + for key in all_paths] + kernel = np.sum(np.minimum(vector1, vector2)) / \ + np.sum(np.maximum(vector1, vector2)) + else: + raise Exception('The given "k_func" cannot be recognized. Possible choices include: "tanimoto", "MinMax".') + + return kernel + + + def _wrapper_kernel_do_naive(self, itr): + i = itr[0] + j = itr[1] + return i, j, self.__kernel_do_naive(G_plist[i], G_plist[j]) + + + def __find_all_path_as_trie(self, G): + # all_path = find_all_paths_until_length(G, length, ds_attrs, + # node_label=node_label, + # edge_label=edge_label) + # ptrie = Trie() + # for path in all_path: + # ptrie.insertWord(path) + + # ptrie = Trie() + # path_l = [[n] for n in G.nodes] # paths of length l + # path_l_str = paths2labelseqs(path_l, G, ds_attrs, node_label, edge_label) + # for p in path_l_str: + # ptrie.insertWord(p) + # for l in range(1, length + 1): + # path_lplus1 = [] + # for path in path_l: + # for neighbor in G[path[-1]]: + # if neighbor not in path: + # tmp = path + [neighbor] + ## if tmp[::-1] not in path_lplus1: + # path_lplus1.append(tmp) + # path_l = path_lplus1[:] + # # consider labels + # path_l_str = paths2labelseqs(path_l, G, ds_attrs, node_label, edge_label) + # for p in path_l_str: + # ptrie.insertWord(p) + # + # print(time.time() - time1) + # print(ptrie.root) + # print() + + + # traverse all paths up to length h in a graph and construct a trie with + # them. Deep-first search is applied. Notice the reverse of each path is + # also stored to the trie. + def traverseGraph(root, ptrie, G, pcurrent=[]): + if len(pcurrent) < self.__depth + 1: + for neighbor in G[root]: + if neighbor not in pcurrent: + pcurrent.append(neighbor) + plstr = self.__paths2labelseqs([pcurrent], G) + ptrie.insertWord(plstr[0]) + traverseGraph(neighbor, ptrie, G, pcurrent) + del pcurrent[-1] + + + ptrie = Trie() + path_l = [[n] for n in G.nodes] # paths of length l + path_l_str = self.__paths2labelseqs(path_l, G) + for p in path_l_str: + ptrie.insertWord(p) + for n in G.nodes: + traverseGraph(n, ptrie, G, pcurrent=[n]) + + + # def traverseGraph(root, all_paths, length, G, ds_attrs, node_label, edge_label, + # pcurrent=[]): + # if len(pcurrent) < length + 1: + # for neighbor in G[root]: + # if neighbor not in pcurrent: + # pcurrent.append(neighbor) + # plstr = paths2labelseqs([pcurrent], G, ds_attrs, + # node_label, edge_label) + # all_paths.append(pcurrent[:]) + # traverseGraph(neighbor, all_paths, length, G, ds_attrs, + # node_label, edge_label, pcurrent) + # del pcurrent[-1] + # + # + # path_l = [[n] for n in G.nodes] # paths of length l + # all_paths = path_l[:] + # path_l_str = paths2labelseqs(path_l, G, ds_attrs, node_label, edge_label) + ## for p in path_l_str: + ## ptrie.insertWord(p) + # for n in G.nodes: + # traverseGraph(n, all_paths, length, G, ds_attrs, node_label, edge_label, + # pcurrent=[n]) + # print(ptrie.root) + return ptrie + - def _wrapper_get_sp_graphs(self, itr_item): + def _wrapper_find_all_path_as_trie(self, itr_item): g = itr_item[0] i = itr_item[1] - return i, getSPGraph(g, edge_weight=self.__edge_weight) + return i, self.__find_all_path_as_trie(g) - def __sp_do(self, g1, g2): - - kernel = 0 + # @todo: (can be removed maybe) this method find paths repetively, it could be faster. + def __find_all_paths_until_length(self, G, tolabelseqs=True): + """Find all paths no longer than a certain maximum length in a graph. A + recursive depth first search is applied. + + Parameters + ---------- + G : NetworkX graphs + The graph in which paths are searched. + length : integer + The maximum length of paths. + ds_attrs: dict + Dataset attributes. + node_label : string + Node attribute used as label. The default node label is atom. + edge_label : string + Edge attribute used as label. The default edge label is bond_type. + + Return + ------ + path : list + List of paths retrieved, where for unlabeled graphs, each path is + represented by a list of nodes; while for labeled graphs, each path is + represented by a list of strings consists of labels of nodes and/or + edges on that path. + """ + # path_l = [tuple([n]) for n in G.nodes] # paths of length l + # all_paths = path_l[:] + # for l in range(1, self.__depth + 1): + # path_l_new = [] + # for path in path_l: + # for neighbor in G[path[-1]]: + # if len(path) < 2 or neighbor != path[-2]: + # tmp = path + (neighbor, ) + # if tuple(tmp[::-1]) not in path_l_new: + # path_l_new.append(tuple(tmp)) + + # all_paths += path_l_new + # path_l = path_l_new[:] + + path_l = [[n] for n in G.nodes] # paths of length l + all_paths = [p.copy() for p in path_l] + for l in range(1, self.__depth + 1): + path_lplus1 = [] + for path in path_l: + for neighbor in G[path[-1]]: + if neighbor not in path: + tmp = path + [neighbor] + # if tmp[::-1] not in path_lplus1: + path_lplus1.append(tmp) + + all_paths += path_lplus1 + path_l = [p.copy() for p in path_lplus1] + + # for i in range(0, self.__depth + 1): + # new_paths = find_all_paths(G, i) + # if new_paths == []: + # break + # all_paths.extend(new_paths) + + # consider labels + # print(paths2labelseqs(all_paths, G, ds_attrs, node_label, edge_label)) + # print() + return (self.__paths2labelseqs(all_paths, G) if tolabelseqs else all_paths) + + + def _wrapper_find_all_paths_until_length(self, tolabelseqs, itr_item): + g = itr_item[0] + i = itr_item[1] + return i, self.__find_all_paths_until_length(g, tolabelseqs=tolabelseqs) + - # compute shortest path matrices first, method borrowed from FCSP. - vk_dict = {} # shortest path matrices dict + def __paths2labelseqs(self, plist, G): if len(self.__node_labels) > 0: - # node symb and non-synb labeled - if len(self.__node_attrs) > 0: - kn = self.__node_kernels['mix'] - for n1, n2 in product( - g1.nodes(data=True), g2.nodes(data=True)): - n1_labels = [n1[1][nl] for nl in self.__node_labels] - n2_labels = [n2[1][nl] for nl in self.__node_labels] - n1_attrs = [n1[1][na] for na in self.__node_attrs] - n2_attrs = [n2[1][na] for na in self.__node_attrs] - vk_dict[(n1[0], n2[0])] = kn(n1_labels, n2_labels, n1_attrs, n2_attrs) - # node symb labeled + if len(self.__edge_labels) > 0: + path_strs = [] + for path in plist: + pths_tmp = [] + 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)) + path_strs.append(tuple(pths_tmp)) else: - kn = self.__node_kernels['symb'] - for n1 in g1.nodes(data=True): - for n2 in g2.nodes(data=True): - n1_labels = [n1[1][nl] for nl in self.__node_labels] - n2_labels = [n2[1][nl] for nl in self.__node_labels] - vk_dict[(n1[0], n2[0])] = kn(n1_labels, n2_labels) + path_strs = [] + for path in plist: + pths_tmp = [] + for node in path: + pths_tmp.append(tuple(G.nodes[node][nl] for nl in self.__node_labels)) + path_strs.append(tuple(pths_tmp)) + return path_strs else: - # node non-synb labeled - if len(self.__node_attrs) > 0: - kn = self.__node_kernels['nsymb'] - for n1 in g1.nodes(data=True): - for n2 in g2.nodes(data=True): - n1_attrs = [n1[1][na] for na in self.__node_attrs] - n2_attrs = [n2[1][na] for na in self.__node_attrs] - vk_dict[(n1[0], n2[0])] = kn(n1_attrs, n2_attrs) - # node unlabeled + if len(self.__edge_labels) > 0: + path_strs = [] + for path in plist: + if len(path) == 1: + path_strs.append(tuple()) + else: + pths_tmp = [] + for idx, node in enumerate(path[:-1]): + pths_tmp.append(tuple(G[node][path[idx + 1]][el] for el in self.__edge_labels)) + path_strs.append(tuple(pths_tmp)) + return path_strs else: - for e1, e2 in product( - g1.edges(data=True), g2.edges(data=True)): - if e1[2]['cost'] == e2[2]['cost']: - kernel += 1 - return kernel - - # compute graph kernels - if self.__ds_infos['directed']: - for e1, e2 in product(g1.edges(data=True), g2.edges(data=True)): - if e1[2]['cost'] == e2[2]['cost']: - nk11, nk22 = vk_dict[(e1[0], e2[0])], vk_dict[(e1[1], e2[1])] - kn1 = nk11 * nk22 - kernel += kn1 - else: - for e1, e2 in product(g1.edges(data=True), g2.edges(data=True)): - if e1[2]['cost'] == e2[2]['cost']: - # each edge walk is counted twice, starting from both its extreme nodes. - nk11, nk12, nk21, nk22 = vk_dict[(e1[0], e2[0])], vk_dict[( - e1[0], e2[1])], vk_dict[(e1[1], e2[0])], vk_dict[(e1[1], e2[1])] - kn1 = nk11 * nk22 - kn2 = nk12 * nk21 - kernel += kn1 + kn2 - - # # ---- exact implementation of the Fast Computation of Shortest Path Kernel (FCSP), reference [2], sadly it is slower than the current implementation - # # compute vertex kernels - # try: - # vk_mat = np.zeros((nx.number_of_nodes(g1), - # nx.number_of_nodes(g2))) - # g1nl = enumerate(g1.nodes(data=True)) - # g2nl = enumerate(g2.nodes(data=True)) - # for i1, n1 in g1nl: - # for i2, n2 in g2nl: - # vk_mat[i1][i2] = kn( - # n1[1][node_label], n2[1][node_label], - # [n1[1]['attributes']], [n2[1]['attributes']]) - - # range1 = range(0, len(edge_w_g[i])) - # range2 = range(0, len(edge_w_g[j])) - # for i1 in range1: - # x1 = edge_x_g[i][i1] - # y1 = edge_y_g[i][i1] - # w1 = edge_w_g[i][i1] - # for i2 in range2: - # x2 = edge_x_g[j][i2] - # y2 = edge_y_g[j][i2] - # w2 = edge_w_g[j][i2] - # ke = (w1 == w2) - # if ke > 0: - # kn1 = vk_mat[x1][x2] * vk_mat[y1][y2] - # kn2 = vk_mat[x1][y2] * vk_mat[y1][x2] - # kernel += kn1 + kn2 - - return kernel + return [tuple(['0' for node in path]) for path in plist] + # return [tuple([len(path)]) for path in all_paths] - def _wrapper_sp_do(self, itr): - i = itr[0] - j = itr[1] - return i, j, self.__sp_do(G_gs[i], G_gs[j]) + def __add_dummy_labels(self, Gn): + if self.__k_func is not None: + if len(self.__node_labels) == 0: + for G in Gn: + nx.set_node_attributes(G, '0', 'dummy') + self.__node_labels.append('dummy') + if len(self.__edge_labels) == 0: + for G in Gn: + nx.set_edge_attributes(G, '0', 'dummy') + self.__edge_labels.append('dummy') \ No newline at end of file diff --git a/gklearn/kernels/shortest_path.py b/gklearn/kernels/shortest_path.py index c11c2e5..1923b00 100644 --- a/gklearn/kernels/shortest_path.py +++ b/gklearn/kernels/shortest_path.py @@ -51,7 +51,7 @@ class ShortestPath(GraphKernel): else: iterator = itr for i, j in iterator: - kernel = self.__sp_do_(self._graphs[i], self._graphs[j]) + kernel = self.__sp_do(self._graphs[i], self._graphs[j]) gram_matrix[i][j] = kernel gram_matrix[j][i] = kernel diff --git a/gklearn/preimage/experiments/xp_median_preimage.py b/gklearn/preimage/experiments/xp_median_preimage.py index 7ae20ba..4fd12d2 100644 --- a/gklearn/preimage/experiments/xp_median_preimage.py +++ b/gklearn/preimage/experiments/xp_median_preimage.py @@ -13,7 +13,7 @@ from gklearn.utils import compute_gram_matrices_by_class def xp_median_preimage_9_1(): - """xp 9_1: MAO, sspkernel, using CONSTANT. + """xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. """ # set parameters. ds_name = 'MAO' # @@ -29,7 +29,7 @@ def xp_median_preimage_9_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -69,7 +69,68 @@ def xp_median_preimage_9_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert', 'random', 'random', 'random']: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_9_2(): + """xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + """ + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -77,7 +138,7 @@ def xp_median_preimage_9_1(): def xp_median_preimage_8_1(): - """xp 8_1: Monoterpenoides, sspkernel, using CONSTANT. + """xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. """ # set parameters. ds_name = 'Monoterpenoides' # @@ -93,7 +154,7 @@ def xp_median_preimage_8_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -133,7 +194,68 @@ def xp_median_preimage_8_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert', 'random', 'random', 'random']: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_8_2(): + """xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + """ + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -141,7 +263,7 @@ def xp_median_preimage_8_1(): def xp_median_preimage_7_1(): - """xp 7_1: MUTAG, sspkernel, using CONSTANT. + """xp 7_1: MUTAG, StructuralSP, using CONSTANT. """ # set parameters. ds_name = 'MUTAG' # @@ -157,7 +279,7 @@ def xp_median_preimage_7_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -197,7 +319,68 @@ def xp_median_preimage_7_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert', 'random', 'random', 'random']: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_7_2(): + """xp 7_2: MUTAG, PathUpToH, using CONSTANT. + """ + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'PathUpToH', + 'depth': 2, # + 'k_func': 'MinMax', # + 'compute_method': 'trie', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -205,7 +388,7 @@ def xp_median_preimage_7_1(): def xp_median_preimage_6_1(): - """xp 6_1: COIL-RAG, sspkernel, using NON_SYMBOLIC. + """xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. """ # set parameters. ds_name = 'COIL-RAG' # @@ -221,7 +404,7 @@ def xp_median_preimage_6_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -261,20 +444,20 @@ def xp_median_preimage_6_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'random', 'random', 'random']: + for fit_method in ['k-graphs'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) - - -def xp_median_preimage_5_1(): - """xp 5_1: FRANKENSTEIN, sspkernel, using NON_SYMBOLIC. + + +def xp_median_preimage_6_2(): + """xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. """ # set parameters. - ds_name = 'FRANKENSTEIN' # + ds_name = 'COIL-RAG' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'init_ecc': [3, 3, 1, 3, 3, 1], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -285,11 +468,9 @@ def xp_median_preimage_5_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'ShortestPath', 'edge_weight': None, 'node_kernels': sub_kernels, - 'edge_kernels': sub_kernels, - 'compute_method': 'naive', 'parallel': 'imap_unordered', # 'parallel': None, 'n_jobs': multiprocessing.cpu_count(), @@ -298,7 +479,7 @@ def xp_median_preimage_5_1(): ged_options = {'method': 'IPFP', 'initialization_method': 'RANDOM', # 'NODE' 'initial_solutions': 10, # 1 - 'edit_cost': 'NON_SYMBOLIC', + 'edit_cost': 'NON_SYMBOLIC', # 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, 'threads': multiprocessing.cpu_count(), @@ -311,7 +492,7 @@ def xp_median_preimage_5_1(): save_results = True dir_save='../results/xp_median_preimage/' irrelevant_labels = None # - edge_required = False # + edge_required = True # # print settings. print('parameters:') @@ -325,18 +506,18 @@ def xp_median_preimage_5_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'random', 'random', 'random']: + for fit_method in ['k-graphs'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) - -def xp_median_preimage_4_1(): - """xp 4_1: COLORS-3, sspkernel, using NON_SYMBOLIC. + +def xp_median_preimage_5_1(): + """xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. """ # set parameters. - ds_name = 'COLORS-3' # + ds_name = 'FRANKENSTEIN' # mpg_options = {'fit_method': 'k-graphs', 'init_ecc': [3, 3, 1, 3, 3, 0], # 'ds_name': ds_name, @@ -349,7 +530,7 @@ def xp_median_preimage_4_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -389,20 +570,20 @@ def xp_median_preimage_4_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'random', 'random', 'random']: + for fit_method in ['k-graphs'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + - -def xp_median_preimage_3_1(): - """xp 3_1: Fingerprint, sspkernel, using LETTER2, only node attrs. +def xp_median_preimage_4_1(): + """xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. """ # set parameters. - ds_name = 'Fingerprint' # + ds_name = 'COLORS-3' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [0.525, 0.525, 0.001, 0.125, 0.125], # + 'init_ecc': [3, 3, 1, 3, 3, 0], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -413,7 +594,7 @@ def xp_median_preimage_3_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -426,7 +607,7 @@ def xp_median_preimage_3_1(): ged_options = {'method': 'IPFP', 'initialization_method': 'RANDOM', # 'NODE' 'initial_solutions': 10, # 1 - 'edit_cost': 'LETTER2', + 'edit_cost': 'NON_SYMBOLIC', 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, 'threads': multiprocessing.cpu_count(), @@ -438,7 +619,7 @@ def xp_median_preimage_3_1(): 'refine': False} save_results = True dir_save='../results/xp_median_preimage/' - irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + irrelevant_labels = None # edge_required = False # # print settings. @@ -453,20 +634,20 @@ def xp_median_preimage_3_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'random', 'random', 'random']: + for fit_method in ['k-graphs'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) - -def xp_median_preimage_2_1(): - """xp 2_1: COIL-DEL, sspkernel, using LETTER2, only node attrs. + +def xp_median_preimage_3_2(): + """xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. """ # set parameters. - ds_name = 'COIL-DEL' # + ds_name = 'Fingerprint' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3], + 'init_ecc': [0.525, 0.525, 0.001, 0.125, 0.125], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -477,11 +658,9 @@ def xp_median_preimage_2_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'ShortestPath', 'edge_weight': None, 'node_kernels': sub_kernels, - 'edge_kernels': sub_kernels, - 'compute_method': 'naive', 'parallel': 'imap_unordered', # 'parallel': None, 'n_jobs': multiprocessing.cpu_count(), @@ -502,7 +681,8 @@ def xp_median_preimage_2_1(): 'refine': False} save_results = True dir_save='../results/xp_median_preimage/' - irrelevant_labels = {'edge_labels': ['valence']} + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = True # # print settings. print('parameters:') @@ -515,25 +695,21 @@ def xp_median_preimage_2_1(): print('irrelevant_labels:', irrelevant_labels) print() -# # compute gram matrices for each class a priori. -# print('Compute gram matrices for each class a priori.') -# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) - # generate preimages. - for fit_method in ['k-graphs', 'random', 'random', 'random']: + for fit_method in ['k-graphs'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method - generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels) + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) -def xp_median_preimage_1_1(): - """xp 1_1: Letter-high, sspkernel. +def xp_median_preimage_3_1(): + """xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. """ # set parameters. - ds_name = 'Letter-high' + ds_name = 'Fingerprint' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3], + 'init_ecc': [0.525, 0.525, 0.001, 0.125, 0.125], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -544,19 +720,19 @@ def xp_median_preimage_1_1(): 'verbose': 2} mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - kernel_options = {'name': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, 'compute_method': 'naive', - 'parallel': 'imap_unordered', -# 'parallel': None, + 'parallel': 'imap_unordered', + # 'parallel': None, 'n_jobs': multiprocessing.cpu_count(), 'normalize': True, 'verbose': 2} ged_options = {'method': 'IPFP', 'initialization_method': 'RANDOM', # 'NODE' - 'initial_solutions': 1, # 1 + 'initial_solutions': 10, # 1 'edit_cost': 'LETTER2', 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, @@ -568,6 +744,9 @@ def xp_median_preimage_1_1(): 'verbose': 2, 'refine': False} save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = False # # print settings. print('parameters:') @@ -577,40 +756,502 @@ def xp_median_preimage_1_1(): print('ged_options:', ged_options) print('mge_options:', mge_options) print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() # generate preimages. - for fit_method in ['k-graphs', 'expert', 'random', 'random', 'random']: + for fit_method in ['k-graphs'] + ['random'] * 10: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method - generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') - - -if __name__ == "__main__": - - #### xp 1_1: Letter-high, sspkernel. - # xp_median_preimage_1_1() - - #### xp 2_1: COIL-DEL, sspkernel, using LETTER2, only node attrs. -# xp_median_preimage_2_1() - - #### xp 3_1: Fingerprint, sspkernel, using LETTER2, only node attrs. - # xp_median_preimage_3_1() - - #### xp 4_1: COLORS-3, sspkernel, using NON_SYMBOLIC. -# xp_median_preimage_4_1() - - #### xp 5_1: FRANKENSTEIN, sspkernel, using NON_SYMBOLIC. -# xp_median_preimage_5_1() - - #### xp 6_1: COIL-RAG, sspkernel, using NON_SYMBOLIC. - # xp_median_preimage_6_1() + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + - #### xp 7_1: MUTAG, sspkernel, using CONSTANT. - # xp_median_preimage_7_1() - - #### xp 8_1: Monoterpenoides, sspkernel, using CONSTANT. -# xp_median_preimage_8_1() +def xp_median_preimage_2_1(): + """xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. + """ + # set parameters. + ds_name = 'COIL-DEL' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = {'edge_labels': ['valence']} + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + +# # compute gram matrices for each class a priori. +# print('Compute gram matrices for each class a priori.') +# compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + # generate preimages. + for fit_method in ['k-graphs'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels) + + +def xp_median_preimage_1_1(): + """xp 1_1: Letter-high, StructuralSP. + """ + # set parameters. + ds_name = 'Letter-high' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') + + +def xp_median_preimage_1_2(): + """xp 1_2: Letter-high, ShortestPath. + """ + # set parameters. + ds_name = 'Letter-high' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = None # + edge_required = True # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_10_1(): + """xp 10_1: Letter-med, StructuralSP. + """ + # set parameters. + ds_name = 'Letter-med' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') + + +def xp_median_preimage_10_2(): + """xp 10_2: Letter-med, ShortestPath. + """ + # set parameters. + ds_name = 'Letter-med' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = None # + edge_required = True # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_11_1(): + """xp 11_1: Letter-low, StructuralSP. + """ + # set parameters. + ds_name = 'Letter-low' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'StructuralSP', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'edge_kernels': sub_kernels, + 'compute_method': 'naive', + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') + + +def xp_median_preimage_11_2(): + """xp 11_2: Letter-low, ShortestPath. + """ + # set parameters. + ds_name = 'Letter-low' + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + kernel_options = {'name': 'ShortestPath', + 'edge_weight': None, + 'node_kernels': sub_kernels, + 'parallel': 'imap_unordered', +# 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'LETTER2', + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save='../results/xp_median_preimage/' + irrelevant_labels = None # + edge_required = True # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +if __name__ == "__main__": + + #### xp 1_1: Letter-high, StructuralSP. + # xp_median_preimage_1_1() + + #### xp 1_2: Letter-high, ShortestPath. +# xp_median_preimage_1_2() + + #### xp 10_1: Letter-med, StructuralSP. + # xp_median_preimage_10_1() + + #### xp 10_2: Letter-med, ShortestPath. + # xp_median_preimage_10_2() + + #### xp 11_1: Letter-low, StructuralSP. + # xp_median_preimage_11_1() + + #### xp 11_2: Letter-low, ShortestPath. +# xp_median_preimage_11_2() + + #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. +# xp_median_preimage_2_1() + + #### xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. + # xp_median_preimage_3_1() + + #### xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. +# xp_median_preimage_3_2() + + #### xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. +# xp_median_preimage_4_1() + + #### xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. +# xp_median_preimage_5_1() + + #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + # xp_median_preimage_6_1() + + #### xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. +# xp_median_preimage_6_2() + + #### xp 7_1: MUTAG, StructuralSP, using CONSTANT. + # xp_median_preimage_7_1() + + #### xp 7_2: MUTAG, PathUpToH, using CONSTANT. + xp_median_preimage_7_2() + + #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. +# xp_median_preimage_8_1() + + #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. +# xp_median_preimage_8_2() + + #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. +# xp_median_preimage_9_1() - #### xp 9_1: MAO, sspkernel, using CONSTANT. - xp_median_preimage_9_1() \ No newline at end of file + #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. +# xp_median_preimage_9_2() \ No newline at end of file diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 6878701..04efa9d 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -725,7 +725,13 @@ class MedianPreimageGenerator(PreimageGenerator): def __set_graph_kernel_by_name(self): - if self.kernel_options['name'] == 'structuralspkernel': + if self._kernel_options['name'] == 'ShortestPath': + from gklearn.kernels import ShortestPath + self._graph_kernel = ShortestPath(node_labels=self._dataset.node_labels, + node_attrs=self._dataset.node_attrs, + ds_infos=self._dataset.get_dataset_infos(keys=['directed']), + **self._kernel_options) + elif self._kernel_options['name'] == 'StructuralSP': from gklearn.kernels import StructuralSP self._graph_kernel = StructuralSP(node_labels=self._dataset.node_labels, edge_labels=self._dataset.edge_labels, @@ -733,6 +739,14 @@ class MedianPreimageGenerator(PreimageGenerator): edge_attrs=self._dataset.edge_attrs, ds_infos=self._dataset.get_dataset_infos(keys=['directed']), **self._kernel_options) + elif self._kernel_options['name'] == 'PathUpToH': + from gklearn.kernels import PathUpToH + self._graph_kernel = PathUpToH(node_labels=self._dataset.node_labels, + edge_labels=self._dataset.edge_labels, + ds_infos=self._dataset.get_dataset_infos(keys=['directed']), + **self._kernel_options) + else: + raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH".') # def __clean_graph(self, G, node_labels=[], edge_labels=[], node_attrs=[], edge_attrs=[]): diff --git a/gklearn/tests/test_graph_kernels.py b/gklearn/tests/test_graph_kernels.py new file mode 100644 index 0000000..fbad15f --- /dev/null +++ b/gklearn/tests/test_graph_kernels.py @@ -0,0 +1,270 @@ +"""Tests of graph kernels. +""" + +import pytest +import multiprocessing + + +def chooseDataset(ds_name): + """Choose dataset according to name. + """ + from gklearn.utils import Dataset + + dataset = Dataset() + + # no node labels (and no edge labels). + if ds_name == 'Alkane': + dataset.load_predefined_dataset(ds_name) + dataset.trim_dataset(edge_required=False) + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} + dataset.remove_labels(**irrelevant_labels) + # node symbolic labels. + elif ds_name == 'Acyclic': + dataset.load_predefined_dataset(ds_name) + dataset.trim_dataset(edge_required=False) + irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} + dataset.remove_labels(**irrelevant_labels) + # node non-symbolic labels. + elif ds_name == 'Letter-med': + dataset.load_predefined_dataset(ds_name) + dataset.trim_dataset(edge_required=False) + # node symbolic and non-symbolic labels (and edge symbolic labels). + elif ds_name == 'AIDS': + dataset.load_predefined_dataset(ds_name) + dataset.trim_dataset(edge_required=False) + # edge non-symbolic labels (no node labels). + elif ds_name == 'Fingerprint_edge': + dataset.load_predefined_dataset('Fingerprint') + dataset.trim_dataset(edge_required=True) + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} + dataset.remove_labels(**irrelevant_labels) + # edge non-symbolic labels (and node non-symbolic labels). + elif ds_name == 'Fingerprint': + dataset.load_predefined_dataset(ds_name) + dataset.trim_dataset(edge_required=True) + # edge symbolic and non-symbolic labels (and node symbolic and non-symbolic labels). + elif ds_name == 'Cuneiform': + dataset.load_predefined_dataset(ds_name) + dataset.trim_dataset(edge_required=True) + + dataset.cut_graphs(range(0, 3)) + + return dataset + + +# @pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) +# @pytest.mark.parametrize('weight,compute_method', [(0.01, 'geo'), (1, 'exp')]) +# #@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +# def test_commonwalkkernel(ds_name, weight, compute_method): +# """Test common walk kernel. +# """ +# from gklearn.kernels.commonWalkKernel import commonwalkkernel + +# Gn, y = chooseDataset(ds_name) + +# try: +# Kmatrix, run_time, idx = commonwalkkernel(Gn, +# node_label='atom', +# edge_label='bond_type', +# weight=weight, +# compute_method=compute_method, +# # parallel=parallel, +# n_jobs=multiprocessing.cpu_count(), +# verbose=True) +# except Exception as exception: +# assert False, exception + + +# @pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) +# @pytest.mark.parametrize('remove_totters', [True, False]) +# #@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +# def test_marginalizedkernel(ds_name, remove_totters): +# """Test marginalized kernel. +# """ +# from gklearn.kernels.marginalizedKernel import marginalizedkernel + +# Gn, y = chooseDataset(ds_name) + +# try: +# Kmatrix, run_time = marginalizedkernel(Gn, +# node_label='atom', +# edge_label='bond_type', +# p_quit=0.5, +# n_iteration=2, +# remove_totters=remove_totters, +# # parallel=parallel, +# n_jobs=multiprocessing.cpu_count(), +# verbose=True) +# except Exception as exception: +# assert False, exception + + +# @pytest.mark.parametrize( +# 'compute_method,ds_name,sub_kernel', +# [ +# # ('sylvester', 'Alkane', None), +# # ('conjugate', 'Alkane', None), +# # ('conjugate', 'AIDS', None), +# # ('fp', 'Alkane', None), +# # ('fp', 'AIDS', None), +# ('spectral', 'Alkane', 'exp'), +# ('spectral', 'Alkane', 'geo'), +# ] +# ) +# #@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +# def test_randomwalkkernel(ds_name, compute_method, sub_kernel): +# """Test random walk kernel kernel. +# """ +# from gklearn.kernels.randomWalkKernel import randomwalkkernel +# from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct +# import functools + +# Gn, y = chooseDataset(ds_name) + +# mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) +# sub_kernels = [{'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel}] +# try: +# Kmatrix, run_time, idx = randomwalkkernel(Gn, +# compute_method=compute_method, +# weight=1e-3, +# p=None, +# q=None, +# edge_weight=None, +# node_kernels=sub_kernels, +# edge_kernels=sub_kernels, +# node_label='atom', +# edge_label='bond_type', +# sub_kernel=sub_kernel, +# # parallel=parallel, +# n_jobs=multiprocessing.cpu_count(), +# verbose=True) +# except Exception as exception: +# assert False, exception + + +@pytest.mark.parametrize('ds_name', ['Alkane', 'Acyclic', 'Letter-med', 'AIDS', 'Fingerprint']) +@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +def test_ShortestPath(ds_name, parallel): + """Test shortest path kernel. + """ + from gklearn.kernels import ShortestPath + from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct + import functools + + dataset = chooseDataset(ds_name) + + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + try: + graph_kernel = ShortestPath(node_labels=dataset.node_labels, + node_attrs=dataset.node_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + node_kernels=sub_kernels) + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: + assert False, exception + + +#@pytest.mark.parametrize('ds_name', ['Alkane', 'Acyclic', 'Letter-med', 'AIDS', 'Fingerprint']) +@pytest.mark.parametrize('ds_name', ['Alkane', 'Acyclic', 'Letter-med', 'AIDS', 'Fingerprint', 'Fingerprint_edge', 'Cuneiform']) +@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +def test_StructuralSP(ds_name, parallel): + """Test structural shortest path kernel. + """ + from gklearn.kernels import StructuralSP + from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct + import functools + + dataset = chooseDataset(ds_name) + + mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) + sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} + try: + graph_kernel = StructuralSP(node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + node_attrs=dataset.node_attrs, + edge_attrs=dataset.edge_attrs, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + node_kernels=sub_kernels, + edge_kernels=sub_kernels) + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: + assert False, exception + + +@pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) +@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +#@pytest.mark.parametrize('k_func', ['MinMax', 'tanimoto', None]) +@pytest.mark.parametrize('k_func', ['MinMax', 'tanimoto']) +@pytest.mark.parametrize('compute_method', ['trie', 'naive']) +def test_PathUpToH(ds_name, parallel, k_func, compute_method): + """Test path kernel up to length $h$. + """ + from gklearn.kernels import PathUpToH + + dataset = chooseDataset(ds_name) + + try: + graph_kernel = PathUpToH(node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + depth=2, k_func=k_func, compute_method=compute_method) + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: + assert False, exception + + +# @pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) +# @pytest.mark.parametrize('parallel', ['imap_unordered', None]) +# def test_treeletkernel(ds_name, parallel): +# """Test treelet kernel. +# """ +# from gklearn.kernels.treeletKernel import treeletkernel +# from gklearn.utils.kernels import polynomialkernel +# import functools + +# Gn, y = chooseDataset(ds_name) + +# pkernel = functools.partial(polynomialkernel, d=2, c=1e5) +# try: +# Kmatrix, run_time = treeletkernel(Gn, +# sub_kernel=pkernel, +# node_label='atom', +# edge_label='bond_type', +# parallel=parallel, +# n_jobs=multiprocessing.cpu_count(), +# verbose=True) +# except Exception as exception: +# assert False, exception + + +# @pytest.mark.parametrize('ds_name', ['Acyclic']) +# #@pytest.mark.parametrize('base_kernel', ['subtree', 'sp', 'edge']) +# @pytest.mark.parametrize('base_kernel', ['subtree']) +# @pytest.mark.parametrize('parallel', ['imap_unordered', None]) +# def test_weisfeilerlehmankernel(ds_name, parallel, base_kernel): +# """Test Weisfeiler-Lehman kernel. +# """ +# from gklearn.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel + +# Gn, y = chooseDataset(ds_name) + +# try: +# Kmatrix, run_time = weisfeilerlehmankernel(Gn, +# node_label='atom', +# edge_label='bond_type', +# height=2, +# base_kernel=base_kernel, +# parallel=parallel, +# n_jobs=multiprocessing.cpu_count(), +# verbose=True) +# except Exception as exception: +# assert False, exception + + +if __name__ == "__main__": +# test_spkernel('Alkane', 'imap_unordered') + test_StructuralSP('Fingerprint_edge', 'imap_unordered') \ No newline at end of file diff --git a/gklearn/utils/__init__.py b/gklearn/utils/__init__.py index 78832d3..79d0a39 100644 --- a/gklearn/utils/__init__.py +++ b/gklearn/utils/__init__.py @@ -20,3 +20,4 @@ from gklearn.utils.graph_files import load_dataset, save_dataset from gklearn.utils.timer import Timer from gklearn.utils.utils import get_graph_kernel_by_name from gklearn.utils.utils import compute_gram_matrices_by_class +from gklearn.utils.trie import Trie diff --git a/gklearn/utils/dataset.py b/gklearn/utils/dataset.py index e218596..abd7edd 100644 --- a/gklearn/utils/dataset.py +++ b/gklearn/utils/dataset.py @@ -70,6 +70,13 @@ class Dataset(object): if ds_name == 'Acyclic': ds_file = current_path + '../../datasets/Acyclic/dataset_bps.ds' self.__graphs, self.__targets, label_names = load_dataset(ds_file) + elif ds_name == 'AIDS': + ds_file = current_path + '../../datasets/AIDS/AIDS_A.txt' + self.__graphs, self.__targets, label_names = load_dataset(ds_file) + elif ds_name == 'Alkane': + ds_file = current_path + '../../datasets/Alkane/dataset.ds' + fn_targets = current_path + '../../datasets/Alkane/dataset_boiling_point_names.txt' + self.__graphs, self.__targets, label_names = load_dataset(ds_file, filename_targets=fn_targets) elif ds_name == 'COIL-DEL': ds_file = current_path + '../../datasets/COIL-DEL/COIL-DEL_A.txt' self.__graphs, self.__targets, label_names = load_dataset(ds_file) @@ -79,6 +86,9 @@ class Dataset(object): elif ds_name == 'COLORS-3': ds_file = current_path + '../../datasets/COLORS-3/COLORS-3_A.txt' self.__graphs, self.__targets, label_names = load_dataset(ds_file) + elif ds_name == 'Cuneiform': + ds_file = current_path + '../../datasets/Cuneiform/Cuneiform_A.txt' + self.__graphs, self.__targets, label_names = load_dataset(ds_file) elif ds_name == 'Fingerprint': ds_file = current_path + '../../datasets/Fingerprint/Fingerprint_A.txt' self.__graphs, self.__targets, label_names = load_dataset(ds_file) @@ -89,10 +99,10 @@ class Dataset(object): ds_file = current_path + '../../datasets/Letter-high/Letter-high_A.txt' self.__graphs, self.__targets, label_names = load_dataset(ds_file) elif ds_name == 'Letter-low': # node non-symb - ds_file = current_path + '../../datasets/Letter-high/Letter-low_A.txt' + ds_file = current_path + '../../datasets/Letter-low/Letter-low_A.txt' self.__graphs, self.__targets, label_names = load_dataset(ds_file) elif ds_name == 'Letter-med': # node non-symb - ds_file = current_path + '../../datasets/Letter-high/Letter-med_A.txt' + ds_file = current_path + '../../datasets/Letter-med/Letter-med_A.txt' self.__graphs, self.__targets, label_names = load_dataset(ds_file) elif ds_name == 'MAO': ds_file = current_path + '../../datasets/MAO/dataset.ds' diff --git a/gklearn/utils/graph_files.py b/gklearn/utils/graph_files.py index 7594110..ce07a59 100644 --- a/gklearn/utils/graph_files.py +++ b/gklearn/utils/graph_files.py @@ -569,10 +569,10 @@ def load_tud(filename): elif 'fga' in locals(): content_targets = open(fga).read().splitlines() # targets (regression) targets = [int(i) for i in content_targets] - if class_label_map is not None: - targets = [class_label_map[t] for t in targets] else: raise Exception('Can not find targets file. Please make sure there is a "', ds_name, '_graph_labels.txt" or "', ds_name, '_graph_attributes.txt"', 'file in your dataset folder.') + if class_label_map is not None: + targets = [class_label_map[t] for t in targets] # create graphs and add nodes data = [nx.Graph(name=str(i)) for i in range(0, len(content_targets))] From 57cc316e51da3978d0ea3bf1793697cf227b07e5 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Mon, 13 Apr 2020 17:36:18 +0200 Subject: [PATCH 2/9] Change names of datasets. --- .gitignore | 2 + datasets/Acyclic/1,1-bis(ethylthio)ethane.ct | 17 + datasets/Acyclic/1,1-bis(isopropylthio)ethane.ct | 21 + datasets/Acyclic/1,1-bis(methylthio)ethane.ct | 13 + datasets/Acyclic/1,1-diethoxyethane.ct | 17 + datasets/Acyclic/1,1-diethoxypentane.ct | 23 + datasets/Acyclic/1,1-diethoxypropane.ct | 19 + datasets/Acyclic/1,1-diisopropoxyethane.ct | 21 + datasets/Acyclic/1,1-diisopropoxypropane.ct | 23 + .../Acyclic/1,1-dimethoxy-2,2-dimethylpentane.ct | 23 + datasets/Acyclic/1,1-dimethoxy-2-methylpropane.ct | 17 + datasets/Acyclic/1,1-dimethoxybutane.ct | 17 + datasets/Acyclic/1,1-dimethoxyethane.ct | 13 + datasets/Acyclic/1,1-dimethoxyhexane.ct | 21 + datasets/Acyclic/1,1-dipropoxyethane.ct | 21 + datasets/Acyclic/1,1-dipropoxypropane.ct | 23 + datasets/Acyclic/1,2-bis(ethylthio)ethane.ct | 17 + datasets/Acyclic/1,2-bis(methylthio)ethane.ct | 13 + datasets/Acyclic/1,2-diethoxyethane.ct | 17 + datasets/Acyclic/1,2-dimethoxyethane.ct | 13 + datasets/Acyclic/1,2-dimethoxypropane.ct | 15 + datasets/Acyclic/1,2-dimethylpropyl_ethyl_ether.ct | 17 + .../Acyclic/1,2-dimethylpropyl_methyl_ether.ct | 15 + datasets/Acyclic/1,3-bis(ethylthio)propane.ct | 19 + datasets/Acyclic/1,3-diethoxypropane.ct | 19 + datasets/Acyclic/1,3-diisopropoxypropane.ct | 23 + datasets/Acyclic/1,3-dimethoxybutane.ct | 17 + datasets/Acyclic/1,3-dimethoxypentane.ct | 19 + datasets/Acyclic/1,3-dimethoxypropane.ct | 15 + .../Acyclic/1,3-dimethylpentyl_methyl_ether.ct | 19 + datasets/Acyclic/1,3-dipropoxypropane.ct | 23 + datasets/Acyclic/1,4-diethoxybutane.ct | 21 + datasets/Acyclic/1,4-dimethoxybutane.ct | 17 + datasets/Acyclic/1,4-dimethoxypentane.ct | 19 + datasets/Acyclic/1,5-dimethoxypentane.ct | 19 + datasets/Acyclic/1,5-dimethylhexyl_methyl_ether.ct | 21 + datasets/Acyclic/1-butyl-propane-2-ol.ct | 17 + datasets/Acyclic/1-ethoxy-1-propoxyethane.ct | 19 + datasets/Acyclic/1-ethoxy-2-methoxyethane.ct | 15 + datasets/Acyclic/1-ethoxy-4-methoxybutane.ct | 19 + .../1-ethyl-1,3-dimethylbutyl_methyl_ether.ct | 21 + datasets/Acyclic/1-ethylpropyl_methyl_sulfide.ct | 15 + datasets/Acyclic/1-ethylpropyl_propyl_ether.ct | 19 + datasets/Acyclic/1-methoxy-1-propoxyethane.ct | 17 + datasets/Acyclic/2,2-bis(propylthio)propane.ct | 23 + datasets/Acyclic/2,2-diethoxypropane.ct | 19 + datasets/Acyclic/2,2-dimethoxypropane.ct | 15 + datasets/Acyclic/2,2-dimethylpropyl_ethyl_ether.ct | 17 + datasets/Acyclic/2,4-dimethoxy-2-methylpentane.ct | 21 + datasets/Acyclic/2-ethoxy-2-methoxypropane.ct | 17 + datasets/Acyclic/2-ethylhexyl_methyl_ether.ct | 21 + datasets/Acyclic/3,5-dimethylhexyl_methyl_ether.ct | 21 + datasets/Acyclic/Acyclic.tar.gz | Bin 0 -> 14000 bytes datasets/Acyclic/bis(1-ethylpropyl)_ether.ct | 23 + datasets/Acyclic/bis(1-methylbutyl)_ether.ct | 23 + datasets/Acyclic/bis(butylthio)methane.ct | 23 + datasets/Acyclic/bis(ethylthio)methane.ct | 15 + datasets/Acyclic/bis(methylthio)methane.ct | 11 + datasets/Acyclic/butyl_ethyl_sulfide.ct | 15 + datasets/Acyclic/butyl_isobutyl_ether.ct | 19 + datasets/Acyclic/butyl_isobutyl_sulfide.ct | 19 + datasets/Acyclic/butyl_isopentyl_ether.ct | 21 + datasets/Acyclic/butyl_isopropyl_ether.ct | 17 + datasets/Acyclic/butyl_isopropyl_sulfide.ct | 17 + datasets/Acyclic/butyl_methyl_ether.ct | 13 + datasets/Acyclic/butyl_methyl_sulfide.ct | 13 + datasets/Acyclic/butyl_pentyl_ether.ct | 21 + datasets/Acyclic/butyl_propyl_ether.ct | 17 + datasets/Acyclic/butyl_propyl_sulfide.ct | 17 + datasets/Acyclic/butyl_sec-butyl_ether.ct | 19 + datasets/Acyclic/butyl_sec-butyl_sulfide.ct | 19 + datasets/Acyclic/butyl_tert-butyl_ether.ct | 19 + datasets/Acyclic/ci00007a011.pdf | 2718 ++++++++++++++++++++ datasets/Acyclic/dataset_bps.ds | 183 ++ datasets/Acyclic/dataset_bps_old.ds | 185 ++ datasets/Acyclic/di-sec-butyl_sulfide.ct | 19 + datasets/Acyclic/di-tert-butyl_disulfide.ct | 21 + datasets/Acyclic/di-tert-butyl_ether.ct | 19 + datasets/Acyclic/di-tert-butyl_peroxide.ct | 21 + datasets/Acyclic/di-tert-butyl_sulfide.ct | 19 + datasets/Acyclic/di-tert-pentyl_sulfide.ct | 23 + datasets/Acyclic/dibutyl_disulfide.ct | 21 + datasets/Acyclic/dibutyl_ether.ct | 19 + datasets/Acyclic/dibutylsulfide.ct | 19 + datasets/Acyclic/diethoxymethane.ct | 15 + datasets/Acyclic/diethyl_disulfide.ct | 13 + datasets/Acyclic/diethyl_ether.ct | 11 + datasets/Acyclic/diethyl_peroxide.ct | 13 + datasets/Acyclic/diethyl_sulfide.ct | 11 + datasets/Acyclic/diisobutyl_disulfide.ct | 21 + datasets/Acyclic/diisobutyl_ether.ct | 19 + datasets/Acyclic/diisobutyl_sulfide.ct | 19 + datasets/Acyclic/diisopentyl_ether.ct | 23 + datasets/Acyclic/diisopentyl_sulfide.ct | 23 + datasets/Acyclic/diisopropyl_disulfide.ct | 17 + datasets/Acyclic/diisopropyl_ether.ct | 15 + datasets/Acyclic/diisopropyl_sulfide.ct | 15 + datasets/Acyclic/dimethoxymethane.ct | 11 + datasets/Acyclic/dimethyl_disulfide.ct | 9 + datasets/Acyclic/dimethyl_ether.ct | 7 + datasets/Acyclic/dimethyl_peroxide.ct | 9 + datasets/Acyclic/dimethyl_sulfide.ct | 7 + datasets/Acyclic/dipentyl_ether.ct | 23 + datasets/Acyclic/dipentyl_sulfide.ct | 23 + datasets/Acyclic/dipropoxymethane.ct | 19 + datasets/Acyclic/dipropyl_disulfide.ct | 17 + datasets/Acyclic/dipropyl_ether.ct | 15 + datasets/Acyclic/dipropyl_sulfide.ct | 15 + datasets/Acyclic/ethoxymethoxyethane.ct | 15 + .../ethyl_1,1,3,3-tetramethylbutyl_ether.ct | 23 + .../Acyclic/ethyl_1,1,3-trimethylbutyl_ether.ct | 21 + datasets/Acyclic/ethyl_1-ethylpropyl_ether.ct | 17 + datasets/Acyclic/ethyl_1-methylbutyl_ether.ct | 17 + datasets/Acyclic/ethyl_2-methylbutyl_sulfide.ct | 17 + datasets/Acyclic/ethyl_butyl_ether.ct | 15 + datasets/Acyclic/ethyl_heptyl_ether.ct | 21 + datasets/Acyclic/ethyl_heptyl_sulfide.ct | 21 + datasets/Acyclic/ethyl_isobutyl_ether.ct | 15 + datasets/Acyclic/ethyl_isobutyl_sulfide.ct | 15 + datasets/Acyclic/ethyl_isopentyl_ether.ct | 17 + datasets/Acyclic/ethyl_isopentyl_sulfide.ct | 17 + datasets/Acyclic/ethyl_isopropyl_disulfide.ct | 15 + datasets/Acyclic/ethyl_isopropyl_ether.ct | 13 + datasets/Acyclic/ethyl_isopropyl_sulfide.ct | 13 + datasets/Acyclic/ethyl_methyl_disulfide.ct | 11 + datasets/Acyclic/ethyl_methyl_ether.ct | 9 + datasets/Acyclic/ethyl_methyl_peroxide.ct | 11 + datasets/Acyclic/ethyl_methyl_sulfide.ct | 9 + datasets/Acyclic/ethyl_octyl_ether.ct | 23 + datasets/Acyclic/ethyl_pentyl_ether.ct | 17 + datasets/Acyclic/ethyl_propyl_disulfide.ct | 15 + datasets/Acyclic/ethyl_propyl_ether.ct | 13 + datasets/Acyclic/ethyl_propyl_sulfide.ct | 13 + datasets/Acyclic/ethyl_sec-butyl_ether.ct | 15 + datasets/Acyclic/ethyl_tert-pentyl_ether.ct | 17 + datasets/Acyclic/ethylthiomethylthiomethane.ct | 13 + datasets/Acyclic/ft9949002015.pdf | Bin 0 -> 613095 bytes datasets/Acyclic/heptyl_methyl_ether.ct | 19 + datasets/Acyclic/heptyl_methyl_sulfide.ct | 19 + datasets/Acyclic/heptyl_propyl_ether.ct | 23 + datasets/Acyclic/hexyl_methyl_ether.ct | 17 + datasets/Acyclic/hexyl_methyl_sulfide.ct | 17 + .../Acyclic/isobutyl_4-methylpentyl_sulfide.ct | 23 + datasets/Acyclic/isobutyl_isopentyl_ether.ct | 21 + datasets/Acyclic/isobutyl_isopropyl_sulfide.ct | 17 + datasets/Acyclic/isobutyl_methyl_ether.ct | 13 + datasets/Acyclic/isobutyl_methyl_sulfide.ct | 13 + datasets/Acyclic/isobutyl_propyl_ether.ct | 17 + datasets/Acyclic/isobutyl_propyl_sulfide.ct | 17 + datasets/Acyclic/isobutyl_tert-butyl_ether.ct | 19 + datasets/Acyclic/isopentyl_methyl_ether.ct | 15 + datasets/Acyclic/isopentyl_methyl_sulfide.ct | 15 + datasets/Acyclic/isopentyl_pentyl_ether.ct | 23 + datasets/Acyclic/isopentyl_propyl_ether.ct | 19 + datasets/Acyclic/isopropyl_heptyl_ether.ct | 23 + datasets/Acyclic/isopropyl_methyl_ether.ct | 11 + datasets/Acyclic/isopropyl_methyl_peroxide.ct | 13 + datasets/Acyclic/isopropyl_methyl_sulfide.ct | 11 + datasets/Acyclic/isopropyl_propyl_disulfide.ct | 17 + datasets/Acyclic/isopropyl_propyl_ether.ct | 15 + datasets/Acyclic/isopropyl_propyl_sulfide.ct | 15 + datasets/Acyclic/isopropyl_tert-pentyl_ether.ct | 19 + .../Acyclic/methyl_1,1,4-trimethylpentyl_ether.ct | 21 + datasets/Acyclic/methyl_1-methylbutyl_ether.ct | 15 + datasets/Acyclic/methyl_1-methylheptyl_ether.ct | 21 + datasets/Acyclic/methyl_1-methyloctyl_ether.ct | 23 + datasets/Acyclic/methyl_2-methylbutyl_ether.ct | 15 + datasets/Acyclic/methyl_2-methylbutyl_sulfide.ct | 15 + datasets/Acyclic/methyl_nonyl_sulfide.ct | 23 + datasets/Acyclic/methyl_octyl_ether.ct | 21 + datasets/Acyclic/methyl_octyl_sulfide.ct | 21 + datasets/Acyclic/methyl_pentyl_ether.ct | 15 + datasets/Acyclic/methyl_pentyl_sulfide.ct | 15 + datasets/Acyclic/methyl_propyl_ether.ct | 11 + datasets/Acyclic/methyl_propyl_sulfide.ct | 11 + datasets/Acyclic/methyl_tert-pentyl_ether.ct | 15 + datasets/Acyclic/readme.md | 6 + datasets/Acyclic/sec-butyl_ethyl_disulfide.ct | 17 + datasets/Acyclic/sec-butyl_ethyl_sulfide.ct | 15 + datasets/Acyclic/sec-butyl_isobutyl_ether.ct | 19 + datasets/Acyclic/sec-butyl_isobutyl_sulfide.ct | 19 + datasets/Acyclic/sec-butyl_isopropyl_sulfide.ct | 17 + datasets/Acyclic/sec-butyl_methyl_ether.ct | 13 + datasets/Acyclic/tert-butyl_ethyl_disulfide.ct | 17 + datasets/Acyclic/tert-butyl_ethyl_sulfide.ct | 15 + datasets/Acyclic/tert-butyl_isopentyl_ether.ct | 21 + datasets/Acyclic/tert-butyl_isopropyl_ether.ct | 17 + datasets/Acyclic/tert-butyl_methyl_ether.ct | 13 + datasets/Acyclic/tert-butyl_methyl_sulfide.ct | 13 + datasets/Acyclic/tert-butyl_propyl_ether.ct | 17 + datasets/Acyclic/tert-butyl_propyl_sulfide.ct | 17 + .../Acyclic/tert-butyl_tert-pentyl_peroxide.ct | 23 + datasets/Acyclic/testset_0.ds | 19 + datasets/Acyclic/testset_1.ds | 19 + datasets/Acyclic/testset_2.ds | 19 + datasets/Acyclic/testset_3.ds | 18 + datasets/Acyclic/testset_4.ds | 18 + datasets/Acyclic/testset_5.ds | 18 + datasets/Acyclic/testset_6.ds | 18 + datasets/Acyclic/testset_7.ds | 18 + datasets/Acyclic/testset_8.ds | 18 + datasets/Acyclic/testset_9.ds | 18 + datasets/Acyclic/trainset_0.ds | 164 ++ datasets/Acyclic/trainset_1.ds | 164 ++ datasets/Acyclic/trainset_2.ds | 164 ++ datasets/Acyclic/trainset_3.ds | 165 ++ datasets/Acyclic/trainset_4.ds | 165 ++ datasets/Acyclic/trainset_5.ds | 165 ++ datasets/Acyclic/trainset_6.ds | 165 ++ datasets/Acyclic/trainset_7.ds | 165 ++ datasets/Acyclic/trainset_8.ds | 165 ++ datasets/Acyclic/trainset_9.ds | 165 ++ datasets/Monoterpenoides/1.ct | 26 + datasets/Monoterpenoides/1.gxl | 79 + datasets/Monoterpenoides/10.ct | 25 + datasets/Monoterpenoides/10.gxl | 76 + datasets/Monoterpenoides/100.ct | 25 + datasets/Monoterpenoides/100.gxl | 76 + datasets/Monoterpenoides/101.ct | 24 + datasets/Monoterpenoides/101.gxl | 73 + datasets/Monoterpenoides/102.ct | 24 + datasets/Monoterpenoides/102.gxl | 73 + datasets/Monoterpenoides/103.ct | 22 + datasets/Monoterpenoides/103.gxl | 67 + datasets/Monoterpenoides/104.ct | 23 + datasets/Monoterpenoides/104.gxl | 70 + datasets/Monoterpenoides/105.ct | 25 + datasets/Monoterpenoides/105.gxl | 76 + datasets/Monoterpenoides/106.ct | 25 + datasets/Monoterpenoides/106.gxl | 76 + datasets/Monoterpenoides/107.ct | 25 + datasets/Monoterpenoides/107.gxl | 76 + datasets/Monoterpenoides/108.ct | 25 + datasets/Monoterpenoides/108.gxl | 76 + datasets/Monoterpenoides/109.ct | 23 + datasets/Monoterpenoides/109.gxl | 70 + datasets/Monoterpenoides/11.ct | 25 + datasets/Monoterpenoides/11.gxl | 76 + datasets/Monoterpenoides/110.ct | 25 + datasets/Monoterpenoides/110.gxl | 76 + datasets/Monoterpenoides/111.ct | 25 + datasets/Monoterpenoides/111.gxl | 76 + datasets/Monoterpenoides/112.ct | 25 + datasets/Monoterpenoides/112.gxl | 76 + datasets/Monoterpenoides/113.ct | 26 + datasets/Monoterpenoides/113.gxl | 79 + datasets/Monoterpenoides/114.ct | 22 + datasets/Monoterpenoides/114.gxl | 67 + datasets/Monoterpenoides/115.ct | 22 + datasets/Monoterpenoides/115.gxl | 67 + datasets/Monoterpenoides/116.ct | 25 + datasets/Monoterpenoides/116.gxl | 76 + datasets/Monoterpenoides/117.ct | 27 + datasets/Monoterpenoides/117.gxl | 82 + datasets/Monoterpenoides/118.ct | 23 + datasets/Monoterpenoides/118.gxl | 70 + datasets/Monoterpenoides/119.ct | 23 + datasets/Monoterpenoides/119.gxl | 70 + datasets/Monoterpenoides/12.ct | 23 + datasets/Monoterpenoides/12.gxl | 70 + datasets/Monoterpenoides/120.ct | 25 + datasets/Monoterpenoides/120.gxl | 76 + datasets/Monoterpenoides/121.ct | 25 + datasets/Monoterpenoides/121.gxl | 76 + datasets/Monoterpenoides/122.ct | 23 + datasets/Monoterpenoides/122.gxl | 70 + datasets/Monoterpenoides/123.ct | 24 + datasets/Monoterpenoides/123.gxl | 73 + datasets/Monoterpenoides/124.ct | 24 + datasets/Monoterpenoides/124.gxl | 73 + datasets/Monoterpenoides/125.ct | 25 + datasets/Monoterpenoides/125.gxl | 76 + datasets/Monoterpenoides/126.ct | 25 + datasets/Monoterpenoides/126.gxl | 76 + datasets/Monoterpenoides/127.ct | 25 + datasets/Monoterpenoides/127.gxl | 76 + datasets/Monoterpenoides/128.ct | 24 + datasets/Monoterpenoides/128.gxl | 73 + datasets/Monoterpenoides/129.ct | 25 + datasets/Monoterpenoides/129.gxl | 76 + datasets/Monoterpenoides/13.ct | 25 + datasets/Monoterpenoides/13.gxl | 76 + datasets/Monoterpenoides/130.ct | 25 + datasets/Monoterpenoides/130.gxl | 76 + datasets/Monoterpenoides/131.ct | 25 + datasets/Monoterpenoides/131.gxl | 76 + datasets/Monoterpenoides/132.ct | 23 + datasets/Monoterpenoides/132.gxl | 70 + datasets/Monoterpenoides/133.ct | 21 + datasets/Monoterpenoides/133.gxl | 64 + datasets/Monoterpenoides/134.ct | 24 + datasets/Monoterpenoides/134.gxl | 73 + datasets/Monoterpenoides/135.ct | 25 + datasets/Monoterpenoides/135.gxl | 76 + datasets/Monoterpenoides/136.ct | 23 + datasets/Monoterpenoides/136.gxl | 70 + datasets/Monoterpenoides/137.ct | 23 + datasets/Monoterpenoides/137.gxl | 70 + datasets/Monoterpenoides/138.ct | 23 + datasets/Monoterpenoides/138.gxl | 70 + datasets/Monoterpenoides/139.ct | 23 + datasets/Monoterpenoides/139.gxl | 70 + datasets/Monoterpenoides/14.ct | 25 + datasets/Monoterpenoides/14.gxl | 76 + datasets/Monoterpenoides/140.ct | 23 + datasets/Monoterpenoides/140.gxl | 70 + datasets/Monoterpenoides/141.ct | 24 + datasets/Monoterpenoides/141.gxl | 73 + datasets/Monoterpenoides/142.ct | 26 + datasets/Monoterpenoides/142.gxl | 79 + datasets/Monoterpenoides/143.ct | 30 + datasets/Monoterpenoides/143.gxl | 91 + datasets/Monoterpenoides/144.ct | 25 + datasets/Monoterpenoides/144.gxl | 76 + datasets/Monoterpenoides/145.ct | 23 + datasets/Monoterpenoides/145.gxl | 70 + datasets/Monoterpenoides/146.ct | 23 + datasets/Monoterpenoides/146.gxl | 70 + datasets/Monoterpenoides/147.ct | 21 + datasets/Monoterpenoides/147.gxl | 64 + datasets/Monoterpenoides/148.ct | 27 + datasets/Monoterpenoides/148.gxl | 82 + datasets/Monoterpenoides/149.ct | 25 + datasets/Monoterpenoides/149.gxl | 76 + datasets/Monoterpenoides/15.ct | 25 + datasets/Monoterpenoides/15.gxl | 76 + datasets/Monoterpenoides/150.ct | 25 + datasets/Monoterpenoides/150.gxl | 76 + datasets/Monoterpenoides/151.ct | 23 + datasets/Monoterpenoides/151.gxl | 70 + datasets/Monoterpenoides/152.ct | 25 + datasets/Monoterpenoides/152.gxl | 76 + datasets/Monoterpenoides/153.ct | 25 + datasets/Monoterpenoides/153.gxl | 76 + datasets/Monoterpenoides/154.ct | 25 + datasets/Monoterpenoides/154.gxl | 76 + datasets/Monoterpenoides/155.ct | 25 + datasets/Monoterpenoides/155.gxl | 76 + datasets/Monoterpenoides/156.ct | 23 + datasets/Monoterpenoides/156.gxl | 70 + datasets/Monoterpenoides/157.ct | 23 + datasets/Monoterpenoides/157.gxl | 70 + datasets/Monoterpenoides/158.ct | 23 + datasets/Monoterpenoides/158.gxl | 70 + datasets/Monoterpenoides/159.ct | 25 + datasets/Monoterpenoides/159.gxl | 76 + datasets/Monoterpenoides/16.ct | 23 + datasets/Monoterpenoides/16.gxl | 70 + datasets/Monoterpenoides/160.ct | 25 + datasets/Monoterpenoides/160.gxl | 76 + datasets/Monoterpenoides/161.ct | 23 + datasets/Monoterpenoides/161.gxl | 70 + datasets/Monoterpenoides/162.ct | 23 + datasets/Monoterpenoides/162.gxl | 70 + datasets/Monoterpenoides/163.ct | 25 + datasets/Monoterpenoides/163.gxl | 76 + datasets/Monoterpenoides/164.ct | 25 + datasets/Monoterpenoides/164.gxl | 76 + datasets/Monoterpenoides/165.ct | 25 + datasets/Monoterpenoides/165.gxl | 76 + datasets/Monoterpenoides/166.ct | 25 + datasets/Monoterpenoides/166.gxl | 76 + datasets/Monoterpenoides/167.ct | 23 + datasets/Monoterpenoides/167.gxl | 70 + datasets/Monoterpenoides/168.ct | 22 + datasets/Monoterpenoides/168.gxl | 67 + datasets/Monoterpenoides/169.ct | 24 + datasets/Monoterpenoides/169.gxl | 73 + datasets/Monoterpenoides/17.ct | 23 + datasets/Monoterpenoides/17.gxl | 70 + datasets/Monoterpenoides/170.ct | 26 + datasets/Monoterpenoides/170.gxl | 79 + datasets/Monoterpenoides/171.ct | 24 + datasets/Monoterpenoides/171.gxl | 73 + datasets/Monoterpenoides/172.ct | 24 + datasets/Monoterpenoides/172.gxl | 73 + datasets/Monoterpenoides/173.ct | 23 + datasets/Monoterpenoides/173.gxl | 70 + datasets/Monoterpenoides/174.ct | 25 + datasets/Monoterpenoides/174.gxl | 76 + datasets/Monoterpenoides/175.ct | 25 + datasets/Monoterpenoides/175.gxl | 76 + datasets/Monoterpenoides/176.ct | 25 + datasets/Monoterpenoides/176.gxl | 76 + datasets/Monoterpenoides/177.ct | 25 + datasets/Monoterpenoides/177.gxl | 76 + datasets/Monoterpenoides/178.ct | 25 + datasets/Monoterpenoides/178.gxl | 76 + datasets/Monoterpenoides/179.ct | 29 + datasets/Monoterpenoides/179.gxl | 88 + datasets/Monoterpenoides/18.ct | 23 + datasets/Monoterpenoides/18.gxl | 70 + datasets/Monoterpenoides/180.ct | 24 + datasets/Monoterpenoides/180.gxl | 73 + datasets/Monoterpenoides/181.ct | 25 + datasets/Monoterpenoides/181.gxl | 76 + datasets/Monoterpenoides/182.ct | 24 + datasets/Monoterpenoides/182.gxl | 73 + datasets/Monoterpenoides/183.ct | 23 + datasets/Monoterpenoides/183.gxl | 70 + datasets/Monoterpenoides/184.ct | 23 + datasets/Monoterpenoides/184.gxl | 70 + datasets/Monoterpenoides/185.ct | 25 + datasets/Monoterpenoides/185.gxl | 76 + datasets/Monoterpenoides/186.ct | 25 + datasets/Monoterpenoides/186.gxl | 76 + datasets/Monoterpenoides/187.ct | 25 + datasets/Monoterpenoides/187.gxl | 76 + datasets/Monoterpenoides/188.ct | 25 + datasets/Monoterpenoides/188.gxl | 76 + datasets/Monoterpenoides/189.ct | 26 + datasets/Monoterpenoides/189.gxl | 79 + datasets/Monoterpenoides/19.ct | 23 + datasets/Monoterpenoides/19.gxl | 70 + datasets/Monoterpenoides/190.ct | 24 + datasets/Monoterpenoides/190.gxl | 73 + datasets/Monoterpenoides/191.ct | 24 + datasets/Monoterpenoides/191.gxl | 73 + datasets/Monoterpenoides/192.ct | 27 + datasets/Monoterpenoides/192.gxl | 82 + datasets/Monoterpenoides/193.ct | 25 + datasets/Monoterpenoides/193.gxl | 76 + datasets/Monoterpenoides/194.ct | 25 + datasets/Monoterpenoides/194.gxl | 76 + datasets/Monoterpenoides/195.ct | 23 + datasets/Monoterpenoides/195.gxl | 70 + datasets/Monoterpenoides/196.ct | 23 + datasets/Monoterpenoides/196.gxl | 70 + datasets/Monoterpenoides/197.ct | 24 + datasets/Monoterpenoides/197.gxl | 73 + datasets/Monoterpenoides/198.ct | 23 + datasets/Monoterpenoides/198.gxl | 70 + datasets/Monoterpenoides/199.ct | 23 + datasets/Monoterpenoides/199.gxl | 70 + datasets/Monoterpenoides/2.ct | 26 + datasets/Monoterpenoides/2.gxl | 79 + datasets/Monoterpenoides/20.ct | 21 + datasets/Monoterpenoides/20.gxl | 64 + datasets/Monoterpenoides/200.ct | 23 + datasets/Monoterpenoides/200.gxl | 70 + datasets/Monoterpenoides/201.ct | 25 + datasets/Monoterpenoides/201.gxl | 76 + datasets/Monoterpenoides/202.ct | 25 + datasets/Monoterpenoides/202.gxl | 76 + datasets/Monoterpenoides/203.ct | 25 + datasets/Monoterpenoides/203.gxl | 76 + datasets/Monoterpenoides/204.ct | 25 + datasets/Monoterpenoides/204.gxl | 76 + datasets/Monoterpenoides/205.ct | 24 + datasets/Monoterpenoides/205.gxl | 73 + datasets/Monoterpenoides/206.ct | 23 + datasets/Monoterpenoides/206.gxl | 70 + datasets/Monoterpenoides/207.ct | 23 + datasets/Monoterpenoides/207.gxl | 70 + datasets/Monoterpenoides/208.ct | 23 + datasets/Monoterpenoides/208.gxl | 70 + datasets/Monoterpenoides/209.ct | 23 + datasets/Monoterpenoides/209.gxl | 70 + datasets/Monoterpenoides/21.ct | 23 + datasets/Monoterpenoides/21.gxl | 70 + datasets/Monoterpenoides/210.ct | 23 + datasets/Monoterpenoides/210.gxl | 70 + datasets/Monoterpenoides/211.ct | 23 + datasets/Monoterpenoides/211.gxl | 70 + datasets/Monoterpenoides/212.ct | 24 + datasets/Monoterpenoides/212.gxl | 73 + datasets/Monoterpenoides/213.ct | 26 + datasets/Monoterpenoides/213.gxl | 79 + datasets/Monoterpenoides/214.ct | 26 + datasets/Monoterpenoides/214.gxl | 79 + datasets/Monoterpenoides/215.ct | 26 + datasets/Monoterpenoides/215.gxl | 79 + datasets/Monoterpenoides/216.ct | 25 + datasets/Monoterpenoides/216.gxl | 76 + datasets/Monoterpenoides/217.ct | 25 + datasets/Monoterpenoides/217.gxl | 76 + datasets/Monoterpenoides/218.ct | 25 + datasets/Monoterpenoides/218.gxl | 76 + datasets/Monoterpenoides/219.ct | 25 + datasets/Monoterpenoides/219.gxl | 76 + datasets/Monoterpenoides/22.ct | 23 + datasets/Monoterpenoides/22.gxl | 70 + datasets/Monoterpenoides/220.ct | 24 + datasets/Monoterpenoides/220.gxl | 73 + datasets/Monoterpenoides/221.ct | 25 + datasets/Monoterpenoides/221.gxl | 76 + datasets/Monoterpenoides/222.ct | 26 + datasets/Monoterpenoides/222.gxl | 79 + datasets/Monoterpenoides/223.ct | 24 + datasets/Monoterpenoides/223.gxl | 73 + datasets/Monoterpenoides/224.ct | 25 + datasets/Monoterpenoides/224.gxl | 76 + datasets/Monoterpenoides/225.ct | 26 + datasets/Monoterpenoides/225.gxl | 79 + datasets/Monoterpenoides/226.ct | 24 + datasets/Monoterpenoides/226.gxl | 73 + datasets/Monoterpenoides/227.ct | 24 + datasets/Monoterpenoides/227.gxl | 73 + datasets/Monoterpenoides/228.ct | 24 + datasets/Monoterpenoides/228.gxl | 73 + datasets/Monoterpenoides/229.ct | 24 + datasets/Monoterpenoides/229.gxl | 73 + datasets/Monoterpenoides/23.ct | 21 + datasets/Monoterpenoides/23.gxl | 64 + datasets/Monoterpenoides/230.ct | 24 + datasets/Monoterpenoides/230.gxl | 73 + datasets/Monoterpenoides/231.ct | 24 + datasets/Monoterpenoides/231.gxl | 73 + datasets/Monoterpenoides/232.ct | 24 + datasets/Monoterpenoides/232.gxl | 73 + datasets/Monoterpenoides/233.ct | 24 + datasets/Monoterpenoides/233.gxl | 73 + datasets/Monoterpenoides/234.ct | 24 + datasets/Monoterpenoides/234.gxl | 73 + datasets/Monoterpenoides/235.ct | 24 + datasets/Monoterpenoides/235.gxl | 73 + datasets/Monoterpenoides/236.ct | 24 + datasets/Monoterpenoides/236.gxl | 73 + datasets/Monoterpenoides/237.ct | 24 + datasets/Monoterpenoides/237.gxl | 73 + datasets/Monoterpenoides/238.ct | 24 + datasets/Monoterpenoides/238.gxl | 73 + datasets/Monoterpenoides/239.ct | 24 + datasets/Monoterpenoides/239.gxl | 73 + datasets/Monoterpenoides/24.ct | 23 + datasets/Monoterpenoides/24.gxl | 70 + datasets/Monoterpenoides/240.ct | 24 + datasets/Monoterpenoides/240.gxl | 73 + datasets/Monoterpenoides/241.ct | 24 + datasets/Monoterpenoides/241.gxl | 73 + datasets/Monoterpenoides/242.ct | 22 + datasets/Monoterpenoides/242.gxl | 67 + datasets/Monoterpenoides/243.ct | 24 + datasets/Monoterpenoides/243.gxl | 73 + datasets/Monoterpenoides/244.ct | 24 + datasets/Monoterpenoides/244.gxl | 73 + datasets/Monoterpenoides/245.ct | 24 + datasets/Monoterpenoides/245.gxl | 73 + datasets/Monoterpenoides/246.ct | 24 + datasets/Monoterpenoides/246.gxl | 73 + datasets/Monoterpenoides/247.ct | 24 + datasets/Monoterpenoides/247.gxl | 73 + datasets/Monoterpenoides/248.ct | 24 + datasets/Monoterpenoides/248.gxl | 73 + datasets/Monoterpenoides/249.ct | 24 + datasets/Monoterpenoides/249.gxl | 73 + datasets/Monoterpenoides/25.ct | 23 + datasets/Monoterpenoides/25.gxl | 70 + datasets/Monoterpenoides/250.ct | 24 + datasets/Monoterpenoides/250.gxl | 73 + datasets/Monoterpenoides/251.ct | 22 + datasets/Monoterpenoides/251.gxl | 67 + datasets/Monoterpenoides/252.ct | 24 + datasets/Monoterpenoides/252.gxl | 73 + datasets/Monoterpenoides/253.ct | 24 + datasets/Monoterpenoides/253.gxl | 73 + datasets/Monoterpenoides/254.ct | 22 + datasets/Monoterpenoides/254.gxl | 67 + datasets/Monoterpenoides/255.ct | 22 + datasets/Monoterpenoides/255.gxl | 67 + datasets/Monoterpenoides/256.ct | 24 + datasets/Monoterpenoides/256.gxl | 73 + datasets/Monoterpenoides/257.ct | 25 + datasets/Monoterpenoides/257.gxl | 76 + datasets/Monoterpenoides/258.ct | 25 + datasets/Monoterpenoides/258.gxl | 76 + datasets/Monoterpenoides/259.ct | 24 + datasets/Monoterpenoides/259.gxl | 73 + datasets/Monoterpenoides/26.ct | 23 + datasets/Monoterpenoides/26.gxl | 70 + datasets/Monoterpenoides/260.ct | 22 + datasets/Monoterpenoides/260.gxl | 67 + datasets/Monoterpenoides/261.ct | 24 + datasets/Monoterpenoides/261.gxl | 73 + datasets/Monoterpenoides/262.ct | 26 + datasets/Monoterpenoides/262.gxl | 79 + datasets/Monoterpenoides/263.ct | 27 + datasets/Monoterpenoides/263.gxl | 82 + datasets/Monoterpenoides/264.ct | 24 + datasets/Monoterpenoides/264.gxl | 73 + datasets/Monoterpenoides/265.ct | 24 + datasets/Monoterpenoides/265.gxl | 73 + datasets/Monoterpenoides/266.ct | 22 + datasets/Monoterpenoides/266.gxl | 67 + datasets/Monoterpenoides/267.ct | 25 + datasets/Monoterpenoides/267.gxl | 76 + datasets/Monoterpenoides/268.ct | 26 + datasets/Monoterpenoides/268.gxl | 79 + datasets/Monoterpenoides/269.ct | 26 + datasets/Monoterpenoides/269.gxl | 79 + datasets/Monoterpenoides/27.ct | 23 + datasets/Monoterpenoides/27.gxl | 70 + datasets/Monoterpenoides/270.ct | 24 + datasets/Monoterpenoides/270.gxl | 73 + datasets/Monoterpenoides/271.ct | 22 + datasets/Monoterpenoides/271.gxl | 67 + datasets/Monoterpenoides/272.ct | 22 + datasets/Monoterpenoides/272.gxl | 67 + datasets/Monoterpenoides/273.ct | 22 + datasets/Monoterpenoides/273.gxl | 67 + datasets/Monoterpenoides/274.ct | 24 + datasets/Monoterpenoides/274.gxl | 73 + datasets/Monoterpenoides/275.ct | 24 + datasets/Monoterpenoides/275.gxl | 73 + datasets/Monoterpenoides/276.ct | 26 + datasets/Monoterpenoides/276.gxl | 79 + datasets/Monoterpenoides/277.ct | 26 + datasets/Monoterpenoides/277.gxl | 79 + datasets/Monoterpenoides/278.ct | 27 + datasets/Monoterpenoides/278.gxl | 82 + datasets/Monoterpenoides/279.ct | 24 + datasets/Monoterpenoides/279.gxl | 73 + datasets/Monoterpenoides/28.ct | 21 + datasets/Monoterpenoides/28.gxl | 64 + datasets/Monoterpenoides/280.ct | 24 + datasets/Monoterpenoides/280.gxl | 73 + datasets/Monoterpenoides/281.ct | 24 + datasets/Monoterpenoides/281.gxl | 73 + datasets/Monoterpenoides/282.ct | 22 + datasets/Monoterpenoides/282.gxl | 67 + datasets/Monoterpenoides/283.ct | 22 + datasets/Monoterpenoides/283.gxl | 67 + datasets/Monoterpenoides/284.ct | 24 + datasets/Monoterpenoides/284.gxl | 73 + datasets/Monoterpenoides/285.ct | 22 + datasets/Monoterpenoides/285.gxl | 67 + datasets/Monoterpenoides/286.ct | 22 + datasets/Monoterpenoides/286.gxl | 67 + datasets/Monoterpenoides/287.ct | 22 + datasets/Monoterpenoides/287.gxl | 67 + datasets/Monoterpenoides/288.ct | 22 + datasets/Monoterpenoides/288.gxl | 67 + datasets/Monoterpenoides/289.ct | 24 + datasets/Monoterpenoides/289.gxl | 73 + datasets/Monoterpenoides/29.ct | 21 + datasets/Monoterpenoides/29.gxl | 64 + datasets/Monoterpenoides/290.ct | 24 + datasets/Monoterpenoides/290.gxl | 73 + datasets/Monoterpenoides/291.ct | 24 + datasets/Monoterpenoides/291.gxl | 73 + datasets/Monoterpenoides/292.ct | 22 + datasets/Monoterpenoides/292.gxl | 67 + datasets/Monoterpenoides/293.ct | 26 + datasets/Monoterpenoides/293.gxl | 79 + datasets/Monoterpenoides/294.ct | 25 + datasets/Monoterpenoides/294.gxl | 76 + datasets/Monoterpenoides/295.ct | 24 + datasets/Monoterpenoides/295.gxl | 73 + datasets/Monoterpenoides/296.ct | 27 + datasets/Monoterpenoides/296.gxl | 82 + datasets/Monoterpenoides/297.ct | 25 + datasets/Monoterpenoides/297.gxl | 76 + datasets/Monoterpenoides/298.ct | 26 + datasets/Monoterpenoides/298.gxl | 79 + datasets/Monoterpenoides/299.ct | 24 + datasets/Monoterpenoides/299.gxl | 73 + datasets/Monoterpenoides/3.ct | 24 + datasets/Monoterpenoides/3.gxl | 73 + datasets/Monoterpenoides/30.ct | 23 + datasets/Monoterpenoides/30.gxl | 70 + datasets/Monoterpenoides/300.ct | 24 + datasets/Monoterpenoides/300.gxl | 73 + datasets/Monoterpenoides/301.ct | 22 + datasets/Monoterpenoides/301.gxl | 67 + datasets/Monoterpenoides/302.ct | 24 + datasets/Monoterpenoides/302.gxl | 73 + datasets/Monoterpenoides/31.ct | 21 + datasets/Monoterpenoides/31.gxl | 64 + datasets/Monoterpenoides/32.ct | 23 + datasets/Monoterpenoides/32.gxl | 70 + datasets/Monoterpenoides/33.ct | 23 + datasets/Monoterpenoides/33.gxl | 70 + datasets/Monoterpenoides/34.ct | 23 + datasets/Monoterpenoides/34.gxl | 70 + datasets/Monoterpenoides/35.ct | 23 + datasets/Monoterpenoides/35.gxl | 70 + datasets/Monoterpenoides/36.ct | 23 + datasets/Monoterpenoides/36.gxl | 70 + datasets/Monoterpenoides/37.ct | 23 + datasets/Monoterpenoides/37.gxl | 70 + datasets/Monoterpenoides/38.ct | 23 + datasets/Monoterpenoides/38.gxl | 70 + datasets/Monoterpenoides/39.ct | 21 + datasets/Monoterpenoides/39.gxl | 64 + datasets/Monoterpenoides/4.ct | 24 + datasets/Monoterpenoides/4.gxl | 73 + datasets/Monoterpenoides/40.ct | 21 + datasets/Monoterpenoides/40.gxl | 64 + datasets/Monoterpenoides/41.ct | 23 + datasets/Monoterpenoides/41.gxl | 70 + datasets/Monoterpenoides/42.ct | 23 + datasets/Monoterpenoides/42.gxl | 70 + datasets/Monoterpenoides/43.ct | 23 + datasets/Monoterpenoides/43.gxl | 70 + datasets/Monoterpenoides/44.ct | 23 + datasets/Monoterpenoides/44.gxl | 70 + datasets/Monoterpenoides/45.ct | 23 + datasets/Monoterpenoides/45.gxl | 70 + datasets/Monoterpenoides/46.ct | 23 + datasets/Monoterpenoides/46.gxl | 70 + datasets/Monoterpenoides/47.ct | 23 + datasets/Monoterpenoides/47.gxl | 70 + datasets/Monoterpenoides/48.ct | 21 + datasets/Monoterpenoides/48.gxl | 64 + datasets/Monoterpenoides/49.ct | 25 + datasets/Monoterpenoides/49.gxl | 76 + datasets/Monoterpenoides/5.ct | 26 + datasets/Monoterpenoides/5.gxl | 79 + datasets/Monoterpenoides/50.ct | 25 + datasets/Monoterpenoides/50.gxl | 76 + datasets/Monoterpenoides/51.ct | 27 + datasets/Monoterpenoides/51.gxl | 82 + datasets/Monoterpenoides/52.ct | 25 + datasets/Monoterpenoides/52.gxl | 76 + datasets/Monoterpenoides/53.ct | 23 + datasets/Monoterpenoides/53.gxl | 70 + datasets/Monoterpenoides/54.ct | 24 + datasets/Monoterpenoides/54.gxl | 73 + datasets/Monoterpenoides/55.ct | 24 + datasets/Monoterpenoides/55.gxl | 73 + datasets/Monoterpenoides/56.ct | 25 + datasets/Monoterpenoides/56.gxl | 76 + datasets/Monoterpenoides/57.ct | 25 + datasets/Monoterpenoides/57.gxl | 76 + datasets/Monoterpenoides/58.ct | 23 + datasets/Monoterpenoides/58.gxl | 70 + datasets/Monoterpenoides/59.ct | 23 + datasets/Monoterpenoides/59.gxl | 70 + datasets/Monoterpenoides/6.ct | 23 + datasets/Monoterpenoides/6.gxl | 70 + datasets/Monoterpenoides/60.ct | 26 + datasets/Monoterpenoides/60.gxl | 79 + datasets/Monoterpenoides/61.ct | 25 + datasets/Monoterpenoides/61.gxl | 76 + datasets/Monoterpenoides/62.ct | 24 + datasets/Monoterpenoides/62.gxl | 73 + datasets/Monoterpenoides/63.ct | 24 + datasets/Monoterpenoides/63.gxl | 73 + datasets/Monoterpenoides/64.ct | 24 + datasets/Monoterpenoides/64.gxl | 73 + datasets/Monoterpenoides/65.ct | 26 + datasets/Monoterpenoides/65.gxl | 79 + datasets/Monoterpenoides/66.ct | 25 + datasets/Monoterpenoides/66.gxl | 76 + datasets/Monoterpenoides/67.ct | 23 + datasets/Monoterpenoides/67.gxl | 70 + datasets/Monoterpenoides/68.ct | 25 + datasets/Monoterpenoides/68.gxl | 76 + datasets/Monoterpenoides/69.ct | 23 + datasets/Monoterpenoides/69.gxl | 70 + datasets/Monoterpenoides/7.ct | 24 + datasets/Monoterpenoides/7.gxl | 73 + datasets/Monoterpenoides/70.ct | 26 + datasets/Monoterpenoides/70.gxl | 79 + datasets/Monoterpenoides/71.ct | 24 + datasets/Monoterpenoides/71.gxl | 73 + datasets/Monoterpenoides/72.ct | 24 + datasets/Monoterpenoides/72.gxl | 73 + datasets/Monoterpenoides/73.ct | 26 + datasets/Monoterpenoides/73.gxl | 79 + datasets/Monoterpenoides/74.ct | 24 + datasets/Monoterpenoides/74.gxl | 73 + datasets/Monoterpenoides/75.ct | 24 + datasets/Monoterpenoides/75.gxl | 73 + datasets/Monoterpenoides/76.ct | 23 + datasets/Monoterpenoides/76.gxl | 70 + datasets/Monoterpenoides/77.ct | 26 + datasets/Monoterpenoides/77.gxl | 79 + datasets/Monoterpenoides/78.ct | 24 + datasets/Monoterpenoides/78.gxl | 73 + datasets/Monoterpenoides/79.ct | 26 + datasets/Monoterpenoides/79.gxl | 79 + datasets/Monoterpenoides/8.ct | 26 + datasets/Monoterpenoides/8.gxl | 79 + datasets/Monoterpenoides/80.ct | 26 + datasets/Monoterpenoides/80.gxl | 79 + datasets/Monoterpenoides/81.ct | 24 + datasets/Monoterpenoides/81.gxl | 73 + datasets/Monoterpenoides/82.ct | 25 + datasets/Monoterpenoides/82.gxl | 76 + datasets/Monoterpenoides/83.ct | 26 + datasets/Monoterpenoides/83.gxl | 79 + datasets/Monoterpenoides/84.ct | 24 + datasets/Monoterpenoides/84.gxl | 73 + datasets/Monoterpenoides/85.ct | 26 + datasets/Monoterpenoides/85.gxl | 79 + datasets/Monoterpenoides/86.ct | 26 + datasets/Monoterpenoides/86.gxl | 79 + datasets/Monoterpenoides/87.ct | 24 + datasets/Monoterpenoides/87.gxl | 73 + datasets/Monoterpenoides/88.ct | 25 + datasets/Monoterpenoides/88.gxl | 76 + datasets/Monoterpenoides/89.ct | 25 + datasets/Monoterpenoides/89.gxl | 76 + datasets/Monoterpenoides/9.ct | 26 + datasets/Monoterpenoides/9.gxl | 79 + datasets/Monoterpenoides/90.ct | 25 + datasets/Monoterpenoides/90.gxl | 76 + datasets/Monoterpenoides/91.ct | 24 + datasets/Monoterpenoides/91.gxl | 73 + datasets/Monoterpenoides/92.ct | 25 + datasets/Monoterpenoides/92.gxl | 76 + datasets/Monoterpenoides/93.ct | 25 + datasets/Monoterpenoides/93.gxl | 76 + datasets/Monoterpenoides/94.ct | 23 + datasets/Monoterpenoides/94.gxl | 70 + datasets/Monoterpenoides/95.ct | 24 + datasets/Monoterpenoides/95.gxl | 73 + datasets/Monoterpenoides/96.ct | 24 + datasets/Monoterpenoides/96.gxl | 73 + datasets/Monoterpenoides/97.ct | 22 + datasets/Monoterpenoides/97.gxl | 67 + datasets/Monoterpenoides/98.ct | 24 + datasets/Monoterpenoides/98.gxl | 73 + datasets/Monoterpenoides/99.ct | 22 + datasets/Monoterpenoides/99.gxl | 67 + datasets/Monoterpenoides/classe.txt | 11 + datasets/Monoterpenoides/dataset.ds | 303 +++ datasets/Monoterpenoides/dataset_10+.ds | 286 ++ datasets/Monoterpenoides/dataset_9.ds | 212 ++ datasets/Monoterpenoides/monoterpenoides.tar.gz | Bin 0 -> 59153 bytes datasets/Monoterpenoides/monoterpenoides_gxl.tgz | Bin 0 -> 11633 bytes datasets/Monoterpenoides/trainset_9.ds | 73 + 823 files changed, 38410 insertions(+) create mode 100644 datasets/Acyclic/1,1-bis(ethylthio)ethane.ct create mode 100644 datasets/Acyclic/1,1-bis(isopropylthio)ethane.ct create mode 100644 datasets/Acyclic/1,1-bis(methylthio)ethane.ct create mode 100644 datasets/Acyclic/1,1-diethoxyethane.ct create mode 100644 datasets/Acyclic/1,1-diethoxypentane.ct create mode 100644 datasets/Acyclic/1,1-diethoxypropane.ct create mode 100644 datasets/Acyclic/1,1-diisopropoxyethane.ct create mode 100644 datasets/Acyclic/1,1-diisopropoxypropane.ct create mode 100644 datasets/Acyclic/1,1-dimethoxy-2,2-dimethylpentane.ct create mode 100644 datasets/Acyclic/1,1-dimethoxy-2-methylpropane.ct create mode 100644 datasets/Acyclic/1,1-dimethoxybutane.ct create mode 100644 datasets/Acyclic/1,1-dimethoxyethane.ct create mode 100644 datasets/Acyclic/1,1-dimethoxyhexane.ct create mode 100644 datasets/Acyclic/1,1-dipropoxyethane.ct create mode 100644 datasets/Acyclic/1,1-dipropoxypropane.ct create mode 100644 datasets/Acyclic/1,2-bis(ethylthio)ethane.ct create mode 100644 datasets/Acyclic/1,2-bis(methylthio)ethane.ct create mode 100644 datasets/Acyclic/1,2-diethoxyethane.ct create mode 100644 datasets/Acyclic/1,2-dimethoxyethane.ct create mode 100644 datasets/Acyclic/1,2-dimethoxypropane.ct create mode 100644 datasets/Acyclic/1,2-dimethylpropyl_ethyl_ether.ct create mode 100644 datasets/Acyclic/1,2-dimethylpropyl_methyl_ether.ct create mode 100644 datasets/Acyclic/1,3-bis(ethylthio)propane.ct create mode 100644 datasets/Acyclic/1,3-diethoxypropane.ct create mode 100644 datasets/Acyclic/1,3-diisopropoxypropane.ct create mode 100644 datasets/Acyclic/1,3-dimethoxybutane.ct create mode 100644 datasets/Acyclic/1,3-dimethoxypentane.ct create mode 100644 datasets/Acyclic/1,3-dimethoxypropane.ct create mode 100644 datasets/Acyclic/1,3-dimethylpentyl_methyl_ether.ct create mode 100644 datasets/Acyclic/1,3-dipropoxypropane.ct create mode 100644 datasets/Acyclic/1,4-diethoxybutane.ct create mode 100644 datasets/Acyclic/1,4-dimethoxybutane.ct create mode 100644 datasets/Acyclic/1,4-dimethoxypentane.ct create mode 100644 datasets/Acyclic/1,5-dimethoxypentane.ct create mode 100644 datasets/Acyclic/1,5-dimethylhexyl_methyl_ether.ct create mode 100644 datasets/Acyclic/1-butyl-propane-2-ol.ct create mode 100644 datasets/Acyclic/1-ethoxy-1-propoxyethane.ct create mode 100644 datasets/Acyclic/1-ethoxy-2-methoxyethane.ct create mode 100644 datasets/Acyclic/1-ethoxy-4-methoxybutane.ct create mode 100644 datasets/Acyclic/1-ethyl-1,3-dimethylbutyl_methyl_ether.ct create mode 100644 datasets/Acyclic/1-ethylpropyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/1-ethylpropyl_propyl_ether.ct create mode 100644 datasets/Acyclic/1-methoxy-1-propoxyethane.ct create mode 100644 datasets/Acyclic/2,2-bis(propylthio)propane.ct create mode 100644 datasets/Acyclic/2,2-diethoxypropane.ct create mode 100644 datasets/Acyclic/2,2-dimethoxypropane.ct create mode 100644 datasets/Acyclic/2,2-dimethylpropyl_ethyl_ether.ct create mode 100644 datasets/Acyclic/2,4-dimethoxy-2-methylpentane.ct create mode 100644 datasets/Acyclic/2-ethoxy-2-methoxypropane.ct create mode 100644 datasets/Acyclic/2-ethylhexyl_methyl_ether.ct create mode 100644 datasets/Acyclic/3,5-dimethylhexyl_methyl_ether.ct create mode 100644 datasets/Acyclic/Acyclic.tar.gz create mode 100644 datasets/Acyclic/bis(1-ethylpropyl)_ether.ct create mode 100644 datasets/Acyclic/bis(1-methylbutyl)_ether.ct create mode 100644 datasets/Acyclic/bis(butylthio)methane.ct create mode 100644 datasets/Acyclic/bis(ethylthio)methane.ct create mode 100644 datasets/Acyclic/bis(methylthio)methane.ct create mode 100644 datasets/Acyclic/butyl_ethyl_sulfide.ct create mode 100644 datasets/Acyclic/butyl_isobutyl_ether.ct create mode 100644 datasets/Acyclic/butyl_isobutyl_sulfide.ct create mode 100644 datasets/Acyclic/butyl_isopentyl_ether.ct create mode 100644 datasets/Acyclic/butyl_isopropyl_ether.ct create mode 100644 datasets/Acyclic/butyl_isopropyl_sulfide.ct create mode 100644 datasets/Acyclic/butyl_methyl_ether.ct create mode 100644 datasets/Acyclic/butyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/butyl_pentyl_ether.ct create mode 100644 datasets/Acyclic/butyl_propyl_ether.ct create mode 100644 datasets/Acyclic/butyl_propyl_sulfide.ct create mode 100644 datasets/Acyclic/butyl_sec-butyl_ether.ct create mode 100644 datasets/Acyclic/butyl_sec-butyl_sulfide.ct create mode 100644 datasets/Acyclic/butyl_tert-butyl_ether.ct create mode 100644 datasets/Acyclic/ci00007a011.pdf create mode 100644 datasets/Acyclic/dataset_bps.ds create mode 100644 datasets/Acyclic/dataset_bps_old.ds create mode 100644 datasets/Acyclic/di-sec-butyl_sulfide.ct create mode 100644 datasets/Acyclic/di-tert-butyl_disulfide.ct create mode 100644 datasets/Acyclic/di-tert-butyl_ether.ct create mode 100644 datasets/Acyclic/di-tert-butyl_peroxide.ct create mode 100644 datasets/Acyclic/di-tert-butyl_sulfide.ct create mode 100644 datasets/Acyclic/di-tert-pentyl_sulfide.ct create mode 100644 datasets/Acyclic/dibutyl_disulfide.ct create mode 100644 datasets/Acyclic/dibutyl_ether.ct create mode 100644 datasets/Acyclic/dibutylsulfide.ct create mode 100644 datasets/Acyclic/diethoxymethane.ct create mode 100644 datasets/Acyclic/diethyl_disulfide.ct create mode 100644 datasets/Acyclic/diethyl_ether.ct create mode 100644 datasets/Acyclic/diethyl_peroxide.ct create mode 100644 datasets/Acyclic/diethyl_sulfide.ct create mode 100644 datasets/Acyclic/diisobutyl_disulfide.ct create mode 100644 datasets/Acyclic/diisobutyl_ether.ct create mode 100644 datasets/Acyclic/diisobutyl_sulfide.ct create mode 100644 datasets/Acyclic/diisopentyl_ether.ct create mode 100644 datasets/Acyclic/diisopentyl_sulfide.ct create mode 100644 datasets/Acyclic/diisopropyl_disulfide.ct create mode 100644 datasets/Acyclic/diisopropyl_ether.ct create mode 100644 datasets/Acyclic/diisopropyl_sulfide.ct create mode 100644 datasets/Acyclic/dimethoxymethane.ct create mode 100644 datasets/Acyclic/dimethyl_disulfide.ct create mode 100644 datasets/Acyclic/dimethyl_ether.ct create mode 100644 datasets/Acyclic/dimethyl_peroxide.ct create mode 100644 datasets/Acyclic/dimethyl_sulfide.ct create mode 100644 datasets/Acyclic/dipentyl_ether.ct create mode 100644 datasets/Acyclic/dipentyl_sulfide.ct create mode 100644 datasets/Acyclic/dipropoxymethane.ct create mode 100644 datasets/Acyclic/dipropyl_disulfide.ct create mode 100644 datasets/Acyclic/dipropyl_ether.ct create mode 100644 datasets/Acyclic/dipropyl_sulfide.ct create mode 100644 datasets/Acyclic/ethoxymethoxyethane.ct create mode 100644 datasets/Acyclic/ethyl_1,1,3,3-tetramethylbutyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_1,1,3-trimethylbutyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_1-ethylpropyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_1-methylbutyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_2-methylbutyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_butyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_heptyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_heptyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_isobutyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_isobutyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_isopentyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_isopentyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_isopropyl_disulfide.ct create mode 100644 datasets/Acyclic/ethyl_isopropyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_isopropyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_methyl_disulfide.ct create mode 100644 datasets/Acyclic/ethyl_methyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_methyl_peroxide.ct create mode 100644 datasets/Acyclic/ethyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_octyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_pentyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_propyl_disulfide.ct create mode 100644 datasets/Acyclic/ethyl_propyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_propyl_sulfide.ct create mode 100644 datasets/Acyclic/ethyl_sec-butyl_ether.ct create mode 100644 datasets/Acyclic/ethyl_tert-pentyl_ether.ct create mode 100644 datasets/Acyclic/ethylthiomethylthiomethane.ct create mode 100644 datasets/Acyclic/ft9949002015.pdf create mode 100644 datasets/Acyclic/heptyl_methyl_ether.ct create mode 100644 datasets/Acyclic/heptyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/heptyl_propyl_ether.ct create mode 100644 datasets/Acyclic/hexyl_methyl_ether.ct create mode 100644 datasets/Acyclic/hexyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/isobutyl_4-methylpentyl_sulfide.ct create mode 100644 datasets/Acyclic/isobutyl_isopentyl_ether.ct create mode 100644 datasets/Acyclic/isobutyl_isopropyl_sulfide.ct create mode 100644 datasets/Acyclic/isobutyl_methyl_ether.ct create mode 100644 datasets/Acyclic/isobutyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/isobutyl_propyl_ether.ct create mode 100644 datasets/Acyclic/isobutyl_propyl_sulfide.ct create mode 100644 datasets/Acyclic/isobutyl_tert-butyl_ether.ct create mode 100644 datasets/Acyclic/isopentyl_methyl_ether.ct create mode 100644 datasets/Acyclic/isopentyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/isopentyl_pentyl_ether.ct create mode 100644 datasets/Acyclic/isopentyl_propyl_ether.ct create mode 100644 datasets/Acyclic/isopropyl_heptyl_ether.ct create mode 100644 datasets/Acyclic/isopropyl_methyl_ether.ct create mode 100644 datasets/Acyclic/isopropyl_methyl_peroxide.ct create mode 100644 datasets/Acyclic/isopropyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/isopropyl_propyl_disulfide.ct create mode 100644 datasets/Acyclic/isopropyl_propyl_ether.ct create mode 100644 datasets/Acyclic/isopropyl_propyl_sulfide.ct create mode 100644 datasets/Acyclic/isopropyl_tert-pentyl_ether.ct create mode 100644 datasets/Acyclic/methyl_1,1,4-trimethylpentyl_ether.ct create mode 100644 datasets/Acyclic/methyl_1-methylbutyl_ether.ct create mode 100644 datasets/Acyclic/methyl_1-methylheptyl_ether.ct create mode 100644 datasets/Acyclic/methyl_1-methyloctyl_ether.ct create mode 100644 datasets/Acyclic/methyl_2-methylbutyl_ether.ct create mode 100644 datasets/Acyclic/methyl_2-methylbutyl_sulfide.ct create mode 100644 datasets/Acyclic/methyl_nonyl_sulfide.ct create mode 100644 datasets/Acyclic/methyl_octyl_ether.ct create mode 100644 datasets/Acyclic/methyl_octyl_sulfide.ct create mode 100644 datasets/Acyclic/methyl_pentyl_ether.ct create mode 100644 datasets/Acyclic/methyl_pentyl_sulfide.ct create mode 100644 datasets/Acyclic/methyl_propyl_ether.ct create mode 100644 datasets/Acyclic/methyl_propyl_sulfide.ct create mode 100644 datasets/Acyclic/methyl_tert-pentyl_ether.ct create mode 100644 datasets/Acyclic/readme.md create mode 100644 datasets/Acyclic/sec-butyl_ethyl_disulfide.ct create mode 100644 datasets/Acyclic/sec-butyl_ethyl_sulfide.ct create mode 100644 datasets/Acyclic/sec-butyl_isobutyl_ether.ct create mode 100644 datasets/Acyclic/sec-butyl_isobutyl_sulfide.ct create mode 100644 datasets/Acyclic/sec-butyl_isopropyl_sulfide.ct create mode 100644 datasets/Acyclic/sec-butyl_methyl_ether.ct create mode 100644 datasets/Acyclic/tert-butyl_ethyl_disulfide.ct create mode 100644 datasets/Acyclic/tert-butyl_ethyl_sulfide.ct create mode 100644 datasets/Acyclic/tert-butyl_isopentyl_ether.ct create mode 100644 datasets/Acyclic/tert-butyl_isopropyl_ether.ct create mode 100644 datasets/Acyclic/tert-butyl_methyl_ether.ct create mode 100644 datasets/Acyclic/tert-butyl_methyl_sulfide.ct create mode 100644 datasets/Acyclic/tert-butyl_propyl_ether.ct create mode 100644 datasets/Acyclic/tert-butyl_propyl_sulfide.ct create mode 100644 datasets/Acyclic/tert-butyl_tert-pentyl_peroxide.ct create mode 100644 datasets/Acyclic/testset_0.ds create mode 100644 datasets/Acyclic/testset_1.ds create mode 100644 datasets/Acyclic/testset_2.ds create mode 100644 datasets/Acyclic/testset_3.ds create mode 100644 datasets/Acyclic/testset_4.ds create mode 100644 datasets/Acyclic/testset_5.ds create mode 100644 datasets/Acyclic/testset_6.ds create mode 100644 datasets/Acyclic/testset_7.ds create mode 100644 datasets/Acyclic/testset_8.ds create mode 100644 datasets/Acyclic/testset_9.ds create mode 100644 datasets/Acyclic/trainset_0.ds create mode 100644 datasets/Acyclic/trainset_1.ds create mode 100644 datasets/Acyclic/trainset_2.ds create mode 100644 datasets/Acyclic/trainset_3.ds create mode 100644 datasets/Acyclic/trainset_4.ds create mode 100644 datasets/Acyclic/trainset_5.ds create mode 100644 datasets/Acyclic/trainset_6.ds create mode 100644 datasets/Acyclic/trainset_7.ds create mode 100644 datasets/Acyclic/trainset_8.ds create mode 100644 datasets/Acyclic/trainset_9.ds create mode 100644 datasets/Monoterpenoides/1.ct create mode 100644 datasets/Monoterpenoides/1.gxl create mode 100644 datasets/Monoterpenoides/10.ct create mode 100644 datasets/Monoterpenoides/10.gxl create mode 100644 datasets/Monoterpenoides/100.ct create mode 100644 datasets/Monoterpenoides/100.gxl create mode 100644 datasets/Monoterpenoides/101.ct create mode 100644 datasets/Monoterpenoides/101.gxl create mode 100644 datasets/Monoterpenoides/102.ct create mode 100644 datasets/Monoterpenoides/102.gxl create mode 100644 datasets/Monoterpenoides/103.ct create mode 100644 datasets/Monoterpenoides/103.gxl create mode 100644 datasets/Monoterpenoides/104.ct create mode 100644 datasets/Monoterpenoides/104.gxl create mode 100644 datasets/Monoterpenoides/105.ct create mode 100644 datasets/Monoterpenoides/105.gxl create mode 100644 datasets/Monoterpenoides/106.ct create mode 100644 datasets/Monoterpenoides/106.gxl create mode 100644 datasets/Monoterpenoides/107.ct create mode 100644 datasets/Monoterpenoides/107.gxl create mode 100644 datasets/Monoterpenoides/108.ct create mode 100644 datasets/Monoterpenoides/108.gxl create mode 100644 datasets/Monoterpenoides/109.ct create mode 100644 datasets/Monoterpenoides/109.gxl create mode 100644 datasets/Monoterpenoides/11.ct create mode 100644 datasets/Monoterpenoides/11.gxl create mode 100644 datasets/Monoterpenoides/110.ct create mode 100644 datasets/Monoterpenoides/110.gxl create mode 100644 datasets/Monoterpenoides/111.ct create mode 100644 datasets/Monoterpenoides/111.gxl create mode 100644 datasets/Monoterpenoides/112.ct create mode 100644 datasets/Monoterpenoides/112.gxl create mode 100644 datasets/Monoterpenoides/113.ct create mode 100644 datasets/Monoterpenoides/113.gxl create mode 100644 datasets/Monoterpenoides/114.ct create mode 100644 datasets/Monoterpenoides/114.gxl create mode 100644 datasets/Monoterpenoides/115.ct create mode 100644 datasets/Monoterpenoides/115.gxl create mode 100644 datasets/Monoterpenoides/116.ct create mode 100644 datasets/Monoterpenoides/116.gxl create mode 100644 datasets/Monoterpenoides/117.ct create mode 100644 datasets/Monoterpenoides/117.gxl create mode 100644 datasets/Monoterpenoides/118.ct create mode 100644 datasets/Monoterpenoides/118.gxl create mode 100644 datasets/Monoterpenoides/119.ct create mode 100644 datasets/Monoterpenoides/119.gxl create mode 100644 datasets/Monoterpenoides/12.ct create mode 100644 datasets/Monoterpenoides/12.gxl create mode 100644 datasets/Monoterpenoides/120.ct create mode 100644 datasets/Monoterpenoides/120.gxl create mode 100644 datasets/Monoterpenoides/121.ct create mode 100644 datasets/Monoterpenoides/121.gxl create mode 100644 datasets/Monoterpenoides/122.ct create mode 100644 datasets/Monoterpenoides/122.gxl create mode 100644 datasets/Monoterpenoides/123.ct create mode 100644 datasets/Monoterpenoides/123.gxl create mode 100644 datasets/Monoterpenoides/124.ct create mode 100644 datasets/Monoterpenoides/124.gxl create mode 100644 datasets/Monoterpenoides/125.ct create mode 100644 datasets/Monoterpenoides/125.gxl create mode 100644 datasets/Monoterpenoides/126.ct create mode 100644 datasets/Monoterpenoides/126.gxl create mode 100644 datasets/Monoterpenoides/127.ct create mode 100644 datasets/Monoterpenoides/127.gxl create mode 100644 datasets/Monoterpenoides/128.ct create mode 100644 datasets/Monoterpenoides/128.gxl create mode 100644 datasets/Monoterpenoides/129.ct create mode 100644 datasets/Monoterpenoides/129.gxl create mode 100644 datasets/Monoterpenoides/13.ct create mode 100644 datasets/Monoterpenoides/13.gxl create mode 100644 datasets/Monoterpenoides/130.ct create mode 100644 datasets/Monoterpenoides/130.gxl create mode 100644 datasets/Monoterpenoides/131.ct create mode 100644 datasets/Monoterpenoides/131.gxl create mode 100644 datasets/Monoterpenoides/132.ct create mode 100644 datasets/Monoterpenoides/132.gxl create mode 100644 datasets/Monoterpenoides/133.ct create mode 100644 datasets/Monoterpenoides/133.gxl create mode 100644 datasets/Monoterpenoides/134.ct create mode 100644 datasets/Monoterpenoides/134.gxl create mode 100644 datasets/Monoterpenoides/135.ct create mode 100644 datasets/Monoterpenoides/135.gxl create mode 100644 datasets/Monoterpenoides/136.ct create mode 100644 datasets/Monoterpenoides/136.gxl create mode 100644 datasets/Monoterpenoides/137.ct create mode 100644 datasets/Monoterpenoides/137.gxl create mode 100644 datasets/Monoterpenoides/138.ct create mode 100644 datasets/Monoterpenoides/138.gxl create mode 100644 datasets/Monoterpenoides/139.ct create mode 100644 datasets/Monoterpenoides/139.gxl create mode 100644 datasets/Monoterpenoides/14.ct create mode 100644 datasets/Monoterpenoides/14.gxl create mode 100644 datasets/Monoterpenoides/140.ct create mode 100644 datasets/Monoterpenoides/140.gxl create mode 100644 datasets/Monoterpenoides/141.ct create mode 100644 datasets/Monoterpenoides/141.gxl create mode 100644 datasets/Monoterpenoides/142.ct create mode 100644 datasets/Monoterpenoides/142.gxl create mode 100644 datasets/Monoterpenoides/143.ct create mode 100644 datasets/Monoterpenoides/143.gxl create mode 100644 datasets/Monoterpenoides/144.ct create mode 100644 datasets/Monoterpenoides/144.gxl create mode 100644 datasets/Monoterpenoides/145.ct create mode 100644 datasets/Monoterpenoides/145.gxl create mode 100644 datasets/Monoterpenoides/146.ct create mode 100644 datasets/Monoterpenoides/146.gxl create mode 100644 datasets/Monoterpenoides/147.ct create mode 100644 datasets/Monoterpenoides/147.gxl create mode 100644 datasets/Monoterpenoides/148.ct create mode 100644 datasets/Monoterpenoides/148.gxl create mode 100644 datasets/Monoterpenoides/149.ct create mode 100644 datasets/Monoterpenoides/149.gxl create mode 100644 datasets/Monoterpenoides/15.ct create mode 100644 datasets/Monoterpenoides/15.gxl create mode 100644 datasets/Monoterpenoides/150.ct create mode 100644 datasets/Monoterpenoides/150.gxl create mode 100644 datasets/Monoterpenoides/151.ct create mode 100644 datasets/Monoterpenoides/151.gxl create mode 100644 datasets/Monoterpenoides/152.ct create mode 100644 datasets/Monoterpenoides/152.gxl create mode 100644 datasets/Monoterpenoides/153.ct create mode 100644 datasets/Monoterpenoides/153.gxl create mode 100644 datasets/Monoterpenoides/154.ct create mode 100644 datasets/Monoterpenoides/154.gxl create mode 100644 datasets/Monoterpenoides/155.ct create mode 100644 datasets/Monoterpenoides/155.gxl create mode 100644 datasets/Monoterpenoides/156.ct create mode 100644 datasets/Monoterpenoides/156.gxl create mode 100644 datasets/Monoterpenoides/157.ct create mode 100644 datasets/Monoterpenoides/157.gxl create mode 100644 datasets/Monoterpenoides/158.ct create mode 100644 datasets/Monoterpenoides/158.gxl create mode 100644 datasets/Monoterpenoides/159.ct create mode 100644 datasets/Monoterpenoides/159.gxl create mode 100644 datasets/Monoterpenoides/16.ct create mode 100644 datasets/Monoterpenoides/16.gxl create mode 100644 datasets/Monoterpenoides/160.ct create mode 100644 datasets/Monoterpenoides/160.gxl create mode 100644 datasets/Monoterpenoides/161.ct create mode 100644 datasets/Monoterpenoides/161.gxl create mode 100644 datasets/Monoterpenoides/162.ct create mode 100644 datasets/Monoterpenoides/162.gxl create mode 100644 datasets/Monoterpenoides/163.ct create mode 100644 datasets/Monoterpenoides/163.gxl create mode 100644 datasets/Monoterpenoides/164.ct create mode 100644 datasets/Monoterpenoides/164.gxl create mode 100644 datasets/Monoterpenoides/165.ct create mode 100644 datasets/Monoterpenoides/165.gxl create mode 100644 datasets/Monoterpenoides/166.ct create mode 100644 datasets/Monoterpenoides/166.gxl create mode 100644 datasets/Monoterpenoides/167.ct create mode 100644 datasets/Monoterpenoides/167.gxl create mode 100644 datasets/Monoterpenoides/168.ct create mode 100644 datasets/Monoterpenoides/168.gxl create mode 100644 datasets/Monoterpenoides/169.ct create mode 100644 datasets/Monoterpenoides/169.gxl create mode 100644 datasets/Monoterpenoides/17.ct create mode 100644 datasets/Monoterpenoides/17.gxl create mode 100644 datasets/Monoterpenoides/170.ct create mode 100644 datasets/Monoterpenoides/170.gxl create mode 100644 datasets/Monoterpenoides/171.ct create mode 100644 datasets/Monoterpenoides/171.gxl create mode 100644 datasets/Monoterpenoides/172.ct create mode 100644 datasets/Monoterpenoides/172.gxl create mode 100644 datasets/Monoterpenoides/173.ct create mode 100644 datasets/Monoterpenoides/173.gxl create mode 100644 datasets/Monoterpenoides/174.ct create mode 100644 datasets/Monoterpenoides/174.gxl create mode 100644 datasets/Monoterpenoides/175.ct create mode 100644 datasets/Monoterpenoides/175.gxl create mode 100644 datasets/Monoterpenoides/176.ct create mode 100644 datasets/Monoterpenoides/176.gxl create mode 100644 datasets/Monoterpenoides/177.ct create mode 100644 datasets/Monoterpenoides/177.gxl create mode 100644 datasets/Monoterpenoides/178.ct create mode 100644 datasets/Monoterpenoides/178.gxl create mode 100644 datasets/Monoterpenoides/179.ct create mode 100644 datasets/Monoterpenoides/179.gxl create mode 100644 datasets/Monoterpenoides/18.ct create mode 100644 datasets/Monoterpenoides/18.gxl create mode 100644 datasets/Monoterpenoides/180.ct create mode 100644 datasets/Monoterpenoides/180.gxl create mode 100644 datasets/Monoterpenoides/181.ct create mode 100644 datasets/Monoterpenoides/181.gxl create mode 100644 datasets/Monoterpenoides/182.ct create mode 100644 datasets/Monoterpenoides/182.gxl create mode 100644 datasets/Monoterpenoides/183.ct create mode 100644 datasets/Monoterpenoides/183.gxl create mode 100644 datasets/Monoterpenoides/184.ct create mode 100644 datasets/Monoterpenoides/184.gxl create mode 100644 datasets/Monoterpenoides/185.ct create mode 100644 datasets/Monoterpenoides/185.gxl create mode 100644 datasets/Monoterpenoides/186.ct create mode 100644 datasets/Monoterpenoides/186.gxl create mode 100644 datasets/Monoterpenoides/187.ct create mode 100644 datasets/Monoterpenoides/187.gxl create mode 100644 datasets/Monoterpenoides/188.ct create mode 100644 datasets/Monoterpenoides/188.gxl create mode 100644 datasets/Monoterpenoides/189.ct create mode 100644 datasets/Monoterpenoides/189.gxl create mode 100644 datasets/Monoterpenoides/19.ct create mode 100644 datasets/Monoterpenoides/19.gxl create mode 100644 datasets/Monoterpenoides/190.ct create mode 100644 datasets/Monoterpenoides/190.gxl create mode 100644 datasets/Monoterpenoides/191.ct create mode 100644 datasets/Monoterpenoides/191.gxl create mode 100644 datasets/Monoterpenoides/192.ct create mode 100644 datasets/Monoterpenoides/192.gxl create mode 100644 datasets/Monoterpenoides/193.ct create mode 100644 datasets/Monoterpenoides/193.gxl create mode 100644 datasets/Monoterpenoides/194.ct create mode 100644 datasets/Monoterpenoides/194.gxl create mode 100644 datasets/Monoterpenoides/195.ct create mode 100644 datasets/Monoterpenoides/195.gxl create mode 100644 datasets/Monoterpenoides/196.ct create mode 100644 datasets/Monoterpenoides/196.gxl create mode 100644 datasets/Monoterpenoides/197.ct create mode 100644 datasets/Monoterpenoides/197.gxl create mode 100644 datasets/Monoterpenoides/198.ct create mode 100644 datasets/Monoterpenoides/198.gxl create mode 100644 datasets/Monoterpenoides/199.ct create mode 100644 datasets/Monoterpenoides/199.gxl create mode 100644 datasets/Monoterpenoides/2.ct create mode 100644 datasets/Monoterpenoides/2.gxl create mode 100644 datasets/Monoterpenoides/20.ct create mode 100644 datasets/Monoterpenoides/20.gxl create mode 100644 datasets/Monoterpenoides/200.ct create mode 100644 datasets/Monoterpenoides/200.gxl create mode 100644 datasets/Monoterpenoides/201.ct create mode 100644 datasets/Monoterpenoides/201.gxl create mode 100644 datasets/Monoterpenoides/202.ct create mode 100644 datasets/Monoterpenoides/202.gxl create mode 100644 datasets/Monoterpenoides/203.ct create mode 100644 datasets/Monoterpenoides/203.gxl create mode 100644 datasets/Monoterpenoides/204.ct create mode 100644 datasets/Monoterpenoides/204.gxl create mode 100644 datasets/Monoterpenoides/205.ct create mode 100644 datasets/Monoterpenoides/205.gxl create mode 100644 datasets/Monoterpenoides/206.ct create mode 100644 datasets/Monoterpenoides/206.gxl create mode 100644 datasets/Monoterpenoides/207.ct create mode 100644 datasets/Monoterpenoides/207.gxl create mode 100644 datasets/Monoterpenoides/208.ct create mode 100644 datasets/Monoterpenoides/208.gxl create mode 100644 datasets/Monoterpenoides/209.ct create mode 100644 datasets/Monoterpenoides/209.gxl create mode 100644 datasets/Monoterpenoides/21.ct create mode 100644 datasets/Monoterpenoides/21.gxl create mode 100644 datasets/Monoterpenoides/210.ct create mode 100644 datasets/Monoterpenoides/210.gxl create mode 100644 datasets/Monoterpenoides/211.ct create mode 100644 datasets/Monoterpenoides/211.gxl create mode 100644 datasets/Monoterpenoides/212.ct create mode 100644 datasets/Monoterpenoides/212.gxl create mode 100644 datasets/Monoterpenoides/213.ct create mode 100644 datasets/Monoterpenoides/213.gxl create mode 100644 datasets/Monoterpenoides/214.ct create mode 100644 datasets/Monoterpenoides/214.gxl create mode 100644 datasets/Monoterpenoides/215.ct create mode 100644 datasets/Monoterpenoides/215.gxl create mode 100644 datasets/Monoterpenoides/216.ct create mode 100644 datasets/Monoterpenoides/216.gxl create mode 100644 datasets/Monoterpenoides/217.ct create mode 100644 datasets/Monoterpenoides/217.gxl create mode 100644 datasets/Monoterpenoides/218.ct create mode 100644 datasets/Monoterpenoides/218.gxl create mode 100644 datasets/Monoterpenoides/219.ct create mode 100644 datasets/Monoterpenoides/219.gxl create mode 100644 datasets/Monoterpenoides/22.ct create mode 100644 datasets/Monoterpenoides/22.gxl create mode 100644 datasets/Monoterpenoides/220.ct create mode 100644 datasets/Monoterpenoides/220.gxl create mode 100644 datasets/Monoterpenoides/221.ct create mode 100644 datasets/Monoterpenoides/221.gxl create mode 100644 datasets/Monoterpenoides/222.ct create mode 100644 datasets/Monoterpenoides/222.gxl create mode 100644 datasets/Monoterpenoides/223.ct create mode 100644 datasets/Monoterpenoides/223.gxl create mode 100644 datasets/Monoterpenoides/224.ct create mode 100644 datasets/Monoterpenoides/224.gxl create mode 100644 datasets/Monoterpenoides/225.ct create mode 100644 datasets/Monoterpenoides/225.gxl create mode 100644 datasets/Monoterpenoides/226.ct create mode 100644 datasets/Monoterpenoides/226.gxl create mode 100644 datasets/Monoterpenoides/227.ct create mode 100644 datasets/Monoterpenoides/227.gxl create mode 100644 datasets/Monoterpenoides/228.ct create mode 100644 datasets/Monoterpenoides/228.gxl create mode 100644 datasets/Monoterpenoides/229.ct create mode 100644 datasets/Monoterpenoides/229.gxl create mode 100644 datasets/Monoterpenoides/23.ct create mode 100644 datasets/Monoterpenoides/23.gxl create mode 100644 datasets/Monoterpenoides/230.ct create mode 100644 datasets/Monoterpenoides/230.gxl create mode 100644 datasets/Monoterpenoides/231.ct create mode 100644 datasets/Monoterpenoides/231.gxl create mode 100644 datasets/Monoterpenoides/232.ct create mode 100644 datasets/Monoterpenoides/232.gxl create mode 100644 datasets/Monoterpenoides/233.ct create mode 100644 datasets/Monoterpenoides/233.gxl create mode 100644 datasets/Monoterpenoides/234.ct create mode 100644 datasets/Monoterpenoides/234.gxl create mode 100644 datasets/Monoterpenoides/235.ct create mode 100644 datasets/Monoterpenoides/235.gxl create mode 100644 datasets/Monoterpenoides/236.ct create mode 100644 datasets/Monoterpenoides/236.gxl create mode 100644 datasets/Monoterpenoides/237.ct create mode 100644 datasets/Monoterpenoides/237.gxl create mode 100644 datasets/Monoterpenoides/238.ct create mode 100644 datasets/Monoterpenoides/238.gxl create mode 100644 datasets/Monoterpenoides/239.ct create mode 100644 datasets/Monoterpenoides/239.gxl create mode 100644 datasets/Monoterpenoides/24.ct create mode 100644 datasets/Monoterpenoides/24.gxl create mode 100644 datasets/Monoterpenoides/240.ct create mode 100644 datasets/Monoterpenoides/240.gxl create mode 100644 datasets/Monoterpenoides/241.ct create mode 100644 datasets/Monoterpenoides/241.gxl create mode 100644 datasets/Monoterpenoides/242.ct create mode 100644 datasets/Monoterpenoides/242.gxl create mode 100644 datasets/Monoterpenoides/243.ct create mode 100644 datasets/Monoterpenoides/243.gxl create mode 100644 datasets/Monoterpenoides/244.ct create mode 100644 datasets/Monoterpenoides/244.gxl create mode 100644 datasets/Monoterpenoides/245.ct create mode 100644 datasets/Monoterpenoides/245.gxl create mode 100644 datasets/Monoterpenoides/246.ct create mode 100644 datasets/Monoterpenoides/246.gxl create mode 100644 datasets/Monoterpenoides/247.ct create mode 100644 datasets/Monoterpenoides/247.gxl create mode 100644 datasets/Monoterpenoides/248.ct create mode 100644 datasets/Monoterpenoides/248.gxl create mode 100644 datasets/Monoterpenoides/249.ct create mode 100644 datasets/Monoterpenoides/249.gxl create mode 100644 datasets/Monoterpenoides/25.ct create mode 100644 datasets/Monoterpenoides/25.gxl create mode 100644 datasets/Monoterpenoides/250.ct create mode 100644 datasets/Monoterpenoides/250.gxl create mode 100644 datasets/Monoterpenoides/251.ct create mode 100644 datasets/Monoterpenoides/251.gxl create mode 100644 datasets/Monoterpenoides/252.ct create mode 100644 datasets/Monoterpenoides/252.gxl create mode 100644 datasets/Monoterpenoides/253.ct create mode 100644 datasets/Monoterpenoides/253.gxl create mode 100644 datasets/Monoterpenoides/254.ct create mode 100644 datasets/Monoterpenoides/254.gxl create mode 100644 datasets/Monoterpenoides/255.ct create mode 100644 datasets/Monoterpenoides/255.gxl create mode 100644 datasets/Monoterpenoides/256.ct create mode 100644 datasets/Monoterpenoides/256.gxl create mode 100644 datasets/Monoterpenoides/257.ct create mode 100644 datasets/Monoterpenoides/257.gxl create mode 100644 datasets/Monoterpenoides/258.ct create mode 100644 datasets/Monoterpenoides/258.gxl create mode 100644 datasets/Monoterpenoides/259.ct create mode 100644 datasets/Monoterpenoides/259.gxl create mode 100644 datasets/Monoterpenoides/26.ct create mode 100644 datasets/Monoterpenoides/26.gxl create mode 100644 datasets/Monoterpenoides/260.ct create mode 100644 datasets/Monoterpenoides/260.gxl create mode 100644 datasets/Monoterpenoides/261.ct create mode 100644 datasets/Monoterpenoides/261.gxl create mode 100644 datasets/Monoterpenoides/262.ct create mode 100644 datasets/Monoterpenoides/262.gxl create mode 100644 datasets/Monoterpenoides/263.ct create mode 100644 datasets/Monoterpenoides/263.gxl create mode 100644 datasets/Monoterpenoides/264.ct create mode 100644 datasets/Monoterpenoides/264.gxl create mode 100644 datasets/Monoterpenoides/265.ct create mode 100644 datasets/Monoterpenoides/265.gxl create mode 100644 datasets/Monoterpenoides/266.ct create mode 100644 datasets/Monoterpenoides/266.gxl create mode 100644 datasets/Monoterpenoides/267.ct create mode 100644 datasets/Monoterpenoides/267.gxl create mode 100644 datasets/Monoterpenoides/268.ct create mode 100644 datasets/Monoterpenoides/268.gxl create mode 100644 datasets/Monoterpenoides/269.ct create mode 100644 datasets/Monoterpenoides/269.gxl create mode 100644 datasets/Monoterpenoides/27.ct create mode 100644 datasets/Monoterpenoides/27.gxl create mode 100644 datasets/Monoterpenoides/270.ct create mode 100644 datasets/Monoterpenoides/270.gxl create mode 100644 datasets/Monoterpenoides/271.ct create mode 100644 datasets/Monoterpenoides/271.gxl create mode 100644 datasets/Monoterpenoides/272.ct create mode 100644 datasets/Monoterpenoides/272.gxl create mode 100644 datasets/Monoterpenoides/273.ct create mode 100644 datasets/Monoterpenoides/273.gxl create mode 100644 datasets/Monoterpenoides/274.ct create mode 100644 datasets/Monoterpenoides/274.gxl create mode 100644 datasets/Monoterpenoides/275.ct create mode 100644 datasets/Monoterpenoides/275.gxl create mode 100644 datasets/Monoterpenoides/276.ct create mode 100644 datasets/Monoterpenoides/276.gxl create mode 100644 datasets/Monoterpenoides/277.ct create mode 100644 datasets/Monoterpenoides/277.gxl create mode 100644 datasets/Monoterpenoides/278.ct create mode 100644 datasets/Monoterpenoides/278.gxl create mode 100644 datasets/Monoterpenoides/279.ct create mode 100644 datasets/Monoterpenoides/279.gxl create mode 100644 datasets/Monoterpenoides/28.ct create mode 100644 datasets/Monoterpenoides/28.gxl create mode 100644 datasets/Monoterpenoides/280.ct create mode 100644 datasets/Monoterpenoides/280.gxl create mode 100644 datasets/Monoterpenoides/281.ct create mode 100644 datasets/Monoterpenoides/281.gxl create mode 100644 datasets/Monoterpenoides/282.ct create mode 100644 datasets/Monoterpenoides/282.gxl create mode 100644 datasets/Monoterpenoides/283.ct create mode 100644 datasets/Monoterpenoides/283.gxl create mode 100644 datasets/Monoterpenoides/284.ct create mode 100644 datasets/Monoterpenoides/284.gxl create mode 100644 datasets/Monoterpenoides/285.ct create mode 100644 datasets/Monoterpenoides/285.gxl create mode 100644 datasets/Monoterpenoides/286.ct create mode 100644 datasets/Monoterpenoides/286.gxl create mode 100644 datasets/Monoterpenoides/287.ct create mode 100644 datasets/Monoterpenoides/287.gxl create mode 100644 datasets/Monoterpenoides/288.ct create mode 100644 datasets/Monoterpenoides/288.gxl create mode 100644 datasets/Monoterpenoides/289.ct create mode 100644 datasets/Monoterpenoides/289.gxl create mode 100644 datasets/Monoterpenoides/29.ct create mode 100644 datasets/Monoterpenoides/29.gxl create mode 100644 datasets/Monoterpenoides/290.ct create mode 100644 datasets/Monoterpenoides/290.gxl create mode 100644 datasets/Monoterpenoides/291.ct create mode 100644 datasets/Monoterpenoides/291.gxl create mode 100644 datasets/Monoterpenoides/292.ct create mode 100644 datasets/Monoterpenoides/292.gxl create mode 100644 datasets/Monoterpenoides/293.ct create mode 100644 datasets/Monoterpenoides/293.gxl create mode 100644 datasets/Monoterpenoides/294.ct create mode 100644 datasets/Monoterpenoides/294.gxl create mode 100644 datasets/Monoterpenoides/295.ct create mode 100644 datasets/Monoterpenoides/295.gxl create mode 100644 datasets/Monoterpenoides/296.ct create mode 100644 datasets/Monoterpenoides/296.gxl create mode 100644 datasets/Monoterpenoides/297.ct create mode 100644 datasets/Monoterpenoides/297.gxl create mode 100644 datasets/Monoterpenoides/298.ct create mode 100644 datasets/Monoterpenoides/298.gxl create mode 100644 datasets/Monoterpenoides/299.ct create mode 100644 datasets/Monoterpenoides/299.gxl create mode 100644 datasets/Monoterpenoides/3.ct create mode 100644 datasets/Monoterpenoides/3.gxl create mode 100644 datasets/Monoterpenoides/30.ct create mode 100644 datasets/Monoterpenoides/30.gxl create mode 100644 datasets/Monoterpenoides/300.ct create mode 100644 datasets/Monoterpenoides/300.gxl create mode 100644 datasets/Monoterpenoides/301.ct create mode 100644 datasets/Monoterpenoides/301.gxl create mode 100644 datasets/Monoterpenoides/302.ct create mode 100644 datasets/Monoterpenoides/302.gxl create mode 100644 datasets/Monoterpenoides/31.ct create mode 100644 datasets/Monoterpenoides/31.gxl create mode 100644 datasets/Monoterpenoides/32.ct create mode 100644 datasets/Monoterpenoides/32.gxl create mode 100644 datasets/Monoterpenoides/33.ct create mode 100644 datasets/Monoterpenoides/33.gxl create mode 100644 datasets/Monoterpenoides/34.ct create mode 100644 datasets/Monoterpenoides/34.gxl create mode 100644 datasets/Monoterpenoides/35.ct create mode 100644 datasets/Monoterpenoides/35.gxl create mode 100644 datasets/Monoterpenoides/36.ct create mode 100644 datasets/Monoterpenoides/36.gxl create mode 100644 datasets/Monoterpenoides/37.ct create mode 100644 datasets/Monoterpenoides/37.gxl create mode 100644 datasets/Monoterpenoides/38.ct create mode 100644 datasets/Monoterpenoides/38.gxl create mode 100644 datasets/Monoterpenoides/39.ct create mode 100644 datasets/Monoterpenoides/39.gxl create mode 100644 datasets/Monoterpenoides/4.ct create mode 100644 datasets/Monoterpenoides/4.gxl create mode 100644 datasets/Monoterpenoides/40.ct create mode 100644 datasets/Monoterpenoides/40.gxl create mode 100644 datasets/Monoterpenoides/41.ct create mode 100644 datasets/Monoterpenoides/41.gxl create mode 100644 datasets/Monoterpenoides/42.ct create mode 100644 datasets/Monoterpenoides/42.gxl create mode 100644 datasets/Monoterpenoides/43.ct create mode 100644 datasets/Monoterpenoides/43.gxl create mode 100644 datasets/Monoterpenoides/44.ct create mode 100644 datasets/Monoterpenoides/44.gxl create mode 100644 datasets/Monoterpenoides/45.ct create mode 100644 datasets/Monoterpenoides/45.gxl create mode 100644 datasets/Monoterpenoides/46.ct create mode 100644 datasets/Monoterpenoides/46.gxl create mode 100644 datasets/Monoterpenoides/47.ct create mode 100644 datasets/Monoterpenoides/47.gxl create mode 100644 datasets/Monoterpenoides/48.ct create mode 100644 datasets/Monoterpenoides/48.gxl create mode 100644 datasets/Monoterpenoides/49.ct create mode 100644 datasets/Monoterpenoides/49.gxl create mode 100644 datasets/Monoterpenoides/5.ct create mode 100644 datasets/Monoterpenoides/5.gxl create mode 100644 datasets/Monoterpenoides/50.ct create mode 100644 datasets/Monoterpenoides/50.gxl create mode 100644 datasets/Monoterpenoides/51.ct create mode 100644 datasets/Monoterpenoides/51.gxl create mode 100644 datasets/Monoterpenoides/52.ct create mode 100644 datasets/Monoterpenoides/52.gxl create mode 100644 datasets/Monoterpenoides/53.ct create mode 100644 datasets/Monoterpenoides/53.gxl create mode 100644 datasets/Monoterpenoides/54.ct create mode 100644 datasets/Monoterpenoides/54.gxl create mode 100644 datasets/Monoterpenoides/55.ct create mode 100644 datasets/Monoterpenoides/55.gxl create mode 100644 datasets/Monoterpenoides/56.ct create mode 100644 datasets/Monoterpenoides/56.gxl create mode 100644 datasets/Monoterpenoides/57.ct create mode 100644 datasets/Monoterpenoides/57.gxl create mode 100644 datasets/Monoterpenoides/58.ct create mode 100644 datasets/Monoterpenoides/58.gxl create mode 100644 datasets/Monoterpenoides/59.ct create mode 100644 datasets/Monoterpenoides/59.gxl create mode 100644 datasets/Monoterpenoides/6.ct create mode 100644 datasets/Monoterpenoides/6.gxl create mode 100644 datasets/Monoterpenoides/60.ct create mode 100644 datasets/Monoterpenoides/60.gxl create mode 100644 datasets/Monoterpenoides/61.ct create mode 100644 datasets/Monoterpenoides/61.gxl create mode 100644 datasets/Monoterpenoides/62.ct create mode 100644 datasets/Monoterpenoides/62.gxl create mode 100644 datasets/Monoterpenoides/63.ct create mode 100644 datasets/Monoterpenoides/63.gxl create mode 100644 datasets/Monoterpenoides/64.ct create mode 100644 datasets/Monoterpenoides/64.gxl create mode 100644 datasets/Monoterpenoides/65.ct create mode 100644 datasets/Monoterpenoides/65.gxl create mode 100644 datasets/Monoterpenoides/66.ct create mode 100644 datasets/Monoterpenoides/66.gxl create mode 100644 datasets/Monoterpenoides/67.ct create mode 100644 datasets/Monoterpenoides/67.gxl create mode 100644 datasets/Monoterpenoides/68.ct create mode 100644 datasets/Monoterpenoides/68.gxl create mode 100644 datasets/Monoterpenoides/69.ct create mode 100644 datasets/Monoterpenoides/69.gxl create mode 100644 datasets/Monoterpenoides/7.ct create mode 100644 datasets/Monoterpenoides/7.gxl create mode 100644 datasets/Monoterpenoides/70.ct create mode 100644 datasets/Monoterpenoides/70.gxl create mode 100644 datasets/Monoterpenoides/71.ct create mode 100644 datasets/Monoterpenoides/71.gxl create mode 100644 datasets/Monoterpenoides/72.ct create mode 100644 datasets/Monoterpenoides/72.gxl create mode 100644 datasets/Monoterpenoides/73.ct create mode 100644 datasets/Monoterpenoides/73.gxl create mode 100644 datasets/Monoterpenoides/74.ct create mode 100644 datasets/Monoterpenoides/74.gxl create mode 100644 datasets/Monoterpenoides/75.ct create mode 100644 datasets/Monoterpenoides/75.gxl create mode 100644 datasets/Monoterpenoides/76.ct create mode 100644 datasets/Monoterpenoides/76.gxl create mode 100644 datasets/Monoterpenoides/77.ct create mode 100644 datasets/Monoterpenoides/77.gxl create mode 100644 datasets/Monoterpenoides/78.ct create mode 100644 datasets/Monoterpenoides/78.gxl create mode 100644 datasets/Monoterpenoides/79.ct create mode 100644 datasets/Monoterpenoides/79.gxl create mode 100644 datasets/Monoterpenoides/8.ct create mode 100644 datasets/Monoterpenoides/8.gxl create mode 100644 datasets/Monoterpenoides/80.ct create mode 100644 datasets/Monoterpenoides/80.gxl create mode 100644 datasets/Monoterpenoides/81.ct create mode 100644 datasets/Monoterpenoides/81.gxl create mode 100644 datasets/Monoterpenoides/82.ct create mode 100644 datasets/Monoterpenoides/82.gxl create mode 100644 datasets/Monoterpenoides/83.ct create mode 100644 datasets/Monoterpenoides/83.gxl create mode 100644 datasets/Monoterpenoides/84.ct create mode 100644 datasets/Monoterpenoides/84.gxl create mode 100644 datasets/Monoterpenoides/85.ct create mode 100644 datasets/Monoterpenoides/85.gxl create mode 100644 datasets/Monoterpenoides/86.ct create mode 100644 datasets/Monoterpenoides/86.gxl create mode 100644 datasets/Monoterpenoides/87.ct create mode 100644 datasets/Monoterpenoides/87.gxl create mode 100644 datasets/Monoterpenoides/88.ct create mode 100644 datasets/Monoterpenoides/88.gxl create mode 100644 datasets/Monoterpenoides/89.ct create mode 100644 datasets/Monoterpenoides/89.gxl create mode 100644 datasets/Monoterpenoides/9.ct create mode 100644 datasets/Monoterpenoides/9.gxl create mode 100644 datasets/Monoterpenoides/90.ct create mode 100644 datasets/Monoterpenoides/90.gxl create mode 100644 datasets/Monoterpenoides/91.ct create mode 100644 datasets/Monoterpenoides/91.gxl create mode 100644 datasets/Monoterpenoides/92.ct create mode 100644 datasets/Monoterpenoides/92.gxl create mode 100644 datasets/Monoterpenoides/93.ct create mode 100644 datasets/Monoterpenoides/93.gxl create mode 100644 datasets/Monoterpenoides/94.ct create mode 100644 datasets/Monoterpenoides/94.gxl create mode 100644 datasets/Monoterpenoides/95.ct create mode 100644 datasets/Monoterpenoides/95.gxl create mode 100644 datasets/Monoterpenoides/96.ct create mode 100644 datasets/Monoterpenoides/96.gxl create mode 100644 datasets/Monoterpenoides/97.ct create mode 100644 datasets/Monoterpenoides/97.gxl create mode 100644 datasets/Monoterpenoides/98.ct create mode 100644 datasets/Monoterpenoides/98.gxl create mode 100644 datasets/Monoterpenoides/99.ct create mode 100644 datasets/Monoterpenoides/99.gxl create mode 100644 datasets/Monoterpenoides/classe.txt create mode 100644 datasets/Monoterpenoides/dataset.ds create mode 100644 datasets/Monoterpenoides/dataset_10+.ds create mode 100644 datasets/Monoterpenoides/dataset_9.ds create mode 100644 datasets/Monoterpenoides/monoterpenoides.tar.gz create mode 100644 datasets/Monoterpenoides/monoterpenoides_gxl.tgz create mode 100644 datasets/Monoterpenoides/trainset_9.ds diff --git a/.gitignore b/.gitignore index 8bdddb2..0146aaf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ datasets/* !datasets/ds.py !datasets/Alkane/ !datasets/acyclic/ +!datasets/Acyclic/ !datasets/MAO/ !datasets/PAH/ !datasets/MUTAG/ @@ -14,6 +15,7 @@ datasets/* !datasets/NCI109/ !datasets/AIDS/ !datasets/monoterpenoides/ +!datasets/Monoterpenoides/ !datasets/Fingerprint/*.txt !datasets/Cuneiform/*.txt notebooks/results/* diff --git a/datasets/Acyclic/1,1-bis(ethylthio)ethane.ct b/datasets/Acyclic/1,1-bis(ethylthio)ethane.ct new file mode 100644 index 0000000..3635f4c --- /dev/null +++ b/datasets/Acyclic/1,1-bis(ethylthio)ethane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,1-bis(isopropylthio)ethane.ct b/datasets/Acyclic/1,1-bis(isopropylthio)ethane.ct new file mode 100644 index 0000000..8138558 --- /dev/null +++ b/datasets/Acyclic/1,1-bis(isopropylthio)ethane.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 6 1 1 + 2 6 1 1 + 3 7 1 1 + 4 7 1 1 + 5 8 1 1 + 6 9 1 1 + 7 10 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/1,1-bis(methylthio)ethane.ct b/datasets/Acyclic/1,1-bis(methylthio)ethane.ct new file mode 100644 index 0000000..d11421d --- /dev/null +++ b/datasets/Acyclic/1,1-bis(methylthio)ethane.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/1,1-diethoxyethane.ct b/datasets/Acyclic/1,1-diethoxyethane.ct new file mode 100644 index 0000000..b141f1c --- /dev/null +++ b/datasets/Acyclic/1,1-diethoxyethane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,1-diethoxypentane.ct b/datasets/Acyclic/1,1-diethoxypentane.ct new file mode 100644 index 0000000..1a58848 --- /dev/null +++ b/datasets/Acyclic/1,1-diethoxypentane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 10 1 1 + 6 11 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/1,1-diethoxypropane.ct b/datasets/Acyclic/1,1-diethoxypropane.ct new file mode 100644 index 0000000..abeafde --- /dev/null +++ b/datasets/Acyclic/1,1-diethoxypropane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1,1-diisopropoxyethane.ct b/datasets/Acyclic/1,1-diisopropoxyethane.ct new file mode 100644 index 0000000..d3e30f6 --- /dev/null +++ b/datasets/Acyclic/1,1-diisopropoxyethane.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 6 1 1 + 3 7 1 1 + 4 7 1 1 + 5 8 1 1 + 6 9 1 1 + 7 10 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/1,1-diisopropoxypropane.ct b/datasets/Acyclic/1,1-diisopropoxypropane.ct new file mode 100644 index 0000000..5c8b13d --- /dev/null +++ b/datasets/Acyclic/1,1-diisopropoxypropane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 9 1 1 + 7 10 1 1 + 8 11 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/1,1-dimethoxy-2,2-dimethylpentane.ct b/datasets/Acyclic/1,1-dimethoxy-2,2-dimethylpentane.ct new file mode 100644 index 0000000..32a4b0c --- /dev/null +++ b/datasets/Acyclic/1,1-dimethoxy-2,2-dimethylpentane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 9 1 1 + 3 9 1 1 + 4 10 1 1 + 5 11 1 1 + 6 7 1 1 + 7 9 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Acyclic/1,1-dimethoxy-2-methylpropane.ct b/datasets/Acyclic/1,1-dimethoxy-2-methylpropane.ct new file mode 100644 index 0000000..ed8bf12 --- /dev/null +++ b/datasets/Acyclic/1,1-dimethoxy-2-methylpropane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 5 1 1 + 3 7 1 1 + 4 8 1 1 + 5 6 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,1-dimethoxybutane.ct b/datasets/Acyclic/1,1-dimethoxybutane.ct new file mode 100644 index 0000000..20d84b9 --- /dev/null +++ b/datasets/Acyclic/1,1-dimethoxybutane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 7 1 1 + 3 8 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,1-dimethoxyethane.ct b/datasets/Acyclic/1,1-dimethoxyethane.ct new file mode 100644 index 0000000..3c1800d --- /dev/null +++ b/datasets/Acyclic/1,1-dimethoxyethane.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/1,1-dimethoxyhexane.ct b/datasets/Acyclic/1,1-dimethoxyhexane.ct new file mode 100644 index 0000000..90f884b --- /dev/null +++ b/datasets/Acyclic/1,1-dimethoxyhexane.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 9 1 1 + 3 10 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/1,1-dipropoxyethane.ct b/datasets/Acyclic/1,1-dipropoxyethane.ct new file mode 100644 index 0000000..b0054a9 --- /dev/null +++ b/datasets/Acyclic/1,1-dipropoxyethane.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 8 1 1 + 4 6 1 1 + 5 7 1 1 + 6 9 1 1 + 7 10 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/1,1-dipropoxypropane.ct b/datasets/Acyclic/1,1-dipropoxypropane.ct new file mode 100644 index 0000000..328e1a8 --- /dev/null +++ b/datasets/Acyclic/1,1-dipropoxypropane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 9 1 1 + 7 10 1 1 + 8 11 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/1,2-bis(ethylthio)ethane.ct b/datasets/Acyclic/1,2-bis(ethylthio)ethane.ct new file mode 100644 index 0000000..469a876 --- /dev/null +++ b/datasets/Acyclic/1,2-bis(ethylthio)ethane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 7 1 1 + 4 8 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,2-bis(methylthio)ethane.ct b/datasets/Acyclic/1,2-bis(methylthio)ethane.ct new file mode 100644 index 0000000..956e4e9 --- /dev/null +++ b/datasets/Acyclic/1,2-bis(methylthio)ethane.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 6 1 1 + 3 4 1 1 + 3 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/1,2-diethoxyethane.ct b/datasets/Acyclic/1,2-diethoxyethane.ct new file mode 100644 index 0000000..c7d9438 --- /dev/null +++ b/datasets/Acyclic/1,2-diethoxyethane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 7 1 1 + 4 8 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,2-dimethoxyethane.ct b/datasets/Acyclic/1,2-dimethoxyethane.ct new file mode 100644 index 0000000..91086aa --- /dev/null +++ b/datasets/Acyclic/1,2-dimethoxyethane.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 4 1 1 + 3 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/1,2-dimethoxypropane.ct b/datasets/Acyclic/1,2-dimethoxypropane.ct new file mode 100644 index 0000000..0b5eac4 --- /dev/null +++ b/datasets/Acyclic/1,2-dimethoxypropane.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 7 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/1,2-dimethylpropyl_ethyl_ether.ct b/datasets/Acyclic/1,2-dimethylpropyl_ethyl_ether.ct new file mode 100644 index 0000000..aa5d7e5 --- /dev/null +++ b/datasets/Acyclic/1,2-dimethylpropyl_ethyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 7 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/1,2-dimethylpropyl_methyl_ether.ct b/datasets/Acyclic/1,2-dimethylpropyl_methyl_ether.ct new file mode 100644 index 0000000..a8f4e86 --- /dev/null +++ b/datasets/Acyclic/1,2-dimethylpropyl_methyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/1,3-bis(ethylthio)propane.ct b/datasets/Acyclic/1,3-bis(ethylthio)propane.ct new file mode 100644 index 0000000..7e01527 --- /dev/null +++ b/datasets/Acyclic/1,3-bis(ethylthio)propane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 8 1 1 + 4 9 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1,3-diethoxypropane.ct b/datasets/Acyclic/1,3-diethoxypropane.ct new file mode 100644 index 0000000..1c16b97 --- /dev/null +++ b/datasets/Acyclic/1,3-diethoxypropane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 8 1 1 + 4 9 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1,3-diisopropoxypropane.ct b/datasets/Acyclic/1,3-diisopropoxypropane.ct new file mode 100644 index 0000000..1c4cd63 --- /dev/null +++ b/datasets/Acyclic/1,3-diisopropoxypropane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 8 1 1 + 3 9 1 1 + 4 9 1 1 + 5 6 1 1 + 5 7 1 1 + 6 10 1 1 + 7 11 1 1 + 8 10 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/1,3-dimethoxybutane.ct b/datasets/Acyclic/1,3-dimethoxybutane.ct new file mode 100644 index 0000000..ed22474 --- /dev/null +++ b/datasets/Acyclic/1,3-dimethoxybutane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 7 1 1 + 3 8 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,3-dimethoxypentane.ct b/datasets/Acyclic/1,3-dimethoxypentane.ct new file mode 100644 index 0000000..acffc40 --- /dev/null +++ b/datasets/Acyclic/1,3-dimethoxypentane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 8 1 1 + 3 9 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1,3-dimethoxypropane.ct b/datasets/Acyclic/1,3-dimethoxypropane.ct new file mode 100644 index 0000000..3d409c2 --- /dev/null +++ b/datasets/Acyclic/1,3-dimethoxypropane.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 7 1 1 + 3 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/1,3-dimethylpentyl_methyl_ether.ct b/datasets/Acyclic/1,3-dimethylpentyl_methyl_ether.ct new file mode 100644 index 0000000..76c9a68 --- /dev/null +++ b/datasets/Acyclic/1,3-dimethylpentyl_methyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 7 1 1 + 3 8 1 1 + 4 9 1 1 + 5 7 1 1 + 6 7 1 1 + 6 8 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/1,3-dipropoxypropane.ct b/datasets/Acyclic/1,3-dipropoxypropane.ct new file mode 100644 index 0000000..a3571bf --- /dev/null +++ b/datasets/Acyclic/1,3-dipropoxypropane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 5 9 1 1 + 6 10 1 1 + 7 11 1 1 + 8 10 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/1,4-diethoxybutane.ct b/datasets/Acyclic/1,4-diethoxybutane.ct new file mode 100644 index 0000000..54a6cf1 --- /dev/null +++ b/datasets/Acyclic/1,4-diethoxybutane.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 9 1 1 + 4 10 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/1,4-dimethoxybutane.ct b/datasets/Acyclic/1,4-dimethoxybutane.ct new file mode 100644 index 0000000..8fdcfe3 --- /dev/null +++ b/datasets/Acyclic/1,4-dimethoxybutane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 8 1 1 + 3 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/1,4-dimethoxypentane.ct b/datasets/Acyclic/1,4-dimethoxypentane.ct new file mode 100644 index 0000000..c5e66ba --- /dev/null +++ b/datasets/Acyclic/1,4-dimethoxypentane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 8 1 1 + 3 9 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1,5-dimethoxypentane.ct b/datasets/Acyclic/1,5-dimethoxypentane.ct new file mode 100644 index 0000000..29bef4a --- /dev/null +++ b/datasets/Acyclic/1,5-dimethoxypentane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 9 1 1 + 3 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1,5-dimethylhexyl_methyl_ether.ct b/datasets/Acyclic/1,5-dimethylhexyl_methyl_ether.ct new file mode 100644 index 0000000..92ce5dd --- /dev/null +++ b/datasets/Acyclic/1,5-dimethylhexyl_methyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 8 1 1 + 3 9 1 1 + 4 10 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/1-butyl-propane-2-ol.ct b/datasets/Acyclic/1-butyl-propane-2-ol.ct new file mode 100644 index 0000000..7a18d01 --- /dev/null +++ b/datasets/Acyclic/1-butyl-propane-2-ol.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 7 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/1-ethoxy-1-propoxyethane.ct b/datasets/Acyclic/1-ethoxy-1-propoxyethane.ct new file mode 100644 index 0000000..6554626 --- /dev/null +++ b/datasets/Acyclic/1-ethoxy-1-propoxyethane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 7 1 1 + 4 6 1 1 + 5 8 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1-ethoxy-2-methoxyethane.ct b/datasets/Acyclic/1-ethoxy-2-methoxyethane.ct new file mode 100644 index 0000000..84ce19a --- /dev/null +++ b/datasets/Acyclic/1-ethoxy-2-methoxyethane.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 6 1 1 + 3 7 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/1-ethoxy-4-methoxybutane.ct b/datasets/Acyclic/1-ethoxy-4-methoxybutane.ct new file mode 100644 index 0000000..0d1e228 --- /dev/null +++ b/datasets/Acyclic/1-ethoxy-4-methoxybutane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 8 1 1 + 3 9 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/1-ethyl-1,3-dimethylbutyl_methyl_ether.ct b/datasets/Acyclic/1-ethyl-1,3-dimethylbutyl_methyl_ether.ct new file mode 100644 index 0000000..284df06 --- /dev/null +++ b/datasets/Acyclic/1-ethyl-1,3-dimethylbutyl_methyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 8 1 1 + 3 8 1 1 + 4 9 1 1 + 5 10 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/1-ethylpropyl_methyl_sulfide.ct b/datasets/Acyclic/1-ethylpropyl_methyl_sulfide.ct new file mode 100644 index 0000000..34f5edd --- /dev/null +++ b/datasets/Acyclic/1-ethylpropyl_methyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 7 1 1 + 4 6 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/1-ethylpropyl_propyl_ether.ct b/datasets/Acyclic/1-ethylpropyl_propyl_ether.ct new file mode 100644 index 0000000..1c46373 --- /dev/null +++ b/datasets/Acyclic/1-ethylpropyl_propyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/1-methoxy-1-propoxyethane.ct b/datasets/Acyclic/1-methoxy-1-propoxyethane.ct new file mode 100644 index 0000000..e4089aa --- /dev/null +++ b/datasets/Acyclic/1-methoxy-1-propoxyethane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 6 1 1 + 3 7 1 1 + 4 5 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/2,2-bis(propylthio)propane.ct b/datasets/Acyclic/2,2-bis(propylthio)propane.ct new file mode 100644 index 0000000..126257a --- /dev/null +++ b/datasets/Acyclic/2,2-bis(propylthio)propane.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 6 1 1 + 3 9 1 1 + 4 9 1 1 + 5 7 1 1 + 6 8 1 1 + 7 10 1 1 + 8 11 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/2,2-diethoxypropane.ct b/datasets/Acyclic/2,2-diethoxypropane.ct new file mode 100644 index 0000000..da40ef9 --- /dev/null +++ b/datasets/Acyclic/2,2-diethoxypropane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 7 1 1 + 4 7 1 1 + 5 8 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/2,2-dimethoxypropane.ct b/datasets/Acyclic/2,2-dimethoxypropane.ct new file mode 100644 index 0000000..eae2ca4 --- /dev/null +++ b/datasets/Acyclic/2,2-dimethoxypropane.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/2,2-dimethylpropyl_ethyl_ether.ct b/datasets/Acyclic/2,2-dimethylpropyl_ethyl_ether.ct new file mode 100644 index 0000000..2d35aa3 --- /dev/null +++ b/datasets/Acyclic/2,2-dimethylpropyl_ethyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 7 1 1 + 3 7 1 1 + 4 7 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/2,4-dimethoxy-2-methylpentane.ct b/datasets/Acyclic/2,4-dimethoxy-2-methylpentane.ct new file mode 100644 index 0000000..34be3c3 --- /dev/null +++ b/datasets/Acyclic/2,4-dimethoxy-2-methylpentane.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 8 1 1 + 3 8 1 1 + 4 9 1 1 + 5 10 1 1 + 6 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/2-ethoxy-2-methoxypropane.ct b/datasets/Acyclic/2-ethoxy-2-methoxypropane.ct new file mode 100644 index 0000000..6a85ca6 --- /dev/null +++ b/datasets/Acyclic/2-ethoxy-2-methoxypropane.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 6 1 1 + 4 7 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/2-ethylhexyl_methyl_ether.ct b/datasets/Acyclic/2-ethylhexyl_methyl_ether.ct new file mode 100644 index 0000000..c581b27 --- /dev/null +++ b/datasets/Acyclic/2-ethylhexyl_methyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 10 1 1 + 4 6 1 1 + 5 9 1 1 + 6 7 1 1 + 7 9 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/3,5-dimethylhexyl_methyl_ether.ct b/datasets/Acyclic/3,5-dimethylhexyl_methyl_ether.ct new file mode 100644 index 0000000..96ce319 --- /dev/null +++ b/datasets/Acyclic/3,5-dimethylhexyl_methyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 8 1 1 + 3 9 1 1 + 4 10 1 1 + 5 6 1 1 + 5 9 1 1 + 6 10 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/Acyclic.tar.gz b/datasets/Acyclic/Acyclic.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5db0b1d89761f62da8b451ad39a001f3f03f9558 GIT binary patch literal 14000 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 W6B82?6BE>stream + + + + article doi: 10.1021/ci00007a011, Article metadata: Journal of Chemical Information and Computer Sciences_32_3_10.1021/ci00007a011_237_244PDFlib 7.0.3 (.NET/Win32); modified using iTextSharp 5.0.6 (c) 1T3XT BVBA +null +application/pdfCorrelations between chemical structure and normal boiling points of acyclic ethers, peroxides, acetals, and their sulfur analogsarticle doi: 10.1021/ci00007a011Article metadata: Journal of Chemical Information and Computer Sciences_32_3_10.1021/ci00007a011_237_244 +Issue10.1021/ci00007a011VoR + + + + + + + + + + + + + + + + + + + + +endstream +endobj +2 0 obj +[/PDF/ImageB/ImageC/ImageI/Text] +endobj +3 0 obj +<> +endobj +4 0 obj +<> +endobj +5 0 obj +<> +endobj +6 0 obj +<> +endobj +7 0 obj +<> +endobj +8 0 obj +<> +endobj +9 0 obj +<> +endobj +10 0 obj +<> +endobj +11 0 obj +<> +endobj +28 0 obj +<> +endobj +29 0 obj +<> +endobj +31 0 obj +<>/Width 2578/BitsPerComponent 1/Length 57945>>stream + ) ,TGAB4jVFvde3*3"ldx&e&62;H A AM? +M0%PtXeF4Ӵ>TiIU04IuU͉pN_ohrލ_Uj!A4v$V^tvU _kOXI$ ١^N--\uWFKA3qH ffr3"9xN'_I/' 0&L&$p.KJŧӭzOPM*ki(j* ~P^Jd.޽-"-Ckdn&"W\L=.Pm*6:JT=V*WT_M i:-U*IZKnutzjO*_%:Xit|WzJ_]*[0]*KJ.%\ VKTSx*jPItF<'IKMCIΊ^Nt]k/tGHbXkZ]zꖾH)ŨIwXaxvsH<Ұ]CpgϬzI(LI!Q^I.?C}[ izp;$ꇯU+}V1IV:XS WIt֗ +ª WZuK}E5օ5XL ^WT&m4ӵUNa &Ba5TO0U4G D0DhC  0md2df4d} 2A VSl]pke#)"R0Tys! "y}0@`!pԃ#dz3,|f&0 0A0A&ODApশ%$g ),qj +ivN!AL&-馚67IW͢4,&P}v9c?q=7SCXm}MRS]&ߋ[ODvj]C~aީ;jHw'iw'}Ee݅Rpv?I~nqDa EۑVߴ᫸dˎt ia]D{]:]7oߧoU}XdV޿\ ;AzmݴnNtm;z&Aw޺ا וlH}EkWP_?cնWM||7_?3u]Ňm~d_Յ?pߥ}U}]w$czBW _$]Zukw h>J'Z}ީ B)X?%G {Z7,vSkބ-bmЪ]}%lt/Z[ovkq?{}kMӢXƿM n"!'_s'_ 'O_ U~*2:4TV _d~}.kUZwߦ5I܌?]6G֟ .[ V?P_Lza ӿI?{[h߱ i?%l%kEja^; +ie &uFZ "hZKôa$!UbNJ!ZJJ/__a+Jb>ث N☤i}VwiNS%Wi ƛNmSHE~7_NiIM5WiU"8h֌=X@ڄRm4Mk)ndop v } iu>XB?$#D>aV *aS L2D"t.DDD8 a C !0BB#]$ABO=T5=+kIFSf!|hDDDDDFN4{Ib**+BG&l%a/5ڪ5WCQjm~4!:jNJMu Aa0i 0P  +m4!0B""0B atچjPAb")Ual F\o-~%"2{iPzuN\DDGb[2"YQd!"l)A0ɳ NĵJ:u4Uw}Up ڧZG 1_Fyԉ|RDAԨ2#Qt C(Y a2pP`izI*=0jM==ᤩN5I% 4wŢnחnk4}զdj~p8|,*hK&Yw8A'eN,mm&vipDމzޑww'iEA;h6ݑ\;m'I6K(nv_H pe8;ԁ$PDT`l)8Mn''wwV&J_IpN[%m6 J`Ú&0@ +4 50otݑƝv]4{Wm~5kT%MЪ/-Ճ U:0ߦ%KUV0OˎU릟 + + vvakI/wm׿^c]?Z |.Kw H;mզtle~/_K[!y8_o N7̼ӽ=?kɧ _[ӦҠ^L?z^U͐?=?;ko_Jb}:ޟ >_':7O UQN"QI/뾗v}? ' "\ ӯl/l||zW]W/uK[_kۿJ{oݽ/ׯkj׿_M޾0nv-}j032JG]n_ + `_D -S mՆ \wW}Lp_2:cUX]?zon׵&;j. q_m Q(ޫ׮zzn6)I&qM:׷=4ؤxiiT F#AC:KZh4ma:}Z\&m;KI_A04:{KTӠN^S4WZjO#{Xak}wVAZگ' 1kDc4Di h2pL&BADL &NMU &;'ifMm8p 2(pMI 2v_Cn=?n\"4DDDDDDDDTA"""""""""""4"""#{Ȃb [KָD>%~?~ȃI'&ZZ[Nˆ;^Z[VH%}~ۤ\Zie :[ҙy#__"~&u&P_zN֯Ziќg%(@MW}kol%jTOTx_K_`XAzAAV~醯iI~ }iZZ}/ج2VZ*vl&[4Ճ(r ClEI"ʂB"8 aa2"#i8& -lE! K;*"7pv'DEҶ'+0S 㴘LIp$E  Ml&a00=kk[:X]7iOHVAn)ӻwBwQW2uGzȧK8g_+ "?\콮I3*j(<̜W'242 A4Ben Cd 岔(APL U, qa 0 0Xg h3=Q#A Й g@ (kywj5*iro|&&-xM;C4PC8s]7r Avz~+]\0R1ۢvN EH?]DK&F+[$=뒷_ !XƕMN(#|{+ON?v5KWo:N (RG`naWwl(P.L?W w1i{9,ʾ ?HXz _h/f>SEKG`y*Ƀ(?/i?|>Ao唷%1(!ڇA6"LLVA($ʂЕ$0iL&ڧ|/_:O#ߖEijaRn8RU1mmR^[~F߅AK Wa}-4{j_aj~?fh7ת$=w﫶:.S[_.r8K %k [o&:}_O nvV ]LӶc ߘ^ +wunkt$ߺn*Kwi4 +QIAȹmu*ab܈;V/K[tu_]u}&xAAtzlRwVƚuq}Xv[TWMm05 Ӧi4ޚL nI>ؿ|WatKL.7 +D8o~Hh/KDDDDDDDDDDDD!gn_?Iak"n~#%4״WAj/k~"8%=, ]VF{ï^ 㰉Ix?KE{Ց^>D_cO| ]//}Iiu^$fKگ4uVFq˿(gܝɱdvZ6jerDd߯;o_T W +v]FEٯGޖ^)>+o^*+z]}0Ba0]hSMUUWj[U^^ӆH,0&kwMiU"D0Ww,ӇrM}v(Zow,-ˆN;蝶M.?a6n:'_nZW tLmkNoKiGvN'nC]_t.>/}uW[W_]No|?}zӨhAq  B޺U ? W +ܰ/'e'Z]V R$ u{0ȧ"Q8Hzt#B7KXAzX"R>/_I$JAARI I$I% I $H$_"iO׷O_][_xi?$I$I I`JI$I$ $I$J I,&҉c״bg׶_k^s0no iSakCDUx[ڇ;va|Sa8ˮKߴد`cN.)bX=VطVKm- I;ST[N鴩i6AxA1Iǧm5PҲ(P}=vFFڄ4Mi6=;h 46L)1‚a2v^i a ' 9BZa4 " !&a5׵izˑxa4˰A 4a4`ĂiAd-""."""""""""""$*iaVd+G-m2 +k ge+H~U>?_mIRKRr$ Y:!gC^N_l_VwDvtv]ɸL=O +]VVu]/IWU]]?SIo9__kB",$iqOڿ_%zZjZt/Xa~ֿ_8:]5/V[ZLikiv<*z)7~wZX}kmR%[Ko[餪>+ ӻ״)8A=i{QRvmE1Ii1JCS}]7}`ӦIL'i'I4Ui&MAiiGґ H));`ޗTAVMK}X\*cj;Zҵ&Oh4Wk_0z#Z 4wF`JpjAJU0a{@ }փ]4ձ#IvTޢ"",!Z""""".""""""  & !aP@gɛ_K~B:""""*WүttVWUxď^+髓zR^I_I#HϺ=iK5u=.Ы_i:iǪ|h0I !Vh*az /m~)}K1Z_Ai馐_a4˨DCM0B"#8N{5)723;ve^vn^2UT"n VRs-U. 1l)Ot[B$Pu5 +BAXj궄Q?ܷc@it'JނOr;w i}~Co{{_;f5w^y<(F Јys3H +u L qa;%c'dm2!LNgfPGSCI\R]ۤ?O;J~F'i+ddqpEZuYwt\-4tO FM(8Vɣ|w6]~7Mwc7_v}}_N`n'O\T?Q 877~ZM~^]V}_I,%]$onLviWQdoy? NN'֟Ckvp/d|7moVVªMoUk_K -.ÞVҵmvk[ O."mCmm )5&!/KA{QGWbqIbbiJ=պiivIh7iZI kZ}S}tVzaSM4 M5A\5<- ~8A paNiɎ0M{[_7 jkdp[UPЃ,"" (`B"""""","A !hA 0g`X@X0C(a1"""# V,0بa;R.Q[hZD2,CZi)($[,v"hŢ MzfA}Y}4 +v,s52P-It 9PPP a0MmBhM¸^AvD<+E?ۚ#hGZ!ݯ5n'mӑ?{Uz}, kwL;Z%qk;̂2Ov?d[&?t6U#ENd3ȆfA!x%Ɓj~ i7s!d߽7`3ds? ! ! a0M0.ЃYpPU_D*̌d @AAńa^d3520gED 3 8PBTXAՅO];L&~na~!  L&4,&zh5 +ń5!XNA/[ vXOiM6q}yv]޷I< a4_O=;ODrL!+i]}wn8~݅.("]MWvF+"ONj'ie0qEAzwɏ;5էWz|0m+vS;#w~MA7JV{wnwvRozy(ӭ:O鑾^>|5۾ȮE|ܻ}8aID0Z'}[%oB'Luq[Bo_UM_Od¥{zޅڸd[Wd&tl~Nuַ0޿}kg_gBa*Zޡߴ?^t.}}:|?ςnL/^LJAVaֽP_U\~Wj='z_JׯrkQE޾˫ZիtNv|B $O]- +a ? 8~|M?W_u~?co uvN_".=ںՅ/_oO^cyoyh~>q?޾i_O'Xvwޯkq }L }kh>ؿ__/M__~]=P`M\wwV iwE.Zk_[ { /v+n0ie}ŠqvWpK걱_ڏVOVa{[W_iG ح_A:xcM4ӷ{N*)ov~ȣ /@VJTNūh8/iC;޷xh&äZ[ӦiM>> VƝE'zڍNj);jjM<&p]AZi4𭪬4Mm4 /.˾È@ :i.&kP"N>p 馭4'm&[k 8I +1DDF g aqho i[^eU7TAMM5>a/ j4Ӳ  i""#B""""""#Ӱ;M4Z b"@0AM2'aM; ˀ8#LCA`C +""""""#ZB"""""""!G٧ikii%<"lqU-رJ(%1ZXM0꒯Dj!WKaW+J"LD +Yc;PGk1 +S4aW+"1MMW>wDYa<*wiL*i*}UEsA܍%oM?U$zrRq[r3w4 oûWkqG]=ix[&@Mv8\ԍf%A2h0i .j> + n\4D^2HFev dvTlu iItN;n8:&n[ldc~'&{[W}_dž':4ݚe![F~ӠkfvA?Oa]Y"QDVL7Y [z_fw/K7KA? E_ +/֤}M a/m-뫭;\i~}ڇU᫯}L?V_I__h.b4եM7iv^_kG;޿a_mnaӥ xb=dKJPM6cMkiz :M5?W_c_B|U5㰃ˮ_ijG"^NwȴӠRpA0i40im4AIi&tT׆i{u^ _|itGiE1OqjƶUaaVv[Hw +׵jzP#*v 'i 0A)ƪxL&M00NMզ =7tiݨ];Tih008alaM0DD0B"""""""a8L& 4.k R'M6i6j;]5l&1 =2 E6"""""""""""8i[Pҩc钄2VL$NvBh2od&F>¨M2P;M2qd'ii*MivբC]˷%nLq'pSt MRQ[/wNn..mwT. @;;N'E 'A6J^/]o~.a2fq0D"s8`AATB2A!Faf l # 0eB ІqaAL&jqA0bPC +XZ =t&Cd!'=kuu6~:Wkޭl]R_. 'a־ /M'uL ~NKɖ1Ln^دK)(0OO}wtԟA{i?AuduON_ZKݑom?VZ0V0׫ gC\?V ?C[[ƓzV/ka&z/$_=ظb- ,A갚ƻ %iۧnUh0lVZjM76VNh=lV4&i4iV}cwtMݧh&AAMj5NYDI9YTv{L+Ujdo 21 ;)״M40QȍA2;aI^I5N/]{L;Ml&&8a   i钴!ɸM= ꍠjM 2i AA;F0PSVBmꩪF&nDCDDF4 UA 4p4ޒiz oUTV_ +Ҽ%m5-_4v+-"-i aѲw͝қ\$Q]'_ҧ;ï^ZKAMwKo0MsOzүWC3^:!o'ka1Fi>O A# I+եpj6< B׿ P0nztuxL'ϑm6P/}\qvG(jzMhmaK{l>`OO o M +a5P{S:&;" ߴ|vw>3i[O[;S{^ f&5}ݢtKrPޤ?ڻ+/q_ZcIzQy#SyD0HyHDB7g]r__y^Kw CW^α.NdfK6`PуO.E +4 h0@ lySH3/#Z ͳC2q< qQ%k?Bj\TEz(kƃLB͒ 3l``qivT +aA8"7?!AXAZi46*kVEi QXA֜ZwTM4~[M4 ;}t4E'UQJW^4]N5E7˺'']8a-މ{ڴM&բqajiŦ +"0M0: O8`]j]wtaNNHh^R O􋷫Ӱ*Ak"* +dn%uݓ'xz:vJ_䬖~҄|!!ƒ_tdkQ:]_QM;em m/*Zֽv_ w}uz ׍}nPi:[]BIۯY7*j !}e5|.7#iB)u_ &c~S[Ћ_.o ~qm/ w_ dQ|~65J=75k('X"NzOi ";i_׽Ҿk*_#k k[_^ںoa~ֻ^Z/a/ka*e_0KZ.ZG_Qșڈq-;5յA[q\qEڵKuq .)_i[6-Z :M7i4pMki64Ii 4SOZkM6M6I^#t#uMVSJAjM_MK9nvV;kNFv a4 !` `XL0p {mN &M4yaK"ʈ2/jJLYN20DDDDDDDDDDADD4""")ɰVJb7IJ0fwP3ųX(@ MXAvUa3P@A S +46 +kߖ`^vV%0M;oM-=;z KOV0ZpjmNRDai&ҽ.KJ֋4=|h롮TRoj~E6Aa:uH:U=-e).izWZwotii(VXz87ikZ0*HZI÷[ۘ{޵gT^I{cRI-5Jv_LI:[V\;[(' mw!@^WEjީ4=0_kV5 IɹId+"h 0@ݭ=kI*삣GZZmz$;5L& PzK W}נB"H?]W\[W/-'@o.][mR]ִ!jȆ$K;xd/L&ixQ C@2/'ZF@pA/ uu~"/J}5hkv\?^gIoWA~_TwwQ?Idc΅J(ȵ@,fDigaqV2C" V^S=ZNfzFz^GX+5d i3O @gٱ#3[# x 0M318l4h02c2Rx0ae'|R\e aA2p]fHA>·֭('O}Ba0\fڄ, ; +*i-8PB¦υ4 :qia00nʺs=/**Mo@J}K+Zo5NiODjM0ݦ~Nпzϴ}Iڮ MwDNꉎ[M[ +D: qp6o鴴X+ yb}$SjN)8a{` =l ;M%~;$>ݴtam*'iNl9=zOtŠ4NBzڒ^ߠL3}dG@]<;P=$>/&xAjimIŪiCXa؈ +]:IБ_kզӡӵq?°iJDD\DRQ῏.^pƟWZ a6"# u{{*WUXӿ֐":]{uM` +{'a'B/'L Wuu[^/VaJJ[m,$?8nI뮭P~ . :_~N4}x#[zcAE+DWֽ}ti ]/_a<,CXM׵j_߆;_}$߯Պ8˯ck"/k0.KaKW\CX+buX~[QMݏƜCkcMi?M>pa+V8nӽ? | x7Mݦi7a*qH4ӎ)h&i0i6M5j}4m4_Nuiu;jEa +[$A &"J BvSxR0jJ4K3 &aF`C""""""8BDDDDDDDetW!*KuE$Ge)d5"8Z%8胔)qPPmHLd@8M#^2pimBjJjSIPiWI+mMm%nAaij6tO$\U+krcdVdQwzAѩmVDnO<']^/NP~.4;8֪^_I=[K}a|.վZIvYIWK v^1I-{n[fqڠ Tg>AKT׬ YaSUMB + \>!aouRkP^(]_ Մ?{kz_a-,70ޟ]$ӿ]w]6r{ID]>vZ Y\Vޑc0u;u*ЃB&OD־^_{/? ׾%__[_nDM!H٦O#+Ԋb®tk_w+c_ƿch-iZ+Xa0al! jN>+/V!q +ÅDF"* """=^ߖ·.TvMMw}k=_MWNE;}{Du-ifd4_O٦~޽:_Z[_m7|?_qkun] ݆0VWo/zLZaدح~**^D¶aa6OcK﷋Ȏ=ث0)qȑoUNM6.;XQqqwڰ¯i+wo6Mxo z_4 oK?oL ^ow|l7+_N*o}ݪ[~ۺv*_4r2=m$[aJK0Vz[kR%ҾҸ4qi[WNj, j2d(3Q& TV÷Y H AA0΃ +a6M/Xi6aB *amK  +tia5M=wa4 (p0x +.Jhለ |i'u.2#I' ] OM=[[2K[sUyI(pI:O_]UXJw&^.ˢ^L'_AG\6 ޑ?u /t7206|>f>0 +~wuVK  +yz~Ǖbmt:T뼸Ӌ!Ð>% ~v9zqЈuIPt>AQس4WkJ4x+iHW< B +~ 8&33;.v;($1`t0ximnR)M; +M4L*wR {wB_Im4*kivPі;_t:KwK_Iq%anv:#0Fu$Bwﰕ.m6zjJX=};㴸2oZR% 7I>~;^__^CM. 3U?SIn@կ_鞒I4I +i=&HmVUZ +FH +.d! 4ȽUR O Lx!VS3tM +oB $'MRIPGqYA)@ˌ(&aP8 @h0@048f 4 F0a0 !3 {T-*I4J[Hqa> M$[M4ia4a0AaB *zL!a B/MS&h4Ozkw&MXA#駪馟iN44M0@ µEiLv. 'wEH;wDᆚLz'EۗEjwahvEN{q! q ۵ 6i;A6h0Ji dn m pBW='dpEN+#i%O~ץ\h_ômo[[t׻tL'd?„ut Z6Ӵڧvdž.I'/c~U]~+CT-}IpZU{A~.l?#&v!~rq k&cY~/׷_ +Ap_o>=~߿;'YBDo/iz 'H/o tC _O]O/7X^a޴__k_}a(waX`,vOkǯ~ عTWLUPuث_0´ aok_DtJvn{inWwQl\}ՊUNӽÏkAGO 6 ⢐tƝ6)4M8AIRh4MUһO?ӦJjACKi SM }Vi]t&$ & #4Ma}5ӵ+z >o +M;v0 '!0B""""""ii0A2@adDDL#D'ЈF""""""""""""""""""?X-rSFYL˳* @"((TS +UN;f+;W]G}$ٵY;5:2B6 2\er(,#Vmȋ5Hב5Kd3P2* rvF2rCd]=20, h4!h8 "xg "hC3A>0 ϳ.Jd,  0-4xWM0A .0BaoN XL&m4vꉻN-;tNo}4iߧj&[D&&dz&wA:&EOmv䞷qD&;D˶8zA݂8z67c83tႴ]#d߶_麤p%wvFaIFzړrYdqZq0S<.;n+O~XM:?ޓևONk pMxm}帤]V +EXU㡎t׺_O~޿ZZ_Z!T_}_qB_oZui^J-' k!(èiH8,^eC_ߗ/_D8ii]|/}GKo''?AU\_?٧֖#?k~=?OֿjEl"C#"CTt}5P:]_o_Ҥkc¾oΦs:DC!8D`gAdvf53(FT1 i4 k  LxL^$Kү_b^_a{^_>jis$ <\ &0A !0 !a0BAZZza[kwȚ4K _jYۯ ", OAh4PL'vT +ӹch=o.?XxOi4|UD>aci6?cVӋV-踸z8|ownq7vƂm -t 5VTMi4tOM=]XM6M 6 7:w+t$i;&N( dܜ'MiuIIIAX^ȣjm>M -iziB D#v}6ȮE;Rwdo\rOC_dVoO?{U]l&ih0+a +jkk|00_dq+i'mhw^:+1_xkxcKPeL*a0" $NvB %  DD0DDDDQ3;Z_"""""4""qI$I$A$I$I$i$I$ $Ѕ___m//5ueI$ԑcI$YI$M$I$I @J],I}W6'U}oh$}GmOOy:'ujA M5t_.Յ}ڠޚ]4^_}Oנ`? +Wkș0C.~;m%Z붗R&uOo {KvXk}^⯥r%hkqըiza7Mi7Mj)Vؤ¸AtӍ6)8iփM= NM i:m&M4ta]K4xAAޝ*Ӫ׵JԈ?kaM2p d4@bQSk {wdp0B!Q4L-h0 !gfLTU#TTV G,ֈ?a4:d;4C S """",7 +0aSL*0B"""""""#[_|*pqtXc Ir,|?A+%%[+IḭPw!7_O޾?w]KtCdlLRN38gf#ZO[.o3DtHFfܶM3lf` 0Aa0XOPN  #p00ugAq > .xBa0B Šh=kt?M[PLL!0 +h S4&qvqvrEiICӊǿڿ[j\{D⋺'  zdzD﫾zN7.2?awD},,E8$6iݑ^TPW:M%iuW'dpDcNxt]%J^^Ms٭L&yU[/CWᏰAL'NiDSqO% s0ܕU׿coዪM$wW8_M_TLJk[^=^SRR? &jUɃ8cKN۾|w] z ?T_qC{qE n}WRuQO2+_tVYzSYZ:5n~iVs:aJ^J @fkgFHF#2.Ee١0"l kkk]+_; m}&vdb+, d>),; xL3;3Ev`FqOL3` 0 isvɎҴDvwᄿV /UiwV_OҺQ) 4N)4ld40B */A<&x"„.„-4„W]U5Ӗ?]{qME;|0{nO#|ASi-p3A4j-0 vS[ މE1' N( zl;b׎8AůquW[ +TN4]9oht^7\n][jnȣ]=^[KTvh:ji#,&Mh4:tiA'Lh4 ɏw..hi)i(xwRw XdCvWUp 4S;R(֚ja4tMZvVk'aI6蝶+{ۮO: ]Zi_O>Ԝ]% S +qki- p 0UL-Ii[Vӥ7[6I7|7?z-}ޗ&u<1¦Aa!a(!h4 = +AE"""";:oN{C !nhzk??`-|P,e/Wa_ɊZO~?X_·DֿWODo.m_N%|?V5d6jy=tڇuh=٧"k+__k]kna_[7Y]T: +q~ i:_x`x`+a _/ouoo $v]|v_q}G_X@ovKݏdqv;^a¶r&]d}m_]mm(k&צzban*)4{ m&i7 ikXcbM:N*)تA~vM'h0 i4 n>VTtm'M&m'TյM5 VSM ¦%ajBTvGFh0@u%pUJNDQgb""""""""8L&Ah4MB" q@"")5 `DDDDG#Eq^bmSa&.,t#Z|\[˙d-ɰS# Z ,A=Bv ja{պ--6h ]厐A_t=SWj{3M$ ۻj"wpQHi] ɀgOv0Ψ$D3NˑAiaM. Ҿ#4b 0`3z'V\3⚙0 `PPB0L! Pa[e̗2@pS \a<-0` a5 -040{M0qaB&izL._UTдnMwMoDOuꝯa-ov owWAE}ò+#&ޝkN$=\*x&KN+$>7W&.tA:vNj7EڛxkDAN;"towWdE>>p +_,u2 LdeVkGd' I9,"YRL<)(::ܙ5]}^Cc?(]ݪy.E$&ST4~]{n }I]_]am%mtv}n?|?O']&z'O۾E7a:'/]jOL4v߿߄F;<7I_Nڴ"??נ_d?i-_N_]_8ߘۿ]Tԍ_>7j_͠oIvu^iugלf*g31{4x>wfq.Pe ’"!$y7k_'_75v׿4blCA0Al04v4vO_Nd xN/3A O>1[_ Z\ lkҭV}}C48[zj;\ a=5L(Maݭi~ A kkzҼZiUA6mޝݻMn&DDޟwŇ06\2?l\CHm.+)mk -5M;i6Aa4i 蛷D%m~aN$EI a{1NOli{&c IM *hG !I! -ߥܔ~Fn_/׼wߠMb] %wdkz 4dJNta`0B_WzB ]vCWKpwZiF0;3 &*dao :<[^+׏޿cߌw_{9vd8Ap.4 DC{>AjaDDDDDGZZH7n"))fׅ֟$Ȏ7o3}^Xo$Mot/4XE__+}}w^_g<l_ ޫ]o_~ל¶_V^]/kﵡlP/^U㊿E=}JҴq}w⭦KN8)Z3cCu[봩xAN&N40C__IWӯL ֵBpvm4զ֞V֚VTauNevpa0M0͈4bXdS['5 *v8M4"%hi'O$4DDDDL҈!`DDDDDEDDDeVsSEyfWš +M$Dh4N ga|T e;M L'߿]$^izȬ0P.+sL-P†#n=_2[H?#mN7]Uioi*uxarr݂.pL*S j+|0*a.f'.x`iu+a:MQo]$xaONOI't'm~vBMæR8{N7K5_zi},%$cj_ᏵO\kWq] 붅m׋JV!/{ %%,90Ae{~믑 ;);%%̡a '"%>G\3"vN驆NH3z4 +lD S1ef?/-~KB_m_~BI8AL>PIdXaL#M!Uh4 ! 6&~ oc8mm߅ D0cL (@0D8N[ az]fвBԃB""""""=U,osX_x}MM'o괭Hoy7&_Yooo;h߽_AX[|\I7mӆ_A*{i"]iii}pot| ; A&]H+AkqQV|lU]]k[]q{QQZJMNݧN 4ۦ[h&Ip;⸪ti +߶*4RvӪAM}5 Z5N&TM4S +-4.aHDDA""#2p=M©' + ;M0 &-)s¦0DDP@""""")="""""""""""""4, 8iu,46P+|N OtAK:xi鰚Avdi0NBdJ ]n;,0L&*`""#TW_V5זi*NNR'tND'Km+WU2RFF$k+tG_]]]ȬV$ +}ԒYE jeCPFkgE3Q$˳!dr2(0 .d3" @3af^AEo됬9ltF ! 8DZA<';LT!. Ag4NXA,5a';NpA +O30!`L k-4M=ADD&aBgtL*, ~OOM4=Uujӽw7o|x6tH}K˾'w wEuywl$^0:'p۠Rz}WoD.wt+o駯7V}Gdp=u;'IpZEq#dASeU'yfOAJ[%zz}+-+j^Ƿ{s;30d!0h fqNA3A#ak%d3 !"4g t]ftilH2AD9$ h}+%9'On_Oַk!ޝ>?IgPG¢X!xL!a PXU0i@L&!,&x: 0T jL 7^?Z_Az_^ja0&;;-M'i?MSNӾMo kmo__]_ I2wY.m.„\0i'I IIHnE-|ˎ.(wk^ u_x_oIA;#w='dL>N'ݮL_RWګ{~?m/}{.l'ZaHO-Z} zz=a={[Lw_N_NVa1_o_w}_8k}/;ozN]P_ݠ}Nׯ_i_MZk_b +Y_kת [K~K /~I__{ۊدk}]+w~Nm)#ŭb6r-D,C֝+N?EEſI>{wد.6ҰivհUxmzoM4t_,;יЯZᄻ]>q|TTRlwL4 $k Zi/KW@_ե]9qLkIa4wM{kOM;i0l*Ӵj׻m/cunK[ 8aMН4L&t'mS +[IM44[L/d&iM LD&mcBF[KKzLVǯ{ b _M~Th5 4H*"" 081ʒ6a)=4)4ӎӦ68}iyW\5=s0v0DDC0DF^S"#CIaSm46M4Mӄ{iZkVZa:wkIn¶tat(V?m.խKMB5jl]C +4U%2 +0 !E"""5% ` aV'hhD08Av>)/'w馾&¤ӆ(H{M_Iu͠PڈTPN DG,dldԎ"XfIyI&9]/ MAS 0qNuõ܌û[^0+wuӴjar"$ \U"8訊Ћ;(d4Ldo0nHB8a54, h0DPaNϰ 4M ! C6ia ;AiB<'„-SB-0ڪ{AA5L&zڧjrէrމÅ tMH.}?W]DoD v.$;dn'IA]a2N mwuM(wDމDEiH>zx'b%'vJ<%+ۭOn]ޤ{P4WV__ OUxh6OzVƗzNm>_5L'ZIkuoNon}~:ޘZZh%Ӡh'c@AWTmzW\1j׿D-9Dea[^e]TV4[UaK뺶P/[[{?jtO޶ɫ&G[먯 ꕥ{_a0Gm:7I$(޺dNim ұC_4 42>'?WViI$߳O m*[*Vگz{O_[u_y1./Hv{u]u|Sᮝ omdnulvKՊUa kQVQ4bJm^[^QN@pbj44N>)ոӊbh4M mUSA4zxئm6iݥڦ7 {5Pkk >iV 5kjGw\ ݦ8aYxD P݅AvM8i@d8aq 2DB!N#&T a`DDDDDDDDDFȏd XA,!q?MAK~0K,ŀsh8 4(D1GuF2DGdpD@вc:H" i !ZՆۆ6DXavmD%8dd?G:% 0`",<5'M6OAv}ށ!ȐO?oۤ  {uwo6EϾCu[N4=-s3a4PYDܚ3p,3 n< +qǬ{z+r㵨al(P{^}_ت +}{߾W__v&’Rs^{k{utչh7zb﵎=}Z;ŒHՔx]/8όD" 6Bn! Fx @@ύ'0C#Q]΋o!l• ;.Ef)yPBAvfD`i3` Ϛa0SAT !{x}-X3"%D,z,&vwMPaP=5La0Ba=}<&B-=4 ^ CUwlj* SMޭoOEh*'w;vo .ݿ5ww.)v"n'\Q;z&>N$aKN{a/m~Ri$-a. _\Uvý5aGi:O.(Oo.=;##6ԕO,Y'uC0a mD$݊T6*D^ԔiZd{ ۡoOmG6VW +մ + $n@dtK:v/wU^]/];-/O[ ,/ /p/?]k6 wmW !-~"""""" B Aƥ)z28__uP.5B/,&O' ɫponI'\"Q=L?_٢K>sNy?Ꝛaҿ'AMm^W믿zaH|5Hu[jCN}X~,aka/[j?&uu9?a?4i[ּ0Ǿ^{ueׯ?-Uv[[}بkiZm6XWc[|{ ~O.OTڊbMڤ꘠h:AݧMR ' ըOiVMi۸iiG^鴚i&_;_Nᦙ(IpO% aW;&ie&aiK +54  4.GL!ih04L0B f DDDDDDDDDG.]1c'D343y vb+a0a4¦U]&M \*\''^}>K{h=9IJ5u~⣪ꪹe!X9&hw_U\%$D# h9(O )$ L^gjc"SYi~U3AtDffTNjCi'dr!2>h2D\“"A2TۚaeH~qg2\94 =L5Fl& #He:'˒2x&C>hAa0!XAiaݦ!ʋ~t"@pA"  0L8Mt0a0C m=U}Oa2v'~|/-wMk}}a L*a U]]{MmS4Dݵ+Vw}m '] Mfja?ONӴ' E UD$]yw`N{a I[E$8iz|t U7aMj^7D; m; +Aôdä?^Mwn'񥮪=R!蝷ȣ{ղ8vJgM]z~J'a5Bct?IT**¤],%ZK$zi[ ߿_qVe ߱Xer.x|{mz]o%A-%ǭ-.i}P݊·^?!vQkjiympW3Y#=_7ZU*ӫӤ%_} 'wa5Niiƛ[m&AjWsrD/X'.9j7UJyCA3zf}WJ4UxڊkWa6h4i:Mipivm54ȣubo:=P=6Ҏ^¨J:^_O]}]4juM&NmdcMWk+L-AAt H0 鰺v=6m۾'IЄUE{^ ZHW$8u-^0Ɏ;L `EDEA.4C/f#1IUo^§Z +JꚒUI馫R8U +a a0L"DDDDGҦ + E#D]L&*j L֚i \z &""ͅaq"";+kFh6I ] +ruTIzMUT#K֓!azQ)\ yO왑A1OeLNR#2,_wE i !H-~?gaL+Qa44MrR;)f=0A iއmeÄjjkz{kJצ鮾[}wozot\]Tvnk3Q[NY1qxΈL0K7BxN 2S'pdxL:+a'"E?{҆&A *v\&T&L&j'xMSMA{꾆ZaBap'U8W}J_}W|P&&;kҢE{≻[W%%2A$H%"Ғj0eP 92q#fxr'x +|WI}-z^KI*$vV_m+mEwV^mD.Ay4\ }aJGCK<(@0L gL!a0Ta - U'#zK$/$SURI^10v7s[q3♌)a0BaB  +XD Z &iZi5 }]UVVu6-W˻ut}45 + AM SOTUO7j'vvl;'yKUWI%]_ $~ +âA_\*n]{P}Nm ˼i;"dqIGӫ֩it]~T꺦]?:6P-ڢQHz%wE!wV +x+}%};(mGJ>{OM~u,$}ux*T +Oh7 K#{"=;L'daM_l߄-O']}iZץR]VYpO}{rx;Ӱl}W&/vVjNӪwl~ ªi*a.5PɸM0 N5'mZvC[A[Z&=ӆ0a4;t +w4ԓHDt2JelPC  0AI0Apx !Ab""""L!z#"C6d DJL*Q+#%D0B"""#.Q +392V)B0XR0SbJ.J@tύ0BaD턡B ]Mh'iS+p8u7JM$M&,OMSa]d UZ2q? +t;/6˷VM0i#?A=_ڴND${Iպ Ijta&/?Up`*mҥץ#H*󧑦y{>Q=/:ʸT3'3JǴ0HI50A4$a4&)n4!˲vylPaN>L #[֩.Mt(tP}BaBir$Zi~O֪,|auhEƬ.-|jiNTN5Q_Dދ:wMtI[j{[ +N.[&yk-R䇯'xj~޷ߎՊifSeW+yJd~%ʴH%(U= U&ZI"PF?u/(>q|,ɠʉ0P,-j%K]z^WJ:K\j__Nb+sapMU{]kҭ.^-tiuuCזɿZaUWEK%_%^ת_K]% -";]-t}z*ߓIuR}ioO~hQ9O.տ_UҖ;k^_\WG!-]^Nkǯ(U?փv]*rZuUT*ﰓl5q&LKyis$@&aO Qg4NDFgPh3<.Ha +a3N` i޴WkM0UAv &j~wan0a0L`;20g aA04[`h0T4M,0MDDFЈA,&!!pgB#5L(Bi{W7ݴ{DEBC*i[Ӵ^\<&NxwE6; +DziA&y-IR.'Dh)pƃ˺.NNͽ:.~/%t-+]զJھ_]մtE{#_I?%t-7KP ixm-|^ap +>8?W0z~i}i^^1acKA{o9r?B/P"e/_.B {kq_߷eR%茁J?[o_iȯ-s&[ 250 oDOu:o'X#/?ڒ„ŃMWi_}m~ [$_uAھp‡k3; +E]K7^׽ۼ/ml]դJeh;_xkrn $0a&<'k~aK캮)uD~뗒}KǒzO;xOƛ1 Km;O؆ե[ O+T =i;Np҈pիb4L'[QL&^*+-S&Zwi xڧ{t6'N;IvOBRvt&dLhgوfٌ{5ie<0hPf +t_!(Nd'9t;LaxiM5Mjiڑ]0+UAd ӫTm0|h4AST¡ (L4:@q + ͘L(@ +-" j +E{" 8aBh4 a0A#Le NmP! !g<&LwcMS Zijki ApZih0DDDq +4;oa: Ftm~A;]5tN+Xmha.-{ˌDDDDDDDG $믪y꺪JhV'].hN1ӿ.>˷'evN)rN0XU~rw^IzZZIӤhۇUǯkwNzZA^u[үKZ_J괪_Rc_Z괵.tK_ZwK!kANitJJ}WKཿ _`Z[JUnUUZ_nvw-%J.ZW}/_^'?uF%EOKK_UZ,wO}w^-8uZKa.up]*K tҿb&Kz_NF[.;PIc\i)(7[Xa-z],%뷦4bkI ++X$:cbrCM6vh>k}5 +UAi 酆[ U[ ULW/jkOjYmUvHt^ PD& !QTa0OL(M4BM5M;PaSLP(t!!8MS-•v0M3"""#CT""T!{0DDEDFY(&EXOPA"u*,UZ_I%/v٢hZh4;;I +3=|uDDVE^`ΑI 6J":Ֆq3"ȧɸ 0dAgO.Yc'` 0@#4y`ʁ>] 3 9C0'Ya,9D8 +vH2BC E P,&f0\C xPB +(CaA A`a0 06!m( +Da]Hr!i0,'a0a;L&kݨTHtM^4&]v}ki_Wp]KK˸Dc vEh0 T-vhvCMܜ4N?/.ޜ0(p dm%zApւ$(;[?Nӊv:RLh#>tԕ__RyVa?~? Cëu|?P~dSto}~vi}立N5] jR[:#/mb}f?P +PMq_;)=.ẍ́ L- =E_lCf d0A3ln١gA a Ʋt&'/Z';^^/^~ ۥO 4M55 ?a?c އ޿X_X}E.aI +mk`JTM&: W~,w'd }=6^ޡ=k*I-/]$!5VA ￵c_ⓧ_Y:_Nm"6:V}KT/~ ~DiZ^0I_ZjGkݵJtD)[Ƹn%IzU׻l i5دӸ4Ӵ☤ 7oa4ӆM_i_o~[E֔WXc:h&}7L'M&itkWiu]]5گ+],PK +ZI}*K駠j{_aWJ"kFG /W-'Fi~G筳_ۥh?'8i iM"!00XLP3u=_w *r N5n¦0է}MmV-+a2V0&N eTikM?5L$%&iiUWqI۱pz}|uU$>x""""""#j h< ݮ OAWWh/Ӯ?i6תMWUSXa.Bjݡ5[D !AStn5LUM2WT,UfZ""""".j6\Aaf2h0DDEDDDXB>DDDq& RI5uE(Et-#'3v3!a0.5%!BՕ꾪C0ݴMn {->v~ݻ.Bˍ:ˇ؍T~^E5XKU]|OV +HJQj"I!E9٠NcL`@AAiiU]$$웚xA ͇A ~Bm4 -~Ӵ5N4Wu +}%~'KiikKDǴ}"]ow l]WEښ1H\o1軡'EEÖEŹ%MZu z; *Ҿ.,waUӴtMo޹8{Kת URZ$oRoKM?Ʈ}W.i׻WK@_KK-*LMu/_%=c RU +u.Ђ^[_ ]~ZZZ%n_>caoKKRPW{D](z&?ZkYBKUZˏhIX*2_I.׭tRA=kO-/JF,vW~ ih?ZYt(C"9/8a6iGڶ(tCXk.[5)n!]Qbkt!},RR& ߠiT=5ttM:z uLaUT j^ +m&֯Նjk¦^aE.a0C5ɾ +Nm2nL  ÂH38PL&\&0  jg +""#ЈN"""""#B""""""""#IWХ0)qU*aB價Lj5W8"AYA ,Ce]g\жLaNjO+C'2@6iMNaa9mm'7z 74[A]a'Lܷݗ tpoU7pM?[i!O}oڥMsZ*tfGѤif3fgxxxi)OJQ{dfJG0g03l=!0L a L } 7483lͳx ϊbp>4 υ?إۄlZt֪|4M4wa4[M [M5M #sYߦS?(ܸ.4gR.Ǫn֟>֓4^kU;>Ky>5M +kۢުhHuTNFkqj]d#tzoKIk[t8VqumChS{&:4ݻumBiݎuKAI.HWd;턿{jAbi{B4KivT^/w[~!AutAScz 4BɇaCq OU=7$#Z+K7e-K'ǸLuuo"qV?SM]Wg7_g5/着L) "609j|0-j%=sEZھr{yׇkxOB*!wʸ_ئ+N8 WDA [ݵWj?i:Nj4 *RqW -~[[ŧiExAn YCQIƜxAvA4AVqKI4ӊvS pzOV]0!ӝE ' 'vBd&ڧ ?N5K_4ߦOݯp[A aab""""""""!˄hL'A" a0B!Dw;iUۤ^w $k}t5C80Vֆ?g0ՇhSCo/moeCݴV#QD^#h)㌇BR!kGa"Ȥą"AGju(DEFh5PͰTT^c+M'o -KA_Iݓ¶t%TTToޞz}I"tV;qkI$)$I/޷HiyEfyl |0kG EϤ` /Oϋ @ L&^tv!Pk &aO 6&n0 T§vj OaS0 zv Bw}a4ma4AK[||m>.z-}ދ -0oCNmpӤ_E'ղhhL:Yl7ۤ ItXYac(/~ݗz{if_wdtZܻޭxu{b"""ў"#-r'ߪ5,|6>Ocu8>___د~Lsۿآ;oȖof݄T^j'm GTa/9Hi|s;zvA^]"}57U]y+^S4K/!{_m6WQiJw_/Vob { +Tmm5h4ilRa{0_\5aƽwƘPWxAצ5{][NVMSڴZ% 4}4PAPUNQkkSa5M<5 -w9B"(D\D8B-L!FD8qq{5P҆ҪJoU*I*:n cH3*n1TəDI DLiJ-`3Tm05R  _M + *+M4N^)'-ܸv +_ +֓Uנ߫k{=~-y Upv(UUC\^Eq|o +ޙ#"B P=`gNŅ=fj?tտ\,u,vO #ߥCwaꋄ7 oa% JӿXUoݾI}$[j8O+,iKI_K>rz_jVQd VֱׇUBX_zҤTTzJ*@~u۪שW k׾ֿ]R@7ߤ34g{Wa.%^9jFDLݤr}4N <8oNYԠ3TE[[iqw#+[jI.Άf AXL& +E[VI85j: ;MnPP{ծ'UN骨U w]WH$jaV[ŅcaiL!a4"DD0B"" a3ZiY'v rn""."7+# D's4 -S)BﮞHKkII$44#jtMr=JHqVD i @ɰ~BFC2^42` +qd"/" R$F3Q6k $KkDʈ ɎߤM.۵.NwvC;#;W'I;Ii^_t}YY X"Hu5&5;HGAłe„Ax8;oJ&㿧oմ¯za(~SL% wҏwo 05V$;D Z8ta+n5.-Ma ?^,?ݠ %mAO} n鯓z'm|/Alq\Bm˫[TR^o#_zUxti? -$Av^ +{']P_]rP{ u~CY;>g-TL +Pd"Y_ƿ +h?b7D/nj`BCwkwf3431Na`rvn1{>( w%'A'wނ4AYчyǭz,wEhOBjHa{ UA'^i7/3_3_W׼0_zl4c\u]q}mf5D߭<}vZնz/Pm݆ Ax'F}]kF5~ 'v?TM'EZl+i}|0 +w^Wم  [>Ի׆W0-}zVRC]ZcWA 'd{ z vqqxj8 co]/uPJC][$mmVҬAEWiiU67*AӯߥH\B\oB 4 ~UKWiktL&44OOzڪixnXo+kk뷅oc_ZJTO6 MAI-G5mv0 iƚJ¿*~?;w\xtZUJ^AIM5+iM2N LL a5aS% ?BA &uR.-UKZ_խ.i50L!DDDDDDDDDDDDEDDDG~>Km,?UiֽW"VKίotWGssѶk⦅7AvzRh|3Oj +Nj{Wa>a_!/vZTҶu 8KZQSi,^ nӋOMSݿDŽꡱV]qM|i{ZtN N -;p* jtu'{ۭU0[ K;SAfU}5S.2{L&aS\&\06aq^q^Y#MDDDCXB""""д#3DDA!`HEDq B")虒JVUw^UET0 B4" U0-RE `ydv(LDd$i +[ j=;]WlB feލ2h܋W &wNk^ N>4iWª뤽HלאYJOS"N2(3O$ rd4zu".1̨"|eO,s #`GFNf42 yvfDF'&h0A $],D\ fx@A 0a N O h5N A !aUAiT &-P4Ej^wSio&; _'i'qa> D[M&Ewz} A8r*{TMԛ忰ɾ^7D᷻ +]N ui8`]wڦҽy<|j IۗtnROI4J4'[ײq +wMֿ˅7ӴtVV};O-m5Wooخ>ӭ=>[]U*_Kau[K~Kֻ=ڴ[ IL+" N4zo%_u0 ڤt(+̣^3$T (^z-E}4-~=|+x]o]_i$H~XDcvN7`OT[_']ǓsEH.TȯH D%Iki*Z|Gh~0ڷ_iz_a+]_{կ|=iuI6KM-$C7{Twu}i]wկ][+ oڪQIKkaazKxMaao׍ئ+/v_f~@K;0@*o /⶘MU5 zACJ)6:)7AM>AqihZiRvM+ph0}4wN:}Miinҫ55F:xT +Ӧ}}aAdo -ZZ&&MiaXAPG i0A  `DV;ᒄӆ)ac &aZX![߾r/b'Ⱦw"l(,HgDDb[בD|"f$ÄCLgc̆ԍ0A 2s*̡~j +"ٮES L m%ki"v}%I=§ik ސ@CVy1KFK~A[ɿp(nE$UaUN5sb^~IЇWE}} !}_*(ybub:u/t_x_kS'}iuN W%kS,dk& ;{_1\_PpUISXU[Z_&vQtm2!?fp 2'˳3DG`hh3B 530>h31 1}߯/R#4KI/<6g !L ga>Z 0B0hCPATPB AszwZU=RCpPBT& !a a;MS +UMS[ODދ{ym6ӆvXk,g+KDo3 t\3rmSCC7i:imv:j֓NN(踶f.EDMṙVbVVil4ᄯMmWW_cpbC“!|H#JN+dqa$>IvM;5jxTzZ.iމݑ`+ڭ&J?dO}ktoA&{nI ҭ +w |0L +AM[WPiMtiMu ڴ_'6: d'8C7C+ C&9]UMPfAB"HcID0 i Caxc Xa_wtqï]^B%/nFG-z/I%B!y=8_9.o~^,>瓶IUB|Ө]x_}pI; B)ЏӨ׿D?n(A&XJ7/#G?A//OK8:-"!jgkhHDkTJ-4:a/DZN$*};A.47V9WI_ ~䜍䜍i^In>t!.K ]Ge[%Hu[~1jAqubV}kz_ZtUTWT.N׶}~K[*v}o吣;NlvYggn]O-)J[0SQ^]g[M~[J' Q"mm[I}d?}5Oވ ҚݮbkBvtHD}:A_}ֵwONTWOz] +ԁ|'~u_P_oB]7o.Lz3<g0 4KMцh4/5~hu." xZ&fmtLvi{o !únӸa B$]$4W[V_o +ߺkbObznx7U캾>׿X"@F47)4SUV׍6=aȁY,8׾A5V!5vKXبb?K׿j$^q3p=qmO{XX4¦ wAi 0d^{٨o5[.8p*]nS[⺊4!Zmp4MkNv&E4Xa}p W_=}{ic)'9_M6馩5udoUl׆dnපF<00ꝩ12pa0_{iɻh/._Ra*WHk i„Ԋ&Aa]i<h0L ЈY~?+׸c*]UoT4I0XDDGA[ov_/TB DDPAG^Au\$J0Wg(_ׯ7[ ܨRJK\yŤs=(z9oaM4}?A$$kM'h<*xTb!vڰ?O; 'jJýl/Ҧ ҥoCT+֮iuA؇m'>=? +endstream +endobj +32 0 obj +<>/Width 2578/BitsPerComponent 1/Length 35101>>stream +-S! +% gH؅؆:0~6gA͈p9z0BaB hX!h4`kԡO0ٱ8aA/[_i-n8U +AUSOMSOUKBkOM>i;Ov}ˏo'N-K&HO/RWOi6'ikDߣemפދ˴M" ONKd&ڄ?ج?% @aIAR7t[u%opۇd2YO{A&!kAA"5 imvdpI?ktZM߿uZOy0_oVzޒWO +jW$;n k}ˏ\.CWYa'-G`][_ o_ҭ'/tJ? }_koIaqO֞iBk?oR/wka_ӵvM~PZ/t^]a}(=n +N󝿷v_ x#qu7_:zVȚJ]ZKŵI[CCҼ_qR&`wi*>/[X[v; XW7Zt*b5+6tN+ޔ h0SiwMU 64 :IaӺnMӤm'M4wOM4i׫L&E;#}+M0iLAYCt ʨ']SIVjI2N a55P A0a0R0aq4M4i.g !!6a 5-DDEbhNM0A"=QZ]/ *cXTzi4 O}d`!36vQ[A3gC;DMa4(M2N 0 04Q0B (A'5R((A‘, dA,0d2 i !g!:a0DDD2 +mM;OP &H $'mAՆQ7nUvw&JM4ItK7KHwtU^JOukzapߤ{oH=쏞v%[O8$D&q̐20a`r*" \``E0@32|͘A?+@:d S4f3@34 aB k L , Lx ٛ= łia !v3&!Ǥii MSTTk5ZiZ~M"cL{uHU%LAkex 77a".o]$;8m=CNNHh&G^^tE`vvAX8dq}J-vwim&L }J7S{dn){/앿l2nAN]6J ewdN'5{XO}tCOC]:mu}NƟ}6M_w_Td;%DXRDLS‘B-Aǃ%-ڈV/Uj?vdhSz* M=Tgi0Cf4!6#h_/xWC +w_SI6V:iM 'PitH}⽻D8 ¬44wi%mU +atI_Nւv& |~J~KKE'nwNd&I<=}uAdWj8N$>OV9*:EG{u{Io=]m-_az:/ _}-]W[u05׿n){[U__շTupЮbNpv{k"inZֿ qQ /$Ff/zKLL9GjQtH"-b]ķ^ڬBtpN+6viM`UOM8:~?^PBUNt!M=B?W v=8tWh'Uii0 atm 5O8*4-V[=\.KwI/A7pa6Vzh=iӰmSW~5G +=/a6ԷoE-D#j֡ ZdnM4/h0a048`M84i,&B ж\.W%u^PKKI-WL~U +T ja 0XB!t""""""""""""#ɼd['=z:uKJZO__uia0B"""""""#7ZN~t:G~!DG`/TJi-noU.IuTR'JU ˭/B*ީ~R_ ITOMU ? I}$GH(:J~GG^y]ZK^Pϭ׷i0࿦Kpw|io݅V=AiIZVںWݫiiTN]qK NՊC* ۧat tIM2q긪Uh0VmuXM ӧ /ݬ/ va[0#T}4j˅Mh/!aB DCNXCD0a0CAЈDDHHD8qaq%Qe4MOę/4IR]B * hF?nuh%(kJv:KYΌDZ,J#JD>RwD2!L)ۙ@ДjML5 +O; amoiePaaM D94i; zd),FYgPqTP x1M l4ݧB+i٩h0 A H|9P0A af&OUox N}rwH7\OD=^1&h300AaBi„K]^-Ix6r..AzN1}t M0OOON;tZ6 ?Һi'Mh;ON.*co߮M߽c &mp0;ӻ# -ޒm{aHfxAf3uzO?^,>Zk׿݅Ҥmz? TtW\Wkuzc?ZrM,)dvSLty |7LXȠ5R%,&Q@rO"N2MS<"`@ 0DG!ܕD'|2mGy :^"[W ;tm+.?W߆l߲#=wya*B=&S;V].`'~"]W.D"E^D_6׷OWȖDuּRO%o)[_OkȐHKi^뾾_UKP"‘a= uIUzu}~y׻>a/ ik[I(n> k?߼k2 {?uU_0cշj7ZaSQOozju"_?/VK|4޷:_Ui %S꾡~_RNAFB^]^=N4޻TT{Q{EUmC_Dc{HZn[_EWU;Uۥ_^i-KӻFK]=I~oﺫ*W{MAk}ok[jÞ}כ/{__t>4WK'oC柵f~׭/_ooKV+KE:{5k_o6Ong[?va;^26OkKiaͭco6Z w\0X\a +׊#vc޵vWaU/0J[ _݊:wc1P}|lqujAVnV[x-+WZ4Zӭt^ڵ_StM^z|W[Lwm&i4ijb;k8AN ;m7cM4&*iv64wQ iS7NI=6h4BI8LJTLi 4jxL T IjM6m_M{VȐXk[Oi&F0L8aU j a~imZ0 'h5M4paM24 a -XA fp3(A DL! @V27ӆevaa 39F!zpp|0 㦙 +g+!p`2CDAHDDD!/DY:z_ iX,-2C8&"?Y Tq kNY%"V)Sk[pi0ƘA|!zxtM]U4_DHdOu%NM~WOȮׯᄟ_[}~H5d!Mo'22HlԌ/h3Ff!0 R@$㍜d@ ΂ `0K" 0a04N¦B <*qa|*fb8bpCa4v`* P[qڧvOPw{a wAIuMΈݧ8V䡇^ۃmwtBhuDDotGm:,}:%l0Tސu~Eh7vH6"IDpo\^KWa'"E'w +?־|R^]>!^߭h7ҽUktK?W_~r%k6DWv_om^>? rz h/_W ȅwA{ C_߆׭ۋl??":.w&o._WZ(|]nF?_{Er('Cw}v?-}9:$nxp'F~٢_P+3=٢wBiS={mIl/nVM?t `+jccq}a/Mu]o#ꝫmmcj8>bcc?z"bڵn_0{_nkw~z6)m7j;L ڦ8AI4 SbmBt4ȑO!#iݦ{!&Ӷ.a58h4i Z"[Vȯ Na4Ti@ !00q" 5A•2Q  E#: ! !O(Xq[qH%OA% %J„ˆ o6\gvg5:sO +dD|B(!C:!*!t! %rU(3&k SGg33O8Bs:u!\  235*=0L +r0ȐAED04BCf\;BMSU#bA[tvotm^GӷB_^5_Aj mV!ݶHF <":AXm a"a +aaM>&{;LCi,xuĭ^{HQ.aVJa LvIDx?aaWKa7AݷoAz }io^ Ӵv{{;׾{{[A]wTW {_k߷8?rujx^>L/zZ2F`p3}TXo]Z_a ;jX +J/LצXU_M5U~_ƿW{;=?yG .<ῨvIq~}k]{7j8/nW}o_OOVҽ/oy/wӽto|jk; 'Q%\0rhw +{ н? }N)b 䐿v^;ɻn߿⋆ߎ_ YkVxKoN Y mv'KjtioWi[~_oߝJ֝tZom/}5.I۬k_o3w]AҴ V[I-]p0{}_ 'C^Jҿ0iIC R~4( ڶJc͋m W 4hvJ /TM4AI860$aPh4|SJ a {  a(*(&a޽SxII+~bA Zj-MW Ri4[C d@9!Ѓ2 +N>[%  01M0N""""" A Pc""4?n6Ga"Z)";5+靅d["șEhtv7Lh^rST)YBMIN +%Mz;׮CPUMV35f"@dc ODW~ ᅆ{O&MSM >m E'v%4Dm0_ްpiMm ^;ܤ5Y;Đwpz}&#{6)>+}qu޴Pw{گ3MM[jѸd$f  0g  |Cyd=InS +Hd\#i i ' xi'.hz&k?Dt]EݴywpEpI;v.-}+Tq&LJ;$:䬕d$֫ ;-v CqwdMwp'KtrQtN/~[V7;M:?]tu7HwO~ZtZ~KoI/|:_iZ. ==8_ZK7>=Az_޵'`D[_|䡿K~  !i^>I/ށc~0^ح_ւyA__tDck^I"D'N?߼+ΫӾhOW_4A~i=.A~iT~Im?l-?aa^[UK_}~~R6a+_KK_K봘m% +mXk4aakko4 ?Wa^> G]]'V]1["]7uzZQ^w"?jM_V p}եT=7BQ 8)xU[T;Ak"Æ׈>/UV!pvi6AP݊MMi 4UM:AA ݄ 0i4ӊQq^M4A{WZjm MޛA&uO_j4BiviuOm&4զ)'iSjn u[ M IHu4Mj 'N UM{"ڪvTTr1&50Ɏ +i(M^SU\!Ha ("80A4` "Dq +\DDDDF\i,pARaZ( 㸊"##q+SI~5BKU Ra8C 5);_,eu:M```"DmF4"f# ̖Ī)")9!#b4d1S +aB ga)J&yC|UT Jb MUL. +_$-B{(ptGpOiJ mIiwh"/]ӽUh;O[];h?4Mki  O뎓"=iw߷! |a6[!ʽ:`A42pw@R)>fj!A3g#PZ\i3O ٞ~@ ޹:gX}B'F3Afy 3]+b4tNtKăUT4i^i@0AaA L{}BGi'fl `  fa7@TU0cL'"BU[M U …M=!? OU5NP +5!BLiH[w} l-ow~\DǷv? TK7ˏ.=zhZ&ƶJ/Nl0L9z.$nM^(i7OA+#xupwKm'~]8~&ÛMdouv;˿..m;HN¼-i}:k`A9;OO A8WtM]4dtl ]QVq$jJ:־?kW߭^]v~.=St A}Kpko/V_/u$Q B"//m~ W^!Z[v_ WOO\?ozo׮M_Q u&~zh_Yu&:z$'ֿoob_Z ޿h}E׿~'~[עOkվ#_6_3Kf~;ru D՚+qw~i~__TΫ+^@-iC _0Kio}/l-aP+W]Ah=6.&*J^˯m/kb A_cEZa[*kr ÿ#?m[]_zcE&8ӏ?Biǭ%MtW[X1VjۯQ{QaMCi;_`i&i}ukw iA4onIO mE&mizmtAXM Q1I4M4l"iGv SbOvt޾ߑG^&5 {i4~M&ֻi5~pkMMito_VV-S M&jnMvֶ 44 !ep a=5[|\4 8M0dQf iN3 ]h0#z +{BqisA/wvFk"""""aӒ{a0BAH0g`DQgAAhL .L0a0B&5\DDDDDDGq}DDDDDDDDDF,*XJXa-i%uڨUQi (`ce\wKˊkj+HuTB‚4H"-H2ֈgzC@ii^ia5T4Ѣj4Dދƞ; kT{˷Z'o)ZF֮B3f~^_DSi"O#|2𧠃8Gld6@Pԋ4 k!`m~4L! o4"fs}{\.u -0aB◴5-5ݧyvyu~]_ŷwݦN$JⓆJ><-7[&A=4=;dڷZaiSMo_0Tatir[-WQ;JoOuNCC%Q $1'dRkL͘[ -OT&MNᙇ83=]zwӬiA^_K:NRK{v$O{ޖ;ZAp뻿t=Ҏ |''tIV|.q?'uȯ_nYzazk__)/_h?cPt7")E;O^޶ZٚU?'aXkڿkn8cmaU/o=%OLC׆zA. i^Kl:$ݦZa55 NqXA@Aa0 *&a/a."""""#,I hCӼ(&XqqK A4Gh*h0[A`2/2Dtzijc;(BiFxL) T[%>;ANN~'= lqEt!a)k\M}wN+EG]W/ #E&S R(D<՘3'E\iNdR! H=Pe>@1'&„-B3rA h.Ag# ,P@ 'dAh >TgS4FydafiDx(",30BA0A(%" gM39JcM<a + +X a`i aNM5Mv 0MSO6~&wXv~ݧ=~)s] 4}=4¢zj|v_ &8IpAa:AdnE}o;wV}鷠[N6i]tkva"Nmn;pѭwޟz}]^Ua:AM֝C7Uއ~ ӮWuvdZxO,i_.A݄+y'i_Pፍt>iIк}{{HK:a]fimEScWd#K:Ҫ:J-jin^zUWS?aJWzWDZuZ]~VcT!m6+SoKU {{w_ o~LUm1J"@Pն=bmWC}zKXݏM2OlSaZjLC^!)^XIMI!ziViPV:NCB&q Cz!XN☯WB:nNIwȾ ;vmRjMn:4V4 +jMM޶4iӪ:]Tb}ud-A 3S,`GE[$vY(U M2*a8a/M4L0A#i SM0dM0vd*phGk֚DI>xkmʍ3NǡM^Zk HE3ٲ6g 3#< h0@s$%/dF;=0a #ACx@ˑ<$Y9ϑph3&3C3#dl T"b vo!ƴH g\͑3^=fvfiR#lw?<&M0_ӰT&0Z~ +5p0;D/XA0ਅ i< a5 F0.F ̺/;MK6^Tvǿz.Ei 5T蛽= BMBB0M4ªz|5[ ń!a0a?uWƕ?Ip'xA}Nw $\zuvdQȣ/(BoH'an\S '-..~Dމݬ=ޱz&;OOMJ߶uO+a$z _tz;5$n%ovӇt&P]pNǯm?c h|t+MpҦߗ7TryI7ujp M-пI.J4wvد=ukxǵ%_]<.8M??^װnWگKbziͧͥҖ,EBW|W?"Nد/֫[CG?bE[~4^hU+⿻MKz]'[Ki3WjF3],/Od]PVkVo>EOڶߤfkO&CO` / -=ᄽ/]z@kTk[Fw_a/^Eկ-}ZM8Ⓑ_ŮA[Cav醖8i_4Y U]CS"S /tNiwi;64tNߤحؤ|SxcObZwæ8d[Pv7M5_-UꚵiڠmRaW{⢓M +M:oRow]iDA`u / 'a2Cԓ’a5LN&8AýaZWkҴa'SL* A&ZqLS 9w &Am:.q ІVvAD5xkduKDhCqB0&҆0(qaPakE1Zi& *h5h "?,2fRe 5k}ZI4A%B2) #A' .e B'\!t\\;O !j jLG ` `-B E0B L!`Y0Eq 'O踤{EƟipښhz'[N-ދ- + 馩=UUkk!k~n1]IAi6..%m?OL''utz4{M"˺.:'[S믭7VwUzy7 dH\}tޕOޖ`7_v68i>SۇwV E۴N+E۰ƫcv?OWceI8PA>T[.9sxot?N4K5ÿokO]-.L5}mCq]5 ?/pXa{IX}/uwwo]!BM!&aDحŇ _çK +7"E<ﵶhw} ^[J_jGM;ڥڗ&^\~q݄_akkk DK_ޡ Y[Pq|Uw!^o8[KC^bv8mmﴽABCᄨxWwt8qȰJҰiCb뿽" m 9Ǫ\Ri1JnE1ISm$N buv'qJ +4r- e[M=&Il*h5A Z]=4qOzwiWL'_LWi-ad*iM{B-4M5MjLpLL% <֝SAMwa5ޓ""""0DDDDDFDQgBh0N_MJpL&U:gL a04~Pa;#{ F[.i`@,CB#iXI0ca8Eg Pd%*)L3]`XQ~_NNL&v9ՙvPF h5 +EC5 ;iџ3O +T}=IKԻrO9I?x}t[8B֟L_f{ox[Z7q_]ZC5"4<ф8%5 a<@Aaf "r$4 "5J?0fQ)B\jVT}MBzCL&;q "j2aL@3g4 ttf"hAyvHg\46G#2l3u%'DދkEij/ZjUӴ ϰ A XL!}=aOͳPgP .dc涋,v0\t݄u4RF]rpEwiT漣upa0~PidDznW{h'鴝vnڥ}&wy;~k転Z-ދ5l~Ak&Enh^_aZRvM^ZN߽i27#zM78y8ӾtV'Ip;Rwi!_'a{aOT酓Ɍj[ToV|- _WQ놪J~m 1[iz}t;8_yx߮{~^wuK߾!cׯe=/z/"?׿^Lu#EƿoT o}ko?f3_n_z|a_Wt8^r1>]7kM_f~o4M?[~k4_;U{mt>%\~K*C/WߵU48=bI7I]vwGmpvm}-1.k"mpz*Ew__I˯b_6;~*m+}1M&OM?N*+ (A&? /Hk턯I*iXat% v:zm-^ ]S +jM4I4cM66&ML'^iQN}⒈B i i4 &A5MS + 㦡UvK}tA iUUOL 8NT aj$8[*a QU647MUQaB9fI@^vTcSBN@K"Ѥ٩(5‚K]Q0@_,vu_v.XA&ozTz_l9232$#  VhT[iL +d>3L9ȟ/T} N2`HD|dAfAg^XPa A,$}-B Ai0Z. .hvU; $kDeNoe߽&8輢66kmh-Nmt]./>tdo[$:d޶nx {wIW߆;-~C5,¶?֗$xcIZKi!ᴻ!cR0V /DM;GpiDtU}}KxOo[d=/xt_e֬"voi6__W㻨-v.!b %lZ[ 7;.կM6/b8iTSXEG +j iݤi4L&q[M? p0EBa@l&R7^1®#i&XI"""""" 0B}T""""!a""M 1r@X8CXy9MnfAw)l&}v'҇ag4Ds&,lvOIùh@C0 А25"::N +tPGABۤ;J-p A "ƃ4o amM?D Kovkd_ 6 o  'E-_ݴj<%AG_WK|/IumU(dZ4klw[oo}'?[* 8U) y>g "fn^DjJS ̝< ig&0$B'F|R0T i`0ZjTKU㎯c(#fD383H3ABl">a0BL +аT a>j i"C3\&3X *` ;ODiˏ5Dk -{AMBzkh=i?ۿ׷NwM=Z[%׾&ɻkE.!hx"IvG|Mӵ#Mdn7{˷ppE^J\'8&kvNz Տ7.7At='C(W_n_zcc CO]޻OV?1u +m}/_=ob>M_b}vI]__Zc~_ ._ka(:m|?_nAr[_\ozdG杚'1 ?å_mk ]蛭_Kۯ ~VtjNj^㺾!]mӫa}۴K_L>~K_NN =ºk +톻^ƶ_Ҋ&cc[Nm%bIiàQQ M A4B`z%zXߦTi4M1JOi4NS +nUMmS lBoTi5}jڿT8  Þ5 + Zmm4 66a5UM4 iLpUS% ʄPi !$DDj , 027M8kaaaDDF0X!J" ! 0CBF";iDDF k]ai40]D06aXAs2[3fYm,ge$[Q4 +t ~ D~oX@چr(a-"KöB1ֿiY+MJT }dF4D!jL/0!z ૦wAIZn5A U?\=2+Xa4a4"u,VKm~E#a48[TPC +%i8' 4AI6FꝒ&5M4`Aa0DA a4D!AC .ְ&Z6"v;SHYDeR+38EMBaoH&(R䕚V2 L*a0}nU ]6]ޝK/9A܅WsL:w;:U^Ut/u&JG@|}ȝjЎ 2@ȑ .;REVu+* d`4-2-.d0y< !k\l2M'i DΣ(")dpe 荙dE"~Eڐk]Nܜ$NA +zvEzOFw{TZhqDn7v_wN{5DIwDߧyn;p }t}^Idl z'wvZ'z G"=çzwm$>z]NQyѮ[ +]]溢;I> ;i&اK;ɽ'kvN֯tWoO%Rw<Ƕ^ai(NLi"=&#7#zO +ړ"'#;_'~X?_: h/A$ PT$$T $I%A* $I @$T6I6PC_v{w~m][ _~Wo޻KZzݵII I$ +A +JII*I$I$TI$T{߯utc}J,B`Z ;z]h-/I 1M$TI$(@H$TPI"I$L?_m ݯkB{l?|Buz$I$I$H $ +!$IHtI$MIIRT _/xTz5D.ݦmkIPיִ} o7 QD5_6mث$74m.ˣ4/S_u~cW ~om~ҵ_}mWm; _ץNF^4]dolw4EGl/S#_[a[^__&_.k]W^kkks {U +ս2:_+$C+aW[[~޿8{}w_Z6JOjmD7'{aڶDZVq&y %J=J(ժ+0^}JU߶AIڱ}qiUi4wWm8§iATi_pڵ{oƽ E<:ޭi}AjqXAh&I[VvFM4Om'MT5tkqQRuM:NZqARh;~M* +N„Ba8! e7.tҫ iR(>{vL4MukNk?]27JA 0F8^N0@Ӳ `Y"׫M;M(AA a &Kt, AUM00L&DI0AB"")"%H!DDDR""2DG 0@ϗX&"kL rP*qHE $KHDUFjVJd\/HTmCAּ{ UTaiT!X Db"8`2t>ȱɲwDvWDwld)*M +awb; eXF0T2NABi ڄB`*0LªP%IW)6kw }n[w =-ū޻ûA‡˺z}~n*+* 0[*=~,Q%^g:@ge̐EvpI]l}HC"HVTD_ :O >h>A9 (DA> 884B7gLї0DZ,#| fy36`f y Wz&;DjIS hI=SDODǷhB7z'jm }Cd}'Eqޜ0AdWdQSdnߗ27aipt^wzv A .:$H{Իz't^X-Dtd#dq鴜28"ïn&ӡpU7m5a?maoK +{{I8d 'Idۻj: mItICika?yNغCM+t'A;N۽_[{=ꇿ;v_Oz-Nָ}_[j]/UpWKao﾿}SP=[N!w_/_A+m Tޮ~ mUuoKd}/_/tRI﯆v^?z?˫x_~׷}wo1__a׾^o]] _OO4AC@#aV*Ww=4o_{o^i/oiY:;"H߿v_K{}m{K -}U/+OͦK͠_g{JAZU'_a_V/^}X;_ӿ__kl//F~w{\7qu~$KK_+{Q?Nȑa]; aR%ZV4 }UaVJOmd&k޿a>ՊC 5KMwaK: 1_kC[!*@A{wVv_!qmwi]-i?XIQjA?M 4oit MOMcXi5ڈ&I5OqIX;XiI4M< a齬*ӮL.ZkZi0կL$ֻZAm]&wRqQI5Z~nE& =mjk]~M{ +NЈa84B6k dpiI2vU ?#uZ{M4l>A8jkk mS0.0@"8 wai8"""!DDDb ahDDDDDDDDDQh4XM.\ C p CXT 0aST ¦ HfA $YFB!":DD4"""""")8`DDDGmq)ab`TZAl$M-VqUU +hZa5 &0TBˆ`c.iYX3NIa9mT"7j +ap*`*ꭠnvu*4T'w; ]=*M>v“nuNiE_^n꫅ICj깿)a TgHKc y+ Ԉ,U 8@ˑ@3#9!@DAN$6yզCdb (0F a0ݚE 4 L&hXL*m֪DlfƁA 0B & A馟 A^iץ'Nm"qj]۪zan0j\ij&.m˾OWNŅ}ӠD—m洉0\t +J.(;I7O"]wt/J?aEݺm& 'dpG ^K䮂vJI밁d*Ҥ ;FOVCT|^_TBۮ饭ևH}\1OP=}-uK ^cKA\An}v_׶.X_ BK^]U_/oW_~_K o^k_m}%o!l/Z%'XDo]~DcDmQKAx#^fx߾G"O{uK~ u~pK[^9_\$g%k}v[][Kֿj6*ޛ{_Z_=vaqY~u (amo.[Jj 8ë qX@; |AJ!I=Ӻq}*:XiDl. GǸALRa7ӥ7jNmM;M4nZmS#A# A7M0N M'MaFiM{ +#p2PN` qKMLZkea4¦D qʬ"#a;MPa0D &VDDDDDGU_[hmm߇37ܦDV;!(L l2*g*UMPm0VSTDӭo[yo>z9}qqk[$_ԁ."C8gAh,e:1^wlꍙ rA f~ + L/-qFD f^2@0PBʱ3΂l3Af< M>׿UO媵"E٘\ a0A ;AAPwa4:M7]-owtF=4]3H%y٫0RCL!h;USOwUtN'tΖtNƺiL&j&=UrݷE'vâwM&귗{;5y7z/!D< ;'-'NבƯ;pXn[{ɎݒpoEC oN10dݶDm4Q|Px:.AaW7]wCx7Z֒mb a '}=_LT~ BmjExV𾿸_oͳgq C$a`fYG_ը~9zo ~_oZM=5 }kj ,& +"wG;Aմ~{hӽ\Svc?r(=/~_j_mۿN$['_`[i{k oݮ1hU4>׵.4˼7JlQkV /W+{Kҷ;_\?hxcav;}~Ӷ _2:=atM? [_X8? +ҎTa6*@vwi>#ӊj?M=ẇpծIbklptx aN+M7AM]6گjM밊}_mاA5UiwM?J4N”\O a׿~k9.=AVZjFkv^&TMF $ ᄉ _޺c 7Ϫ 8a{CeQDDDDDN&\kMko (>\XXNXDDDDCݯIqZ{A +qoХm4^5N]Va4L ia0 &} "Of^n r""""""""""""""""ˆ*bU2MGbKXAfc+ +T0XGg| f +MI< khA)|2;M0L.O[?oC +L]6>[_l c7DyoM'wm!7ϏQ ]U}*mjtT#q fN-3<3Ϣ$<2NhDV$T$޹ 2CS6E0A&-v |׫e1#Aঃ@ў`( 0,/M}:2d7s$<]J!an *X&a;OOUItL{ꋷkDMzHXL&a0#U{_jɎLvtO(=4Фo i..Q7h.28l m 'R~})?6ݺ/4zotH6Nl'ߺ;O' 0W.\w_8_ax`>U#4]g0h n0r%|]=}|zt^P7W"aƾ޻]RcïoM;T„B`ZO!k &i_[oC Bh*[Ax1Pz:}zrݢtXo+ ὶ4]'8vL{wKL~"][OWiӲ\.ˋ57M.wuVwo~'ioUL}o_wA~:oN"Ný?,k'SWK^ot׿Xi[wkAC/ q>Uq6GalWzN?N?"~wk}݇l-ޝyDCX~ŵdk/-_a}K }@Ex@8i:qZi;m}[`{o V<vQvQ_"f*6=Mup?lSi_ };$kg}ŪvqXP گt>mt IjiE*iMOoV+M=a SckN8NwOAiiF2pL f@ѦͰkWMS~-^馛 +4-2Nxd ”8L  4g4 !& 0MW[0hDG\Z5^!TK魔: hDDDDDD\RH[ac'L&aquIqJMm*6!e&b!?iEO-K1,H2xY@32Ao'ΆT3te QQOlFH";@ :  h4AA jge d6v/B+Qe8"tTMQpM=BIi 4T2h4IZmkkj=nPV.Hhna$ ڄJ}i:3ht=m=(R>/Width 2578/BitsPerComponent 1/Length 602>>stream +,V}fqX#S!G"!Ff2C$G0ϲxe S (2C36g8s3H6n'f6㑩q`9gg.} r4f/:#iޛPe_v_I'Wìo$W}>._MC0 XOI%I2zϮO[~X%=%]ڮSٚfޒ}*ޡ_~?{lizJ_glj^}4jrHuPI ISmNJkI$/Z+ֻ pbHRa%[B"J+cbm !~Z UjƬT{M$TlU$tWM+L1 I*iI*SVh5 ¨_XaT! &4AL& -I&m&:M:M0֝Z"""8""" C]Bw08[Aja2Oq l&:DDDDDDDDDDDDDDDDEu +RʰUukCC +endstream +endobj +12 0 obj +<>stream +x}rF໿O;E(FO$c--XF@yڇs%b fa~n+"=*dϪTu>k{V77=;oϛ3??|?~ߟ}y^ V#.QgJ#2Xdϯ93CPpmħxt/ uN +ݙӈyD0P4TpH&f{:6n 9:?GF5'Oi#h>s5[}=}#)>&m'9m?-i- er5gu$UYngxl##;gfP$?\|Y*,1א>SV+5Ra U4ΜYĹ˟ O@#UsuiFZeZ;9SKnΎ2̒Ǵ~o\ @eՙx{|i{zBVI]/[,=#}ܝ:3oπ@?@~Z TQWОH}N:GVH"Ba*?!L(|Z_aEjn :]w/ 301CuG"VF^|1o!~D! iQ%WPbGYͯL&j%'ciDi3cV#c + 6xAnL6)Re<#5(Eݝþ=u䄵NAZ k8v{mOӃA2ʣ gm=&x̛&&PW +tW80~JEҼ|-ZM,VRl\:f$ ;2/gg>%Td]qY3ohm۲NG;T_@@h"F=_m?tsWF+ifȼ@n{u}}"x +@e؋@#طa蔟G_nݮ=LEH+ݝғ/ n_ɇl0::M3F[;"1G%(g$ItĭrpD6Gw2zB{[h~[` g@>Qt?·&P$j +*KmRYB<=n?ZÇtwLqz]|NnO|0٨ziwK3(ty +ȚEܙM?_(T'YxC| Za-zDu˟](X1>d +Ty8DWK@B>Fƞ߽cݪTx<\l[Mq12FEeQK3 \$DLFQ ֥pZMCB +o )ۀ%[|uH隍O8|""BfURW9&K\t""*t\Å&)Rũ4g3r <Ϭ3jhܨ|T5~z8ʈb?QIZDHlɸ1[†DISZ5 Sd""lU)B׸ 17Sf `duw j:$ +N$ԝ +\Tʌ'ej9LI%Ds ^wi{jEū| +(\`mct9.9 `F\LBo{ v ̥6*Zr5kݮj) +qe/)>e!gd=wv_r2 +LF춏j|0%,8\5@}w LTYB=eYCt:qBnـzU"4嶌z!R8\hF* 7$;97 Ic$K*c N84|EU I +kUW+,8zSs$58pDP5& Hj !~=psIěj<tGufwtD.'=߰T@@]#;1e7(Q!?γD< Xk T+^x6n)ݔG 6@iXnFl}z{/v9mZ$9Wv[tS`Vnf?4V>dsO&!7jd|hۖDalM#: X4[ztwﮮɋ1ټm0+t'Iò0Ijxx<.fjL.nlBYD[ٸPE3& w"gT t5)]hWlMܘwkdR"ψNqj,@bnw"~C]Wb ) +z8 RG^79A >,Ø'ZlWE%Qئ%FnApY]?TT*5=qXP"6rԾ\Fj\0 WGg'31g1LEX P 0H qU1i EcbCZǔ#VĨ04)/ʮt6aUv #0`}Cȭ50Ԣ˲9 $ `bTPvM x cq-˼Z#N݁w}xǏe"t +lduWqv]cb   e,B2hl`G iťc UXeH2 *lqgQR6 +Cp\%ʒHL-O.uIRN|jUlÉaAE!CB9z#; %Onuw +\y=$ҬN){D.9=aڧ>#qS@Zx*Nɣ^3 25yӵ:=O@c0U7vObz5umR?w:[QpP?:ѢGRtOZy?Ҹc MBT :EYTa:)uuq> :n]=1tV-GVLXGj(I95pe4Z||dV +4=GtFc5mHU{h@Ȼ9~mhW-V9,q~nehf0Ͱ}Xn2bSRGQO@S<[JK)]AR^bu>O|بNp5yp`wE\éR.^)'trUr9Dh̳>8E le{{K<5MSkֲ)2i"O"O _ Z-h-g%3eG,_~?b⢫[Is?yDQ vlSxMtTL}t@&<~ﺨvhϴa*"[ {(o)^`!FH7OFHrh1UKJF,Ri]3ݧ#" FP7\NXȝP2QY) +MA7xjx8Tk/kor''!#zC'cC5x 0-:M!U9"wi)ZtFcq=I)E1(n7L$)Lmk0/@P{s*T`r[>Ea%Od)jiImݼ_O@Ȕ>Ԛ+,χ4,w4i\`L1ˏj*Kfy *FBBтPjY@T1gk<`QZ#-[9_Rǃ/r ,#kټ~U隀m :a:n{2>J\ReFljLFȘ*e~stJ<md4c-MX +¼`VC=g[R1Sƥ9=gهQyyM#,z:w4hu5^j+sC%JaW"pPM"$=e[>v܄Sn= )j+As> `>ZS @7 [)z׭Z/ +LoΰzuG89RO;Aݜ + +@  [~s<  U"b[՗/MgWwNgģ0 )^t|~fKowݩQPkZqL6$谢N.$Va]4OD|NV+ +_[^Bn1 7Z9s? Q H:іw`jY-l#B<A g1ibK4ic4*֔+tO\^Ei><<:4ƣ";Tl/2PV.haX>5> Q;GԄu҉y 3:/L/ pZYWPhʀEpM{eqXƴ8<2oUBdsA?} bȒ5P~n4D8̇}BF9̩1̙ăѾzCANd2Ƨd)auA Ez'!dH2+hxL]Z%ʥvfg88GMzC! sJ #@ }(nY0.M$RyB"V (9o1m + qH<N8Mna*r55Sbl **Kw!.S\|M:JQtUw,&IKeK; q( n.=#׀qjyiԪ%e\&A, +ZD !p]^!dtm: +P&wS)*i2OhƑ7/}3}u1vC"|bFm+$T<4@Dj*MlNhBQO蝒bC2&c!r4'B!eo; \25ja2_Wokx~Fw#k,:#9op!뉠PK(?BڴDv}tXop qD$vGXZ}nc؇Xe^?lIև̖)E"=Cdf#hڟjn/c|ݟ;.[yQm|)ID~=ueyZ\g"?J^\ dԩ&8st9dCỸUuJWOji w_gDzTmBPK[L~ȌMx~tnnI`JϺ=Of[|fB)6-32} ¯_gPfel%՗!9o.B]bBy Cr6b@,TLmo"B9ElH{R㎖|v@Y9)W\r%C1@?8:F b)_V8遯!L;+P],m8l8wf 4Z /n{GGR!oiQF),?jz`b'm_{M6 nKse\OtoB69Ulj(7~U~(HމӒ/L| $:gٺ>0f~YA1@-]?Cϩաd gB'j-l5!:b!uo7u1<^ B /A̜V] e1a,/24 ']556/2P&&۞B}tiPq Q-7,|Yvh>ֆN\{*$["eJK}n[C~haMCK/xRD#"peSHu:t6+Kq%4J8 /^'k["q֤b"C^}6MrC9)P&UcF"Y|ؾRε&YgT RDXԿ[P9/54(bd$gKj!y?-)j w#/Ȫt^\ *In>mv 0f!:TsWeںC*A +E(nSPE;[^Bh6Ӈ +0&큾,=ȱ8Pu&N]a;JUf|H?O_揔㲵vzL>f} +g?: Ԏ_ϞsM] ~|}^`Ǥ'G/ސ3Vİ@@W 0~^@Bgs&.^'e҆9G*moft2U#MҾn :i7;jwNz~`s5a7]0u ;=tGz\ߍ L}ݷ0ӹL7a_v]eU.522JgkΑpT/uW? :e_!O%APUI,i,y7Vͥ57֮rUJEAN +KY-[5x<`%{S{P{ȉ>}64f"F)UXAjݮZ?¨ѬT-XjKX fx>"L| 3Vl3L+R]b~!ZSQsJÿZٹطH4(\? {.A7IlE$S+3pt>ǡRnOj4s* f \C2xZi,ȣAfLSo3IԎ1芙?Qy"Fׇ^u*µ & 5h+OHvAP֥Fn2w'lltw"h*4WGdL(W9Rx 4c{;QM@~EL4tHbx^(GRƃݰӑh2MH\e>ORDlYй^@ѸT.D0U5YDGӻS  i*IuU'DȎe|gV,wݝCߞ:8ץ"/H^v--w\ 3q0 &y׽g+(ZhQMu-Ţ=es ,n3Bn3$m%sGѮHj~Ʉ6e#B +s ajcFU* l&GF!אa+dG9e]::~vT*} +ѭ~_-h` V-97?ЊD35!M:JϕBJO=_l(Á|U8]oK/IFo^)Cb]KTsN  ]#t“ -H(-;2kz +(IX0fn~tMYo6\2 +Y-Ƒ0Akއ_[rBAPːE΃T4 +hړtpNpna*%Cv6 +qtCX/CHaJAu%g>Q|b2Epo`Cڟְ5Ϳr}\FZgՔ2BPbG_gs%ٱP+HKj8T d1Y|U4:SBdkS'Q-׆|fG!.Qu:qwiyʡNB>=R@e!&r=jzPGMTq +o$i`f!\3{ @l*V@P5,m{yy,ZcDk*]'1v,ˮWP|@&-VvE +͐G*ֆsm݇ZbUZ͜w]Se  +ÚuaO$k+t_]7$ ~ŲH6\hw#uIƩܿ Y.t2Kk ,2hɩQU>Đ*>P+rL @5QbMUsO3MJC \2lWf |<?YpL "ǰLwĖT/`+(A&;e/t"d+֍*6S ǥts! 0HV29qb`I Wu~``3hX_Ͽ?R`bF?S,n[ +endstream +endobj +13 0 obj +<>/XObject<>>> +endobj +34 0 obj +<>/Width 2584/BitsPerComponent 1/Length 33240>>stream +- fd+qS;KdHfG3$J50TQشG PP 0Li#0Aw `$ c(Toi4Udᦜ O ;TڅnF +8i(b"êE@\aUOm[h\&D-1t\5I&tzJ!A9ؗN֓'o_j Tk?V?U]=Ft*ZiUUU{7%Z;=" H /KC“}5HB (L& 36~}%K`ZucM kzvk{a}Q8j +A4WZFP)b\Uu4N{IUhҦ}봚 h=2'դQ7qA6ƯK ߤUm-kI6ӿ?֘J#i}$AI+WI+ /l-oZ"%+4J*=/j߇,JkH}UvҦUJ|vUz]U_i~: W*U޴JMvӧZ\iUR]Ud =uI$tFVqߪWDA R]i.뺥__1So;R%Jj%-H-ms贫U4]-tR*H$Aڷ_Ҥ _Zґ P"AHfu9 jgI$y^/\c'R?4KKzq.:jv&$z{iӭm$azOK# p/Wj%h oX0VGIW1UTJF긧tnu$T>yʚ!uC_WP}5U +/ARa*EO7>y: iPjU +TiVjDC +E#EV$=*JL iZ xA5B"#B8Ka+K^[a-qRTO[BqDF-Tz};QR"""/[?R$!"""""#OWk[Fh͚9h+ ArovPd0 Fwx"\Sp/sP 2AAa4! Phia#C~M XAynastX_>2'k%p'ztȸ#2:.쎏2!B8˅##$#!4F*68S??"""""""""@Aó 98*e PVQs_5O⭺W3G+B3UrJfDr(OeqeArDDDDDDDDHkk80 +$(rw![oS:~ʏh.m2;#dtGd|HOf}.f#^TvJ7~](kȑ"Lȃsig #gH"C$C1|)00>UK4ωł``D~Jl& ZDDG}S +M턵Njꪃ +xO0_zګqaGϩcoM:vvzsE 0se|@%mz&u읓hMmoa 'qETM'y;t81M]V?O˺V$:~8}~iu_a>8u~_ui_%XpXb#B[h,' +F:U}~!o܌_7`=7~UP3tKo}o~쐵1{~l+a^roR>iyՅnWW -a/o]/&ҋ_݆ NJ{׶bK݊ե` SM8n5ERa a&MU /olSZjtOi_ .*4L- 0![zu[Ta0W k@4 aA 8!`0 &8&0L" ؁" hDDDDDDD0DG""?aj鄩@ E*)7w\2&L; 'n*[xDUPPJy + A܄Cj' %\Wu}x}Y>@rB%i3Ś4eNW fP4C3 DC6@AA*P_(TMF`Bx]ng"RzܷkEuY4]t -9qt\6oEݒv8!JGyBN CC Hv'2-jxH"JÿM>}Firt  ȣ0Y!tX3; KI ,eQc+l/pux%E43[WfkI/~A?ovkwKUW[뵵^-t"Bv87ب` {39Pb[,C{uilTA&J+NaESA&­4kMmSLDIBGY[MZ#t7m4FӲ M manvqMDG,4VD""" Tƃ jT.ǣքhl"E2Yn8AUc|! +T7 "e4]B̎莰o&s.!H̏ٱah"pBKb80G#n?E8K3@2Az0H" L~8a2ZG9C.9!UNʃ9NS n(r @rr2YPUJAYV;R¼֡|DDDDDDDDDCRDx +%ES!hp<"40jϙ/`!xax Cz34/&ƨd (.[AKDkUip⦺53 M#!B'[[TK8%Qg +h$?D-_#8l20Iz RiK! za5( QB(. XAPD + +@LQIj)hB%H,\\ h/ Ku`d7X DPj !("WA}芪 +8JW< (H$ 1axAdZ3Ȏ@wZzhbD"E$<x"%lA]xA5(%{_!/AwtDW /mW$iaJzELAWDx.$A!#(B! DOA}m.?YMLLq.f.Z=@[M,z5B C8A0! t ($)!XA X aJ&X A %0 !٢,RHAhBJ clh36SGpqxX []A H$ avjR'8i-C # Ol0D%fpIq BJ}tozz n| X _W}'[ +yumA!~b d2Y '^Š„LjHA%+CNҴ"%Vߢ$dh!J@ ܜPN+{5 `A? 8_\|P靊_Aw1,xD_,w/c;pNpH̋L%yjUA`$){ Fdx#-S,q3Ȣ,_Bհ_aN!Bbz /ҾXεZ"Am6 ;bK(vG SA 0bMi馛Qx?"_ e^ Є +" 't!p 0TDYDDDDDD8, U+b!E1*]""*ANF頒XA` !<G("'ɹ_JaNJM X PRGG2B0Ee#0$|fh:GtqD\!qHx3DS.2:#G]":k"""""""""""""""""""#w ,# q$ VA09Q*r@D* +cd\ Cr㑎A +9VT3U@ ʬBLrk&1Ј(Fa@eQ4$J!$ NCuB(@m:)fe^:!K%F)nA&…$ MhDPI4hH,; AM[6J$jB +&J߄ +C+9 bFh!-x(X>u'L"4&Iؽ9'RǪE_ p$o.Z(TAAd' xݥkCUSU0?Z].ш_,tKybKA+I߅% @AaRKAH uf]|h(Ww;/A34L!~$iؖ%mWzJkTiA `"UAm]oiAAZNh1A["@IZaA,MVB=OwGXA DDDDDDtmZYIɰX@AUAAr-Ĉ@MЈ Ym'PA*bK-"ɲ)%,Tdy7AP``A Bx5R_" +U@rӬIT WM@AAn fr)ւIC\KH'ڪ_龼T޴A~gjތ_l$MQ" Pi+qإ}r> aJa-$U4+[Sj Ib VmimWخBt}3Zekc[\'ERh#C>TDUDDDD]4ԷVB-v!PKj H*~!A*Vr"S!_P@pA!@wtMBP4 +v;Ì0Ke: &3aB-23 6 +B4h TV!f7POIRi:GHHBZqIt/"1s>e": (CF"DUB 4p0BA}"&Z]=5MtEeAM#D "'!&c +t=sCbO S24b4IޗoN KrEO­ k.A/z^i{q*[oz/"`_-WItMdޯM)XAt]S4 ?CH__CCV#әhFtЄik $qiI7a^sI?fn4H*i&MLRۦƃm(4Dp@[kiU8!(OB &+kvIN Se1i% e- k2 2Zb!FzKN C ₆UR!!d*@C-*Gj"WQɱS-(4GAS+_iC+%epA! A +W Ȩ^ҨT…M4fZ%) fTw\Y,>tt]S$LteqnIJPHP"YN I/ǧ!w-zĐ +:jqaQnkW%Ix@h~U7kpJ&)!!jK{Vՠ>r. T1INaZb!iUI?k"$DqRQ 0BB!'M T"hDDDDD I 8Б |BT H  +!-#H L&z„AI<)L!C*(P Ak2l8CZIU4 +i ᪤ -Ѷ'I5+I#Z$O _g5zl^qJse*(^O=&h"&"6zq!.*`'C33@ԗE?1.a0tR;$:DڲnnXD.5-vOبMmݴ!{V˼v(- jK?z_qHtC_M-<*o5/˪ +F@  %_iDfoz#kӯM/{?̸Dt?{ /iۧmjUb^IU{ `^1Q]s4ӆM[[' ji(O!$ B)J)r$p@h |XIJ H(5lO!d PA.0eC PXfDJ a5EpM7Ti +a_[]+ Ѯ0 +?Ϛ"I zpA9 9.dw&r^//_xT& ? +$BnھgrC% +VIǢݻ Z*w\Aג߮F=-z6 A% Mկ n%w/ +kzC}KD߯h ^I/|Z t:[磻:_ozAt}i?]~K$jMCwƋwi#C Lmwi7 ݦ!QA5Uio[nQ^a5M{NJI״HdQНi!amSLADDDDDIIc4B% BC_"BA~KQ". DfلG-DpBѼ#<>GEѴoD""""-%fр#0gH2F!ACXAh(2(rq9ԢyC\2@8Ed%k+xYr܃QVPܡs3Aa6&W+MX@DDDDDNڈ5Է 1"t5L(PTӕAᄖ"wpUD$N~ѣ6< Wti -T!i==-RTIV=*y482 AQKq  ZNO3K[Aq?m$$ i`{i$3/a~V +MɏEwWd"PA WZݭmKa7a_ru$ C.Ma{諒7)i+! nz^׿5 H E4[(__4?M7n Z_aQ4RIa+;cCZv &էtMP6[I8$] ¤kM֏h4[ vk5|*"! B",&4,,%x^.rۛ +SZ Rҧ ,(že:5"b  gj3DR5 OmLQ dJ;Tݧ_a2~pPiM m=m Ihs ]Ҵ$^נIBɱ&ƪ<:tMփ*ZED[; 3I #e:. G||;vX_l\^;/zƸ_ ÐqDDDDDD2L "" +F#aD.9 A)ʃa[#/jł`a4A830ku@=Q:"٩9 #%>&T䆑2As t-½=9!馞^"'c"""""""""'.ea:2tGFb!r88ۇI ;W}c&Oq ][wJ7n?O:Aҧ8_K^KA4!{ZaT{^oK[&EǬZҤ_to $}§O79c[?ҏI[I SBk?ay*zc647 puMZ i\VV֮ JH8⩨[P*p"?N4M8dt  DDDD\DDDDDDDDA#GiSe O3\uJ5gj22&TkuZiSiӷ?TAhn ܱ綒N|V%M;-ʑxR~y\ $C k;+ge]Rt\_"' +]=NɊ@h\-jM=(/D*To7lE׃ ZCUp~W~N.˽lU6?nJ8Z\m{MsZJ?$p_֫tNVpR}ޜA~^Ŵc֨}گߪI/]PO{N//_ro;)Kivkץa4ݤ*>7_}${95iiL;m{۫߭o$|Qa^ڡZm- =ո[{j"!wlR]MSM4 V} Z]_o&1[Bj! Ba4Ԝ)D v]L!"""""""!#Q֣`HfD\)5\taJA3dL }t̖3θ@Ia]BڧNJOWhUT[->O֓A:Akuyҽ8ҥ|}Z{bg2vkUB܄HA>DvzezwMuHU&&F{L%seZ8[%zRZwt\d5!"2"Z'N $dIe }CKzh;ҤWW i_ݥUFbɆfN4ʶxpj{Ҫ!ԄWAxA peن`B6F#b*__=}o֓Opp͖I}Q7{rnPRᾶmlRڦ4_]%53V3Ozu&=|&?#LtC{G +T;_%N*_\}oR&]Bf>Մ?5F5ӯ?k]+mmɣT-?ARAdu{m.">+;j zm$)OOڸ[ݍ~gWT¯lRo״&n[tNjȃ}Ml*axCI׆& S[(0ikz"v]4"""""! &iL$vkߊqeXL'\PjilGzGQ!C3 +[TGE"j!iW!i[ii hTԷDPgb#q;d;ʒ(3R9ds' B}G}sl- (UT&& 5;_ў Z~3 +tBmZ_xO &Ov* +jnGsE;֗UõD ;Kn^7ݒmpox&.v3w[u[ Ǯu?~_v[U]~uݬM*x7Z$>˲(Y$9yR&vF5Ei2!O4O赠zy^"wB\!'d܇ig30 8 AǙ34 h0B3Ye( ͙ǠjaH#qPC8g0g _3BP`N5 0 ONu0B;*kû ΁ Ŧ$_~۪qw-߽ˍ\XI.&[~]Ӛ-:3M7Xׅf6.OOɻA;#}0n,=,)8վ[OAݽtu~XDn[KKKw2N_֛iY~:|5} Zzw/v^ՆN>;ۥd~;o +p^}izo7\:[:wt:*? Z% ^߱[ wkc14M]&^O_凱 ɫUpjmqDDD0CNÿh74NcKc//R> fk 8E~w__}}o=uu@x=J_ZwǗ]Ewkim55z? ]?ݴ!һ&}6Qv{.Mj.?k $n-Ai駧LRijqI;ۊӽ=׊{I&Mzk~M; &֚kjP&Mh:k߻ +;_p;NMSM="wjT 4 (Le&kKlODDDDDacP!a.0DDDDDE AX:e: GU\C2nP 5-2!P骅L*z %znO !^T.64CZ6_ ޭ"xX+FRPD6vĊƼ>.K [h04PLh3X'dmD*q)yDA5Ǭ gqf}31Ds'/W[L&j(BІ>hCA w 68iC[vɸHx[T[ۙj'W@uM^tuq.& $RnoUI7MwT뤓m}uqMԈ<~Ow]aK޿z]ҿOm{  a9I&V"4JKէ,C-%/r, 3pœD|fD(ah@ϲ?8}h:8{m'dK}4 &t?`gza +kz k u@M2 "qT[抷;|U;ꞵ!K]ڹ..>]$l|N/VO&z4:emRKim|7'd'3 -'VII=[~M>m]RUJ闔zۤMm[?_㙑> Sn_LVڥq⵻ RTgIWfn_1_ >IZRըa&/MA+@[_+`ɁP|_D_[XOA_$◿_{"8Wxmv=_A$:kûR۞wTKA +tZL %L/wz~"".WD*‚ !aAA4~_Z"0B""?fkWٚZszj>޳E_mVoœX};uvkMmo[ݏj/Su_JC p^[To~\PNa%I(* +[Տb _nW})?nU{A0WM=7!, RJZpkl$ wh4wMwKitzkk ɸVNaiT&I%BIWj Dڵjh4 I‡~&};\m;BT8]ߚMדj]=ǭtӾz]KNOSa%Ҵ{͋__I;_1#Tll_uP=]Co&88ّKKgCKIj^&YiWj_{Sv#4;^J^Kٶq] LJw밃cH)rZSد-EiICH]̠n.=Be}2UB}kde aMUSM=Mk7wy'FцvH<_tMϚ~q +sԂ~jq>f#Gfg$(ڪ!Z g[]znhFHtOWA6&Mk0$Vإy7ń/:opkխ>׿_KA~^u$p,5.I%ֿ+zIS\:5_}RKKҫwֵ_I?K~; ]uu^/aa}CC ҋXnjS޽J WqO$4uXN*ꭥmEzvlRVUm{ +^M?M Pah0]] + ]PTQ4T+x-)-y6Q2ߙ4L"L˥;8A 8Sf*X&W:2 ̖ 2.!Ƞ#]LV2BM4  49%< aGL3Q$KAam5 ASM5w4݅4'kUA0vUݪb-"l6.*PAPH«<:M[a6WdpRIuu A^iMӢ)蝴[pK(c2!hNmH%!E>`$/&ڄ= Q뭫*n?W"ё^v'qB9>'˙9UJ.h PPD;_ZNl ІBNӇkU]z*k:a +M۫rcl4.K> 6<:6lkw8dNmKwiWt=pߧ;H/kti'BwȣiR],7*斘~a;.d H"|8gT %0g#sPz dih&q q`łh`zvjk !gyBpA8!3F\Hq:O ٛyg2P3菚"`u]׭[4L!iA|'~N,&!aBa0C&Ae0  oURg{ &_ H1'}4i7wn.jZi#M}5UZGsY.;ӬoM 2+Dߠ7oT&ѮXj.poͽ Z8ZYL'{3Tt(V;&]&K)nw~7Io'd=FxXJ doi>bصO[o7onNtPTd[' }O};tV]tMP}&Zo]&K-k{z&]paV{gSR1ҫIժMﯪ_a]*]gh5 `D0 +~KM_厾i~\DF[&~Y>^FR_o^:'V=}+k_(5"O?_iOoo"O[U] Vգ=}~6׫D / _qlmjM\^UPk^?0_{KjK?m8iޚz]8ӻbMxiO]p_KZWm(wNMZMA2ka6twM&FN*)4[ZlnPҪZH7޵TNNkM:ti>ph0j}{ 'MWBBh4N֜5$akԊZMIAF8^ +Yy*0 !@؈d(q`0X0XaO$b"D0@iE&N2l#%(UPB""""Ќl $ +wS krFfD0+ & +5PQ6?WJU?K*FX-zIvFs=]yh?C>:8aBakIj[/GɆ]J#_m8hC 'NGfдFIүNa=07VqM4IIړǢTfYv(u}z]NtzW؏ON[EO]v__z-3PX̄(:X6? vR+44aoo-A;P_kO-%vw\myv٪}ɅI~մp>?~ BHbJ\_ {qVA$a{Ep ge俴=$)  Q\iGC뇩* <@qMI!) giN ֻZABDA͑gaJŦAD^ jf*>a8aUTlCMI:i ݠ(!OL!a_ M ԄDDDDBJIj]ˍZ..2[RxEڅI$$$K8hD0$B앴/w jO(T܋$H I]=_c Ji__6i^_-}CM# _Ɏq.GF9}o_ `~Wh_%0'_tO|uOw1$f.RO l*//ki !;u_P~{`DCеCBDDDCG@}!DFn\DDDFV/j]g "tn=1y/ ł  30դczc ч]nao cӺ,}% _--8qdKlj˶WToz\{'J?a? =i'߫V_hІ-UtN?JKpgA?%hG궖v޺ KUU_Ai`x_c0?_UЫO!צ\z WviUIkpjh&];BЈ.4ꩅK5&C2%A4xj3gs2U +&W莈/BhOw_2Xt'XM44 +O֋=qݧ!kϔomuǽfjq7< +.?];JKq멳O.fyNguG_(ACgçIyM6;OJ蘆wkt\t[ښ:.J^ezyNŤ~__tVHTuCIO|B_ZEAV?^X / t#N?qj(:%PF_/#=0˧] wU +M4x5}_=ӆCӫ H;N%k֓cZpMmmESnz&; T]vCI'"w (B"" h4`0LN#MWt?s^y7V`ʄJFvSB8\v djF:%/Kt_äހ'k +GUD*@q A4503 D0ȅQV!A)=z ijA0_z#hH*I&h7y<џiuoEHv.~o>Jޗ^a~M quz}\(~O߫oJmI_Cu~+qoL'_͋^R~k(c q-w_ /j)[jC `_hu_ۯa޷}{_l>_&\3_ՙx$ %_nMTTֿWzGz[˥׿_}u&jLޙ(=lOO(/az_]6„8 +{{XJ8|z}lO7aMi=ձIWӿi$za<&\ ^aSM{+Ia4q¡"""": L +]A|@Јpkz޳K]8"""#ڿo1C_8}޶z߶t:WjZO mnm.IPV %k[v al$[mvb) aƽJ)6 MvB:WLAҴ6Ќ |BjTA ';'imo +`AF9ܤ&ᅹ}"$"1,v2.ft=0k6Kp4OZMv05.~_nh>״qAfF إR6 a0s'? +Oa9]][!5ꛭ$z]A}}w^ueKQIeٙ; !Օ֠RZa 30js*aOK&V#u8]J\*&Ѣ +P<*wa; +;A7]ި:= +u}?d'i$_z>~]zkї&"=>3h-6{k2N} /M_鎣H;tKaGW~ۥoֿK#SH?;n:&GLU5*M^ EK 0q3f0 ` g#&i)@P4lՙHGSRC +D _?՟v& 0T-Ba0@͒h0L̈́Ba &Q#H uAdc>y8aPaPk=~WTN0Z0L !i5Mwm4l&ڱ_ ң"蛷v]N6CO&Q;ŧM.kMQwEmڧTbAWN7z j'dp>:M78j0KӾ'oE^<;DJ4Ri1K}5ŨMB*;bm[kI5~\/dpE|[_oRIM{$<M5IU_^m0o~:i. a4%hBDC N0 ]t;KV.~""""""""jL!O} /G+#C_  _W/pDj?#ׂ7o~m!["7B(]}Cq" -/nȣ4^Va/׮fia0+[K׵_ ~A?__xatݪ%5 :I{ 7m/ݗ\O?MUm ؤMxNXcXa-b߱L~j݋8AӥMzn 4]a4M?iǾMߧ,4괡vVR{"kdQmSKMa4i{M4I);R@ thD4HMM45'hAa{M4X[_! 0;B N2VDaN"",!0B"""""0B"=0P(HJH( DDDFRaA4p`tO IE+ۤW5IڿcZ =ߥ:5 ]-txA)Dj2wgBTxڭE$gHsCOL*~u뇄otkwCoުW§dWO~w:K~pڠR{0*++"3%eCEm _xILRSɌ6OːMU0D߿/}}o,zo//'Bީzi}Jm;ZN:OzFwukk+V:{Em{ȿVڱ~z_uqUvICتv{zߜWwo~0b]}'vآ N0ʂ("RU n m NL%8A_a6=%$C# L04` aIP0V 荲q1# 2Za0D0B /aka + `ÈiPM4 A@A8fA!jT\m0 DDDDDDDZtד~~7hꞚ5M4OXsOO#Am6i踺&]RމDߢ⋶I&úUzȣZ^;C ۧ`MInJ^Ӥ +waiIpca?/1ܔj?IJu+#\(V]i~> z}ZIu Z֡<_hXap4inXcz[b}cU!|BɄɹDD_}7~߿Bxx ֛pz&*M=vLMŇn{P 'ԝ7NN?vkvIKE8^o)nwn W[_k/կkh?: W&3ؚ;:2^ o +6 u}[~׻_ݿ{~ B (M2lG@دn>~?$ᅺ[}0UKu&S{_5jU!ȷn.Dב1p֮Wz} PK +6(&;h6{Pkǵ޵{kzUlteӺ Yzᄬ*pnII ӊꪝSM0Pa +8tUkdn p] &[AdpP8j4Aiȣצ&uޓvw5;`A Zh0S0t>40 + +V8M .e!HJFlvDDDDDDDDDDq ! pv M0@33(IЎD)j馚a0BzmZ.&]M?K, pm=.lU=7-Eőhհo[?KaE\vM ugZiӯvۣ;aڶx_4:}Ta M$=UJiM/K~d֗ tލmP5}6_a-AOjw,RQbjkilS#M&׵0ma6M0d5 QDM4Ah5T˄.{] N0NDDDDDD& iN""#V܋{l mzrwp۷\*?WqKjj").iA2+U;iW '<A%t7#C !_5 $3"FP":)? џ3agt ϒ!APڧNڶ!`4(˳2$E&hI3B @xkk'` Ja"\.OOoojA`ӄpii%-.(pMB[r.o.ZqQonj]⭊oU^i54OMl_ ރM:MiV +0K&ի 4i8N):Gѭ:IWmzm֚MG گi7M{ҧ*tu_Ӥli׺z'i0A P5 + aP0I+i Ҿ/ocBKBBe 4"#,;"g8a4AYLJp>Ӽ4/p_(zqDD}DDG^$ߤ¬^_u%Z_WeŹc֋4 gWoKըPo }ׯRƜTtWTĕ{5m/KNiinؽE<O_ܖh{i+kk7IQ砶N &,{{IMnujPkݦh P`X`hDDweh0eiӰ""!Y*c#x"d$aRT*G FP0")i!2X`Bv!a~Umvo( ˟wm;t<&' 4m~Atⓥ~~ׯuOuZ]("^fm鑴Ls'蘖M6dXfJ"T"hڠpu!alI1Q`'a3!2L͛3,3W#s!Ce: 8PA)A\ >QM5h0Bj 4 l'ޠBӈaf~ a$a=5 > z&;N,xM ]Qq~=.µA,m4P z m~=—{.=&Ӣow AL=(,NեN 䭮{adX#}pNOEr pv'KKP=(Jܕ~o=' +;< a' oT!{wZltAz駮 =t;hiiG-?>սo^R +fdO__|1U_Ik{3\ϑ |Nx Bt lB/PoҮE*3Awza0__މպ]UcڵEH7TsEoM~/A u}'ioEm]}'wH?}Y!\Uit;': P_tGNշ}imZǤu_zfk{AoׯRii]z'njڟV76`X[ ҵ~4t!븅_^Ӵœm]?'Pa ]10[I/]i?aWq59ڧՄ(޽4V%w'oM'v5M|PV)C^o(AQӫV8pNؤ_{ XH/ui>5 mouU]RnAa4L'{UCT}n_z뮓"Zpӆz (ppM~Jdca~\㺴gjEkՂa5A00@8 DDN M E,(RA[BDqt VbnaXSmS9$"""-"""#RkDDDDDlqQlVA[b!fZ%j VXk^NA{"I.v0ib!4iphiDA""ЈA !0Du#*µ +8")Z)R-s"v"ANRqS + U5嚤[6DgbY\PUӆHɵw8[PfwMSPoP4wh%P~գloJhe>ЕӤ~]/' Oezc#C=4Ajd3#P34Lẙ)ߓ>ܟInJKE9J"35 5L4 fr8X&H2 R&dr>3f38f'ӳAC]~XL +a :vBM00HZe9a4/! /^a-]y g)vj5DxX\~0EA=qԈofvO]]wnߓt$0RhȃvV0[Uˋi06&?OVFnJ/I;T& I6<>0dpEܻop/ (Ӥ|2Q W'Ӡ/^!x?L?X6tGiwC/ːD{w]??DkC_t>-w{}o tǵnv1ٚ_kX/{]iOOk_:}ծ?ZZkZ 0S^o6a_eWi[?>W Km(C-#v* _TKWa(M*˯p8bIiW;Mf4^>KUի_vݴ: 1* StbӠ݊4qXA 4AM;M k|& L&P*eZMI:k}A5t4ݥ Xi4kO ꩵA5y0iMb:e.#!]]58i_u^־_I.%u <L'HDA{A0DDEd  v+*hD2"8Xv&T-DDERqnmg4/B +d0X0*+C] 'Ka!a Dr 3S;NghDdW)[FDrmraBa0JZ- SP]PI2oّ\;YUF7Z A T<&$KBh;Ҹt\J*V}SL*7I?t7߻W_jL#w踻Aꮒkצ>(@ 22v-_ofEDr=k~=8Ma !`Iߧ]lVI$ӾCFxMS_DJjbz[ + vwh Kɟשw}iCGoN b82 #Ι2C!EI%(AFߓiwi7wafaAEٙ ggM& A"$ńD>4#yr +NG\0A`fLKtQ/>M4!B@MS8a;a=4L +BkM4 kiL_wCx oDkiIqN];OLwHS=6FA5UMU_ ~4ˋs]KN5.` ܻv)q-.-'4CHrw݂}W.?pYҶJw jvGZ[dqI'wI'a"w`m'w~]:MlMyCkO~a_J} 6Ezo]w]+`gK߶WTz[տ}U~;kk~1xukx_޽W ~_צ{#i1_iBFaR5u_H6 ~ %i+b׸ 5"ӥSWZc0V/Gra1k 5خӶƿ׫k_vu +߷_0jm' 4S/)L=#:n&!hAL q aL)GM4kKN] }=K |?V]w +U~?j]_u>%|4{[_Y]^ߵW[MK;_KYa8߆(a[M>5Kc%jDW"@al%=h=UX@lWL[4ڤiI4ߊ;ب&DŽŭ޷QQ |?ivI}WA ;A:jMh4tM1kh5ւTL-mZa5aB馩iTɎ5Xg"+DAh0˄"DEB!-"@F4 1DDDDDDFDDDDDDDD\@¥-,II$3!Lda;:pn40>uh6/]p媤'ǵ}T +iՎ0NBP&@`e̝ MqVJ`vXAndJ™Q*)v35 z&`SEpߠj4U6 h4yuxiPl?$;涍U®X~NWm'JiWp[]oگ}}_ᄑ?øI0;I?b׍Zw2+NѦRYAV$[w/!~?oM 5w +_EZc֭_.?; ER{/|%y]2BɁfe* ^jDFt +Aꨍ[Z_,f@#fj2x 6xA29 ͠dl03933`RHG(A0A?Ǒ5F30IN_5G=IZ00Bja4xAC,&zx5B&t{ ڡ􁂓6V/bO 5 +r}_tIZuh +{ޞjj|ђ5XM;IqIZzCm^8b.vO.ܝ{i˻A۴MܻaNthJ\7Dh5Nڦ)=*vKH5Obpn;"'^1E߷}-Wd6'j4m.{W:OOvo 'PiN L^ R1Z N O@d]U' *ݓZU 4+vm&x0B!q .a 0A B kŭ& Z?t뿿]M-_ʊMRhDDDDDDDQh%?ላx/{O$Wvԙ}-*ob#+El/[PE?NXE;:J?m4٧WzviUW-{_~?kZU}jfy!=mI{X`|0om; +mk+؆ /\4'6LWM_Jhp~״LmwQ 5v. ]ߑ/oƷtv;=v'NlVmF{] IՇi}iՠGMiݫM=8Nih4MPMZa-@ۤpQI@kj#m aS5[d Va2N dn0TOu@pSzU* fJtd1 &U4eB'D$"iB"!B".A¡ &Q*p 4aPay% &A{zah1D4#DjFǪjѢ5E E\}%u1[0 +l:SGK^MKa[קKZ:ʁ<"֛kyaAVBL$A #п{M0țW;xk04jha>c`jk zXt]ݢ=;uoIH'th,ɽdtj컫3c:WK^DZIatm_6Fev-<9K[!7/]W*r#’qL&dthIO_*`Nհi߷KL}ދ_;]|l־zjgK3]{_~tÕ~K]/w+wدHǕj;5Oo;M;DWm/C@b}iT]$pua:}=~)}Si4J^  +endstream +endobj +35 0 obj +<>/Width 2584/BitsPerComponent 1/Length 61624>>stream +&i;c"}3b r.3qLfN!<Ts$0gqZ2&̺*l,"P! !2$ ޚv,_ǰAHtVa) )!C2PJh *gC0DDCC@0C.hD!g Ϙ&0L 4c8g 0N:sSyrC5"fyDS@ EDDDDB`5 .4-PjA 0P5WIXY|&~U=1T;Pc理HjDL&D2GqtIDNoDP N6P2> jbIoD"n %w:*vGKIdW˺M_A}tu%dojwm&wUZvN}6hm=:ޫj}Z}/ӿ[Z@2h:#ф]Gل|_mo[m}mwj}"""""/_o>F) ZN*i߭ k X_!mE+r$%ط`5]qjA#+c T(s9C*>JZAN{)(T0aZ&@rsm@o ڬ0i;Qޝj}~DjKer&i4m>iAnjӿm&N""m{#{M{L Jjڥy׆uil0읧%C 5hX"#M;L&\04Hna0(t Ph"n""""""!I`DkIx+]9%"7I2.zTXA""1SfJGAޝBo+-޹٦EMT@mDEG`Mp0 +NUw#LT3~﵇6a?tm߻n+%w~_;T[Ӥ7ߪ__*^AQΌ#BDhff\O<̠("4Dqѡfb jheDK$#; YmDf (@дXL¬X&a0\&d !`5me"z32#ZiL*hݦ iSd"cqL\ T>\SD0!ދv:7A9rh$=Q8qEþ{i$;JN5[I/p27ivE}:.Ը^ޕ<'zmҺjᒍ<'b{Ii߮^J4݄I7wA+z쓯 M-ӻjw}'iʶ k⮵j;ۮItB!hiwn~HwKmw Zv<+AZMťuH7=tkW`_7*~ $b]Q {}تW~\.V¿NZU't]Dmzv-vDh}mI[J,mo[~&_y?Kv3ԺM}~+t^l#K|JڵTmj?taDi_&JzN[UIQnᄷ{KUaOVq[]jƓ[L~Ol v [pTЭ4oI]6QAk髎ޚ 7jNץNAM4{QXJp;uUڮ]8LPZ`Wo\'WA}]5( /5P 8Ho,v跫CT7 +d ;BS +`;C &5MJp+T¦i0Q4 մDDDA2r!""""""&qۤ6؎D)gndJޖRiNۮA&mD0A;L(1-r'8aVX*Z-iDA2Kh3dӻGj3pLzd(tLB_ 'x| 'zzK(OlUm-H53$ךd;^Jҩ[\+$A a`B0d`aALaZG!!jHDxA@fL3L+3`3__MMDlf i䐂 4`w(]4A^Oڰ[uEOxUBU;DchhwCNoژzvDŢ4I]zhwtopOzO v*zD}>2Ǥ.i5#lWd._&ŚҼ5GX;' M:mON{}*gi&R;i}Q o]:>i[CZin^5ݶi aNFP)X0U~pZqaM,1o}~iM_Ƙo +ãE^4Nvm/o}-}-L=l4;;BiZõ~/m¶~;uQkQV׬;Շ7N`{~(ӴPxDf_u,n'}VG\/OV~jAuKP?A}6խR .GªDMZ] __|pe=Hw[踻Cl"8Ŧ{t]^>DhS84z4էM4i:Ov} )h$ A0 ;pA;KN'Oᄈᒻtڿ8ajINuM^M5ijivF;I m5v4{V]W JgW>C=<'I;$='+NF L/ *kiMUl$Agpѣao\0&Vpa,2N!FӻT-ߎ]km;Cu&DDE`LÄpDDDDDDCDDDuz}꿆??/7)sZDDDDqq]H`v;_|_i0_"D/~͉פgµND 5~w45{~wOKZLpN""#Cbv_iHW}bEiC{XjwkUqz4,/Z{koATSiVݦǴTqniV+ 0JW M[5[IMj}4AIM=m[A4BiA\t KM5}mu(M54wFM™2!vPh4 U!x084 .(Yv +I" ,qR +8' $KyٜdKd § DDDDU Ј"(qOT§HF{+0[)"|[ON֝N +WҾ4Mצ+j@I*Wt""d H3L2x gYH?Q.D d#3A3p8ăˑ ȤGFQ p@xMZ`rpL д0@8 '-4B'` 0&O atj ޻\& +PMP?L/P +`Mza:TN&io+]m}oDM4H|+M?=;D. +ZX8z&v'A8mn]w`E]dpD}[HEݤ +J3g'm ztN7RlHe|6kR +d#)UN+ ޟ&'_T쓧I'uvӽ}aֶ(adXӫ٩ 5 + L& +vf…LmCvn=5M,Cd[O<z =apo;…M0ӯi{ wZݥiZA׵a1}_p EuըBWb~E}ɍ~[ֽp>Nr;VX};_]_UBܺ]{A"O'?٦b {VNSu_O4A?"oOir͗dU; :y{VV_Oտk {\/v޾V&d8Fai`qB'\ta~ZA2(˳2DG%a &NEYx<,X aG@YfG\\00JmWv֛]Vҿ! !ikX&0§v a Bj0@ӴӰ6fl@DZQ#^ )nHZڗ]lWkșخ**6]t״SOY1I=UQ7UZUkaSxv $^NݵiAƜi0V]E'M8ܷEkqOEa;h4]v' /.ޡ[: ZxMX\m^[WIQm;A8i ؠIQNVA8MAI}=\K0R׺OMSI:ZNy(yyI .VM+W鴾馕6DkWm']m'm4w%j; ɎE=צּH}uN->Ӥ7{V -Ti vFal)a5RWA54h0 Bkh00C]nrb?[OB~Ů?S`h!0L&S !XB""""gtHDDF^c:wN u}MDEGGK _K_o9CG I NTK_zRDu0\/#K-  I$I H!I$'w_UWI%H"NI$I 8~ƿN"Q>#~[i +JI$I$]?n4Pa1viJ]om{I$$ Jhy1a// ~^^յ׮]{ivD0{u[_ 8a-ﰿ}N:l+uǷ^yieU~c틏AS튵-aS="q6'aqWRtҦuI}tWpM.!۴mlD&&ȂN :n4tMkh&nOvpSNwpkT~j$Z]R# ji`(Ni 'Ok m*g`Hv_TJE ݠq +PB]4Ba0B8@2%0vpQP&Nnqa8hKXS? o*IĦAo52$A" *WMW#.zI~P+Ojt[IiKw}V8o^[I{ { T]|j:d4b `P: AC$#f3dR3HgcyՒ2'OZag0F?k0B)SMAx5OH 3 ath5L*kiGL!j[QLgJ'~O]."nص=r_=C푺Tk͵j+MfM2 h푺M:pDIAlNm&8DKǿhW軺N:.HEi+ nr7"C_M&ޭ(ӱZ۴[$Eã27lWiN+P>9:nޝx ݭڦſo~[sz$'$+{iu--4}af{ /:WJgÄM&;n A{} L8]TN4iMI5.q[So!Vկl5uՈwWP.CoM&ӻI Mji-VIHGݥm׻i>eDN]5iZiT4MM>M%uM^4G X *!&2NjiA a>04N5Դ!DDEaADDEYDD9t`DDDDDD!Q_b#B"#^/IWaI/IW_-~NE;Uڿ ]6¶xN*.4Mݠ4`^M['08k,E*>B%&F!y DNЈgjGjVL ׽S. CNShL&4W}Ǯ*8Ku}u꿕o]++4md1H!C$fNgLDB6*2& @ Ȟ.EDNB#$'2DGXM|*NIPag&hA\A ]@&x B /P + +@j5ӴB¡j*ŧiT¡j:npTN(SE~=p0n8z..:$;EïDv6:'mI;/H:/4蝿pscznV$dcOn@]]tmԲ+4{-+M oVӲV'uo䢂ujooWXAwdOV帑? 6kGyKm&GWa?4i>7OOkt`NVPvzW(u\>__TTUtu/h/.!~XB,G$<>D&;+{T/}b x uL$"_WU^QV??#0uT/y_}ׯUHCY:4/:wvg*q%\J0ڰnկ׷MUkBiY ȈV  hia#A Fd6B(KѤ`$#1#c0ys$R@ѦPEgz_u_ao/_kمG2v]+^K[TaZ 0@ @0 AA9 AB, q =xaf00! o^*46-q1_u]qRva6KqI_-}ڭBa U%t§MZ !zhZjU~>ڷj:OᤚWZo,4wm- ۺvi5nOEޑvwd^ӹqpvڢnHz.!SAM7 =liiT-6;6  ˋR,Qhll='d_j[I7 miL*d&aM#h4u_Mm< aJ9[h04~dn 0|'z7No:twkޚ{4""! 0""""" !`GMceA"""""?1u;u؈""#_ۆ?{ L~!mi~ # ]^A ®'{[z=~O}wD~޿'0_߿izB}mw6^mw)U6aaVWLpJ][jۥDDGK{[]z{J׫ +I7 {^l'7WLSkҵ=bDqUQZr-~x/I8ӵ+A % +'mE>!Rh5 ӅXNLRziêx4in4PAi[IM&t4lUSW릟jjN}-{m{_᭫in2-e(PcN4PI^*a|+jMa/ !0 N !; 0Ti'2Sa DDDq@hDF[ F r6|,Ey=5UѝZ6{~pNDd5VW5m%W cj8h黭4+Qz z/#xߑTRŝd4Dtp͋VRCdsD[ Њx2At'F˒ 6h(FfC\d!NF`F(hDP0@h^h 3fplXA*4a4A`A,N< `ذ!ńLAL͂!hBaڄ4MuZxZF\XNM4B47iE4CiDvvm8ַv6*.ꋽ.ޚ$Mn"ݤ-$^?Eo?aHr8} wKEn] vJh};hpA wpI`yD2FlȞvSc*:߮_޶GG'[_MdO[%dw[v+ ڴ7KW[d 앿tAX(&C5<n ] ޓV`io駦A-t\'ZB5ª0T0҆5Хǥk}}ç~_Q/Powoɨm+ ^Nw_״)^O~]wz<5hu]8Z'nqtߓPE='Vz_skW--k?6;Xy.D\z;k_l+kڼ 3) +`*3g}l3F nh2F]ţ<ԆdF#A ͗"2A 4˼} +i?`ީv nX`;_=t"[ j8S`<*a AB A-ƛ.ރ$܈J)hilVロIUm&i4O~ᅴ~(VL&>4vFz:J.F݄G}+vMQzNOM:oz7[uL,5 SL΀A^ /pL"4L 0LA2p zUIM?I5]Ioih20B" &u§bmiz~ V5}1C]/I_z*)a"㴸ﰓK#]# Czߺǥ+w޸ZuHv;G d|7~G1Au|td&iNM]_mW"wmx/m29uu_l"M0ֻ ,p[ w/{^[baN+N _qm1 uq>G_xaNtU6N{ӊIqKp[m֚;T馡zkkMizOi4֐mxNzvoa8L&:ttL'TӶm4kizK +AMm4ֺp^ӽ($h#!d[^d &\"-'a0B"d&eA ,& +>PAJ0y +_L&E`>"""""""""*"hSZc +_I=\!,RcK} vPےbKvz Z[m[AS]*ز#QӻdByՂa0d3&6t"Ć~'jH21 dv0ۨL#'F(͢U #m3$40AkaXA a O0B¨A'hi P4AZh6Xvp 0B3g K0_a0WM4kZIB5UT_MA!i0~j=Էz&98ˏ.&n\'~-;Dǧn! H;pS/2wpȣ<'i$mt&itF;zwdpE"AEp;}-Ew$M(V/ɿ{q2wߴ?HuuN‘b%~MyNA*fCOqiv׷>-W*mïtӽэ=Ul(*Zc?~'__Vc^_Qa_Ǯ冰PxN +_o&kY!VSXOߖMzC;omCu~N={~މE?:_~ z~}>":v7_8"Oz [4Ӆfe:,Kܕ&O*o9cdEڐ~q?_wi"Za? _[5d23ᐙA dz3Bό>AI*O`APD ftUQtPGDr383'DfUH1twamSK_,0|rv8kW+ڷUuA aWҁ 0 &L!a0;?&xBB,&b #pBa`?Iʸ& r'H~}qk}cb&?N_ebu5MUSдST ziiw L! BUv4l0k[Mۿii=i7[WCiڭ4M{o'{O`EOzjӴMڶM:j ^t A:X0ګMXjpMEM;iii'O=ozd' .'zvG_ O6^CSq 9=&Nki~m]5NՄ .? * +ȯtx^Ӵ'd:i+{NE,2OAJvS% Y &F8M?l!{R2PAp =:j)e&v5NӇ N7$F}'AMi[SЭ?UzZAWj\DC""""", !!q3BB""#X 4""""f8gn᏷__:zխD[UDiOIczcJ-/o׺_^ZkH]V~J +p2N׈-'x*KwmUx_׵]KooVmubq+N;8S٧hߺP>dw6M7ݓUM{[I7X"mOnRW:]k臨xAOi׭Zk&&WW~U"=v6*0vwpui0]Y֫ %w׫ڶ ${{ ;kkŴNw{܋մӰkVM>ڈ5N*)N5]aOkMN)0h:zM:ZӍ7 kn jAIAtOjv0_L4uaAanZפkOj>еl L(T#pi)i*# Ba0CA|5/T D 2v 3/rgiq3B""84!e*uB"2 """"DDDDDK|TBwx!HDuiTUS[_Q=%;JmZv|vʒ&oiUhWҠ +ӅZ~o_a pFeֺ@5Јd"!3Z)x͑览%, q#leȈg$Z4D$#h(A3fx0A,Ё'yЎ(F%;@O속g03`3FGa`M0B.A5@ ! ;N i]C@ό:ph! 0?"TMPaWM=Aơ?…_-5kp}SYpnEłM`p=mmw"'#uD'*Aޑpxn;A}: Aރywuz}v {ӻ]>-Kq\#v4ϣmMd$UMZXO-=UI{}d~~j{nlSW!Ouh4 aBfGd* &wO-wUvN=x6jwUIפ__C|&w BSIIq~k۽j/ׯKצ]o߯[t%Gp in~B//w'꾺KeNB5Wx_ 餷l;e&5}  _ NА>]_W kc%މc_TJ>:j믏Y:W?:mɎ_Y:b_4__O+R_Ka=*{օ~G\KuDY^MF{^$^=}5WKڿ$!)N0 ahn i#: 8Cdb#s I8  `&V3ABggF`Ԇf1I6׵];Ek#6=`;wa-bX&if4'@aS@+M< A ! 'D MBa A 4nm'*I6.⓿,\Tw4 5h\Oh> }NjMuMtӾ Oia45=0 iMcO[L00{CcէN-jjӷqp͞ꪮ\XU.z-&tMމ=k-h;bMb a4Ӻh80N: ;iӺ饴M7tz :/Ӥ!` $ &ItӫtA:Atuݦm4L.jAM5aR+ՠwt(GV<{o@JIWlէxt앷2C NXB402p[BӰy @L:aXL))C` а U{'i4 :mo_ ~nvoI}zI DDDD\0DDDDDDDD0ADDDDDDGO_c {W_8?b"#vOa_ݥK_ۯ_z/wC^Z"OI$H%I$I(I$I)ok "w4_.JI$IZJA_O_}=}z_`}w֒ARI$ $H$Tkݵhak~"7Z홿^J$I$$JB_[Kkk";AȂҵl% a үPHI$IIb☥Mb ;ZNbMXa( \4b;AL&t=>L&U^=i꾚 Mv<1IOOݭ5^4Ov &Xj '& .06GڔWLZ+janK wL!(BT*y+ I[ h4@[.0GT ӆS aVL* awxLfv"B"#-{AReRBO]SOPJ#;♐\0i- ⴛK [ZfieI|Z|UźAxxkJ(szjHviDDPeAX fv(320gsa 2100 !! ' p* (T~~ֿNL;cM&o'6´['zE߽4]pwxhtNAWMR7rQݩ+hr#cM }d>-"F{&Yd'MbjJ)7Bz i7yKa08H0#}FɺMrWPPɺP;[-ɺpOUqǰuhxu5W_ W/5K/_׫oDzWe?W{]K릛*vV~m- _/QCB-+k'ww%_uUQU7Ǔ^k_?٧NJT* mk_-zo_5r\*N =JHfhƫd*5*Cdiك$3Tu*͵l*]/[_`tksH0#3dD(F#FP2r4͐M 48 83`Lg #B& dsE>Ds(aP\NhH36GJF$խ_v~ !~ L!a apaS 4M0aT!݄, Іi ! 4keVl4^\akZGث&+Za0 +kL;q +j_V.kLSIwm^{nh47n}ڗn4Lz}"yvդIm4 }Dmn M~`۬&niUnitm&7NiMm&A8'wIݭImOᑼ0N§a?jkA6ȣ[do/S#M{M<:Մk:Uk҆;ivF8_U%pyOOU~˿.g]2Nzd&vR^d$Nva0D $NAP3UNEA8O8a0CPTPZ_O'iU֛hw߭օiHix2",!`  !hDDDDDCT"""""#{ՠ ooX"*"+^EWρ}pAҰ DD?տ~/X_d|b/WzEBjkm(yBo'_B߯IдN_B h/%iT*TCak, e8@i~L;ikX]; X]Z*DGIn5;OOˮӏװڱ[f _ :?" #Ui![R>*m(u_}Q ZNo +}F=qT>Nvw &wi}=VT+J7aeVi}* R21umU4 JaM\&5ȃ[^W2Gj 4W$F&SYuM2N5M0a 02L iݦG¡ " 0 pV„ +YpB*a4M0084d6 0LMaAAMu B""6"""¡T"""""UUA5]S +EN."}mz/^nva_$ ô-$9?NBm˫u';+J᥇a5nw_[p[UNoM'E]qljђGG#C$y#;"#j\ rPb3$F#lh3c6fό8i d F gtU3ς AGTGf `<0ŦhC>ˌ @, oa M !a5B 0A 5 '"2>a4=l4"¦h?uL װ}Ţօ{kJ^c]?TDOMx.'ovuwa]ỢEzn1qwD p{0W.d;O'zoy JS z}$b&y SXˢGzȖe_ z܈:Mn;} 6Ӿy{wTlt7h4 !$ !v}ԭMABhp uo/T]o}B  j}&^__zz/׿[m_/!kOBmdgþZNl;m~X 2aۥ/_>l*lLnD ?࿅޿ۺA$t &?w_D$Nx֭~޿:IAN:z_>ն_m3NNݭm~g~=_U$fPȋ LI$o$\[_T{^zT]o߰i~afpAa8a`AC4$ aAeCF83bCaP;m2b>fh3P{ %J>6_ۿM0IWJ!aa? 4 4Fp„5iń!zZX 3SaXAbӥșب"C^׆C\$%nzm>1zzj-M5DVZZjuz{ƩjN㯸ؠ]k +M'oknEH>qDݰH9yE݅.މþ +\ev V{Da L:iNi'LR4ݫP8AN 4 a8h:wݺ}vA=K$%i^'zi^J,28ӼQ;LշPN4iݴ׮aVvG zvjM50]kW_vO+5^HtvVmtAXOI3AMaJ4%aBe 4 :b"D}ULBM;G؆U{Ow?x}oIDDE"D """"" """"#v?*h/Az /1t궗Ku- Ț_%UbB})]M?+/^Z  6eUKÿO +Dc/p_mzK߬?} +&}GA?F(^"O *]R'Auf/+_A{Zw'MTW˧L?Iz_kz^g_ִIt ._wa_]꽆Gav~L0vۿ_Ml.P~~r& C@㋃ G].]ރ=b\1QA04nMx׏kPvj4M8wQMH8l6+AWmiMwviNUk[ +F +Eu kקp}ְErj%򔌇L: -T*Ѭtªzd !Zdxf`>APd@3񠦈QӚk &T0AaP 8c,< a  Ia5L*`0CT&m'AC/~4Ӌ[M4a;ǭ֋Mwkp_.T)7npw{E"p8-}nU&[;NNۗJdnD7{7nOMIA;%dwt<&imdqieT EM";Xt[oW7[jN[ao}'}~[CL)[`'_QtS]?Z]?[U7[U[5^Ӯwp_?TUu}>_^ǑGO}qwuiuw{ +.uW\>R,;NKWSRsN"_/XN]_(I'{+L"_+"٧W__E[_WM_O5K[KmF[LdvL @IKPpg3l Ĉ8frg?׷M0k^_Fw]_;[b u i,!a0PM&XD#Ms0!qh5Zi!i<"yn ! &XT/ ,ClTU(}kkګ}ua]OM4UO;O„4==S_M>SCE -C{M>it4 Mӻj;j+NObIQDިMܸrhw K/ h.(8j;i'M⟤AMZ +N mi M;p6Ǣp>p;“MVmaoO' #O/n#AuMkiM0߅o {Am2PAv{5}vN'xdqh7N;W;2Vt}<#%oo}4A pM0暓N +LpT蹶U, e@Eph4"! p 8a20_tۡ}zioK_J}i.QDR#_zu^b"_X~~uׯ6 +~a}Cu\;__ޯä0wSSu_~4vauE]0Zww0 +^ %ic4w_k"#ik]Hհm/iۯK'߿Am.-|8܈aզvab;Z{cN4ڴUiE&^6(&ŭ{iZw=K4M]ӪMvM]4 M6P5xɱ>M5[Mm5놘^Aj ڵjM]4";)U##4taPh3X)@a 2nij_5a;w^O^_y%nzD;wd %Eȗ< 2r$e25ěLE>| 40ʄh(C3!B7[T0 6%`f, =_¦i!ńA a360X͌*q  +.0LA!a? j !a=0Z߿UX5EC}ۢHnˎ"?OWނ/ +vyhr%߭wI'\<<7i8`A@{_w޹(z  EpSIlɰ2)D*L 'pU?o.IJӲVzmn}Kd&xM<'g`0PJ*T\?T_i޴|7WZMT*o wu_?'/گ_pz+y)NvBwkwR?_Q^F$_Bow?~u _:ד7uK_8_ }!+$ujHTPȁSG~4F8 +F#dl&wa{_.%ͲC'"0ˌ'(ӄi[m'TQIbⶩL 0mxAҦӺ§ -`0Dr}~ߧC=~WONb?׈ߧ὿DDEq5&SEU_1oQ~)!դ"8Շ_D}o^z+D|{G%&Vomoma+m{/}_|c|/agg0_{Nr{ߢnA}݆u-&;_tFa/m?CRIBIi$ $@Baw׎]{!}g -6sG_A/Ja$R)A,,A}!|uq _/}űlWvwP5vV !`PBP ^馜Zv5{Nm4kSMh:b5 -$ a8⶝M&ծM aZkM5aPa5][M4OI + + $A*;5FC3DW+Ml-=uh4M MI@[h &0J*AB"-mm2d aSFC2")l + ,DJA8a0C#,xa AB"""4 $L!xaMB@Pm5Mb")k)PC۪JVg{ Z6 ]}Jtk 5ÑenӕDﴑb$tv_aPָi6:뎿m4K` I{UK{)Ѓ)Od6S2A(Ԕ d}pO:2LF#)#VF3J)@ԆG0A@3 `(L&dh 3=W +fa … 34 4 k,J=5PM0E i +piS :Lf魦4MN<{owO}iMknPNߢ[x +K軰R/*l27"IDMK։÷?jZMAI=uRm+{m.uK =J+WvIm*~Kjggo fy)&8U:Iv&p⾮:uWWunYL.$mbwz}WUM/pǥꪚwW״b m-__ O]I^H[vﻴ&5Vʦs!TFmVt*}ҭ?Y>xIwܤVۻz9޻_CCUcc^(=z+/߆6i퓦V_}PVoAtT^>NNi4vꕽ>m;*:Jwl +Fuvm}u<[O%DS '0d6q7"Fba03aR '!g( !:* 3C'D' R": h,}94եͯ}ROJU >it4 ( !a03Ph3'$A00N Md6G0A<  '{Y}۫]oM~_TKV^_b0Gvr$ +m.TN- MSM4.i]5X@¦ڪG@KK[Y~8խ^QKZGR35OkioTLz.(T8hݻ鬸h 4N7oo84h&Gq4na4CN I'i4:'N'{ Z.hizyzzm{&Ov.N2wtNnh6ݴVӴi5{۵L4Oڻat:aM2(koM^~:KnA>ij%d7H'p꓇jIޝ&' u` M5ZabkvAᯠª NAivNuQ7'6NӴ4?o?B/ Θ&DD0k57)"N {4_?H,8o٧:߮ozefwYi}k~}k}]a={ ~|0ZZbcGk /cmt |]+^=Xi2:jӳ +?LyCa=DUkp^ $\Eq8;n=Qk]JMi4+h'NqM{a0;x)AXMӽZi=5 Tzza4&> ꝪVj&HN#fW+3y B PdE 0A 4z&AP0V a0ky q)gi)i 3BB} / ʕ!s.RpA DDa` !AuBb""4",e DDe{TF @pD]lΛ%74=⯎ժ.MoQKצh5=L/Zu^FK%r! t'ͳNDtvk<^4˒d"e ! > |U4 ~0gO8Gg2#ADPvG"%A S FE œ `v5L ‚g3Q8(!vA 3dZwaU0&TA } O4pi: ~ON/B-VMxwv$>)w1'M~l[N.`o0R6oDaGa<0Nç 8Ӥ#ڮ]Exkp+nL#OFg(Gc`I'd<=5%_>'WvzOMN-әFDW'Fئ3ewgiQGf.O:4L=tI_HoU~Ƿ_ք(T4L?վi~ֻ&?/G/?u_oioGw8:!uG|$[s +&OA/}7t7!w{i_om/1~aou|qƔE'_޽h__ ͧ1홈 f|}g}_k_0i*ZM}h0_m_mz"qC~Y(8AjcLL4ˑ>i qAiw"C_9v.llm펟MnDՑ /W. 9TDaO\(! BaSM?SL*wUL&!k"_>)U;K|qj؇T'Pj0ڪqi֝ 馱i֚ꪚ&;E=6OikNߤ\0Mڴq}Ӧ WM􃶓MxN } 4i5j68܌z'{[p$NߢN:/"E.l$]-iM'hCpM5յM4^4m0 -{iv{M{Ywa=[;#O tdQڻxzv$t}AdqH7%IO(W潪a4h0i@Hp' ( +Y!y#Dp6 ' +'䮯#4_ }MUO ~ߴ %i;B""/R('0DDA 0DDDDE!OM5ӯOikՅ]zC O{~-?*_c hW ï_N}UnoR__c}OtwwN_:kcfMzc8?M[_Wa$ +__MmoT}ۮ{_ uaiG\m2ku6[[Aiwd{ V*˯ki|+ k%Mxۮ0QIpMbXaiJ 7NSM:ziIӊb駼4NӷhXӢ'UW5Sw[o]m| t+Xa)VU|;$sȐ{@@BWꔋFda@D6Q<fH"B6I̗H`;LѦC΂ =M2!є < g0"b%&͙f& !¦ !j ,XP@ +}h0 > +,'4]l T-SN ީMwQ8=ۅhvhݢpD-M./[ ˶i6 .J2; 'xAiXmHDC7~6t%oDvC({NdVMӥrXv+j%i|4 ߻U &x;!DDL #$P[ +oVWSu O\7zit:}߅ +\*a0:z_<Q~Wn{Xc~]4UA? ҭyoK -Z^ V}Bao-_/wm/o+)+_(u7ޡЫעQE ?DfoUcn[٧kak}emN^:?_ԡ A{WW}a~WC~. +Է g\auԤ2)`A0R\Of" g 2hgDmA>G LdCͲ҆ǧkaiz0K}{/r(  A|hA0L&0hZ (!ifla h0a3A#fXO{{WV]0ӷ;^U^|vpAzoڦ"§Aj k i t޶kƩ&zi︃i=]6izk&Mݦ蛇rD,{։wúoYp8t}\[NݤiL Ӧv==biIHAoi8hpIvNᑻ m` `'tNtl` צUI֭V_}IW2NHN/]zMu m;utDvH}\MCIrWd4iihL&Mnʨ&O$aݒ&B""-l)Ϩ@t e2E2BhDQhd!u47B? .a0DDDDDD!ЈT:]zuߧz]~޾/n71Xi_b!}ˏ Bk.ax ++']{a>wuo}/noDձ~w%O%m$N"Q:^}/+ ܝ7C[|׵IwJ~YI[_*6/\lp׵V^__맿^A}/^ *mA^jmZ$`6|6+KrAA:>A㷎I6=SmVM8[{bXa.uinoM8NjAi0Wk h8iOG^&Miwj)Zn +UƐA8a?:i`028[UASe1'k%H80ݑh; ̉Y@e@bS4„&a3B")K4.[PgEqaQaP8!.T . l&a .8wa UlkmS[]4{DǦۦ/ {^׺EE}`m5D60Z."wM QܻnT߻ +xødqiҺnᴭwII6ᒂ,}ݓu&-fCYy"g8GdAdb7_dCVﬕPӺ_O;$O^2m(AK\; +L6jML CnPt.}t:zuAU5U[U"Hal&0ZŶ ZM~~տ  & 0"ᱼB8I?~:$_xTtV7'L'_[NAiSvimf' ^_׿Cs$?sE/;]mdw}i6PMo_?vP_Oam'rts]_ڷN뒟̀smkȊyM4^tuF7!fhf4Fa Adky'g`f^Y("r'E*P4H +/KiEV ~mOv /_لNpXiZ>׽v @bM,&ك32DVp`A0a8in/„ &`Zay fIÅOIM%m|Vibض*6EQA%ViӇP}XT S׼ MPi>:]JTjBOlmp(^5Vm;tj!ilUެk'}?䟫;j$[TT\Wi_rqOOE7C* 4M:llPnAփ4iTNiM&&itI6 DH&^6N/.'mNDQ.'D} )1$ƋC 턓 {'kAJq3-pV]Ml dOivm&C +]'o܊vGt666(uoyƫ}.B5߸d$a{.0AS,$0&$4F{DXL a0aO: ]!!%陸oI״X}>z_LuB;}^ׯ1kuװMyF} &%8E?kAU{_'iC]~?k_ķ|aPK]43"F>-~a-@kmҴVAjꕽkN)[JZ04bO ƚqkM 0m&Q_QXA[ 87JO =B6MPk߶@զ5OtP#"v骶FXal-n0vF骭 4!2nL&pL ڑ]{ +ĂA3d34 4a:B!#]RVEr & o0B!#2+Јa`e0L & +B""#DJ*BIj]G~M +U'uxpk5J +>6[V>++̊qH˙ !\KID r_R%SpѳU|pTaPjOZp,։]ڴ֓N]!ޱ]N;)IT5wA騭0AB&N.ԛ;h7z.t O;#'wI>iMilUk nlvopޗOZAúM%oup’"6'U~%t'"ȣMAtd> +f aaO '2n*m;5Kz_=';[eDF^a"" Ј-^v/F9?cƱDDD{_=$7 _ǠZ B/X!a~^Wv׸a[]HZ'+&D *(J/O('^46]~z0mI4U 5'Z&;Uj__kIH~[}.wwM4?]9{UjK)|0NLokiiХI%A!Z]!JtGU_l[ȃqb1A4) ǡB I N< V+ 4ۭ74hVŦ?UMiuTN 5XARA _Vm[WUI5^§pk&}M + )+IT! +m=xd% aCMj A#gPZiiPAЈqB"""""""" Ј DDDa"#/`DDDDDDDDDc/[O;H2̪EeMKhT ʳ#L"٣vE\*M4U4",W+}5t[@A`5[˺RC Ӛ% 8rFTiI\q[N:k;>|JT|3dq,S5"tmsK$0"4/R +'36g  A+\V314 0L! 00@0D\y`99 04OP*jOԏƓ &v0SXh4jxP0LB}*ttN״&;T +Dp=Qx8ޞ4wD/0ߪ ^p—mwH; pset."軥ywDl5pUNrP%_~z -ߤzOF; .vZc_h 㺥ׯU?i/}~+ߠa_Bw%[ibC*\?bK%d_ +V_P^?)+_ȱRQ._?J?o4-I+~٩zC[^OڵߤMVy?_}- ]uaag~ -^KKH]X"vm' {Aw{TqaCXjv&ao ׺bEq>."8 laMCz &O~j||mm&:Zm iNS jL4vM:(kt@j S" 5*i &^(L)"kaQ݄`A&eoAavj0|0Af!a00!PDDDDDDDDDDDDDDGD& S_}/Z,󰙐2z\DPq2<싋B0iL'Uu]u,{{ܔ'Iޜp-Ȫ$tUKۼ";f+fI-~]>WRG']W23Q/$vxd5d`͙DULNODG_j萟hr;BBO߯͟$^ B@֪9ڪ_ZEa1 y#RVrf[!d i<σA)0'feAf#@ &jsh2q a;f -4:C>'iރ.,h04ip м a5 :T[&E{U(u7_z']ONE7Ei"p7˻53z10Z.ޥE  踆 +\:yw h*ZnC@G۾?DA^MO I0Exdn_k ~ȃ}/ΐSfg;w'6_.&K4Cվ4߰{PL'v[KƶK޿^4[NamG0QcT_X_uGO_G?۴4o , .'ZAW]Wi^A"m;k{ V5߂;&ׯ:iЧX^JumzjoҺ=&A} wu %-j{ oQ;">+.aM6v_c+K!5Պt+Xi4޵8mV+omSA0ڧE}OU.-SSV&E5 ⚊}xa/4յMzAN;M^ ;vPh:NjiM4}4A"{U"Ma[0NXaSSMjM=a2p(U}i%d}aCDDv h!(""$(,dEL+S9 SZ{#L)al RN[BYTT҄5;@0S¦vAʽucv;mm\?N]VTakH,Sݒő$S C;#DO0ΐ@>&=yO&ד"*`C' a-*h;_OdkXxacqp­-6MqTt >! צpMxtOMZ4Mm{ +HvEu +2PD3V0T"DX 0[5TDDDDDDDDw+ ڸg">@LW2$2MBd iPav!Y$h2 +`Tӂ.W馝 9c%zr(VO@މ*ڶ G}Q\V7.>IU_O+ #hXU%m&5B!U,ƃ3rr6` dFGId4 0A'#.! 4"D]H A9 0`ZaZz " &xBA 'iմа!h3 ͑a  M0M , h=A x]SO];MNiM4L~鮚$pp7/(HH 0ZWV?ɻV=' &;'DOI_}' $a WJv}h0p'vE(MM]|u*OV*vm&i~'~96f~%*LEpqLgMA9'HvWC8I>m~[ +TPv~h3晜Jȃ_t>C~ݺuߨ^߯p<*z邅*` Wkk^꾣׫^ _ꠘL$o_=CRz?K=yj?i6T/Ç-aW/kQLw_ad:;5ܘNO];^(Dik;ę';Z%F>u:oIi#'_[P:'Z꺏J_[NP/m{RU׵6i_UW V׵l%{uKiuZ$9s=2t:} >4C)%YPrf%v׽Wk_ 5aa.*;/]iH$zlVב2ϙd@Pg p1axζgi+%2'cL3#eœ3G4[һ[_}o.⯾˯=ڏmlaPըԈD-*BU[ +B A5 L4_jª3l4 Dȗbm4 % cMt;K AUNO +I맄MxOMdQ 4HɎވ'+}h0u ӦlWTZTM+^Nwh0R$ ႗mMCoH<' N;w~*OA>jiTM[P j0*dqz᭤;t'dqa$B p z T 0RȏvJ_aSJl: ' J[TM  $L Rܤ0"L!)aAޟ8Q ZO|*ao + &IMgRA'Bb")DDD1ߡU^~:+RDDDDDDDDDD}_~ _zoD,A)xi}o^_B> 3˫RmD:uNG'ZQ'[MC/Ꟛﵿ_i7ץڧ=}6M׾Ҥdque /{ nY}/{CשX]cȖ/=lJ݂*{}xI2^BizqJڡU'ȑN>Ӧ8t7M=4Ӄ`$Ae5Iz}iaW : T¦}iI۪kziiEEZi.W /XI5A4֝tAikݭXWݺvh4 R^Jw GM2|D00M4LT:q0CM0d' \#t#52&_ &QA „ Ci `b""""""""""Ba"ЈaDC" 5 `XMaL!p@!8_ L ++RUadR]a艣A*E^BE)/WAvn7tIE5KvVJöZLa +Oߪ^wNrR e53ƁUOY몐̧ȣ@F(#S:D#fl ς yf38Aٛ Jr:!A3B$fp&iCFqa0Ba|D;p Z 0CMa0Z υiaa0i}{vMS]5EaXvTO[VKZv$"p] +7l&EE /";Ɏzro^'tӥ˻"2V'| [%vvN[l =W"3 J("pvoc׿ RauyC8I??Oϴ 6sDk2C24&j7Ii{J´w]Kzwǿ|&aˆS ɨup^mR޹  ¬4 +Qʟ:uVmo맥iz /뗯uل2XvWO\z'NV{^,ƿo8pCnA7_?#? =?w٧{Bh߯h?uOOAFz~VkWv%!e[!F =5;[__/{u'_ O>ϴ 4drAh SH> aɆj8r>dvhik;T,e mHVn%_iDO=4ױ4k/ *+iZi/\(B0PPAXL!e('3 vfc410@4 Ё 0`c!j'&8Z=c~҈llT4+ivӽS5M|(MUzW&z ?AIҸ.|RzR&i*pOh*tRl~M4h􃼼ԸW.ǵM+Zj&[!L 4Պ:  7Ki&I۵NWm& JOM|W"2Pl00Nn4: ͗}"{$;'tAAwD^ZD'vZMZjS\d(5OիM7앭jժki "!oI+uuny'M0DH}=q'xZIZ\ ߤNTNkeb}a5\ib!0DC +˄ ! PDMHDDGMUo7mƷ`q^boCd!צ~E 8DE~\""%lDDD{Ս//9'տt;#DDDF? ~[ ?P7 +ǵ^j+ ^?a3y-C4.Fc_^ycJ0dyab O_m(|= &{־/_Nau(^P{:Ow]W}}˧0[F گAl`OQiT34}^='Z7_կk^kkw;Vҽr k [i_uJi?MT^Tw|l5@ҽV![~ wk}{i{H;E&MM&TzioIUTm8N8ڴߦ/MZ~4&W a8A5}ꓠAi*V_a<[ vLpM0K];ȣ 4;MeZa4Pzh^j5v OM'U.e<]7m'm݂:'ݴ]dW"<7wG`q\iw ;8azwa +FmީJt=l>(a7%}'5$(j$"DPV>h`oNO' +;|MVGt?ak]?|U5xMa9 TBa +P!;4_ŽX~B҅[ۭ|1_zaSWw m7A0ݷ%ҫ}wi*ޯh-w޽n-<"% L'v彷VՠOL97_]hAv__ɧoַhmGz  UNMEwa-~~z-6sVۯ$AP:VAn6V6zDC+{otNv}_xo'KVX^֓U몺CI>)q넟6z-wW>/}[ojRxO0T?D#5ԕ~-^\;kھZ_jҵ?a3 +p8j> RA7Dˣ'ɤPA2 nV-WUZaM/=5{_]wNBQ!`Mba a=h ;aA0xdR$9Al<HTAwqV^"]_{uwij4IpANpaT&&U kH&v{H} ~Hr&}5=>}kL'b.Z&L/dt +oN!z$?UATjӎڤڎ?iAM4i m:jqN+[M=նGGi&m&A<qtN2 zZ&5yqaa$N˻ EN[M}m&Woڵ[]&FkXaMUꝦ6U-R+i:^Amu4&R0;#jN7[PL/kPi}ᦰa&2L!ce +D{CyjKT]Tn*y}|)r+[n{O_NiRhDDDDC(pE2\ʪ)/}OZ URI*HDCLu:OJJT%]U%ctZ^׼], һ.5־յCD8*JUUKZUKkOJ +nH/7I֩-jUפtUIW]/WҪ/֧^ޖD!t_"CM-%KzGVY//D޵I! +]UFҴ*_# +֪˪u~_bwªi+f|h6Tk08GAm^ +b%aڿa.ڭUAȗحh5݊ ؤoR74S +>*=v+z v=?Mav nk'U5L*]0Th6L L)'NL vu\*\ Bk꺪Tէ W+Ԍl$;""'@a0`EL *i# a MUPjAM2Q8 2WL faV""""""#B"a0DDDA)@`]g-JM0n0%pٕh(( dU֨6^mUiU}a#fcSgCAfP@N39g ^U a0 +\ A|CҴohaݵkxX4PL+Bꩯ__bcWNPY= {E-.~ /^XOn^[ZD[ApBSa|.IdʾPOH'Æ"^~?_;_tՓ}VAt}/K߮w A>4a4^V6ZuN) +ՊM*__B(/L=~_VVaz V8&BDHE俷c)3_~:__al^^ +0K`|ل6a !` e:|z8dĝ\e˞a.>a:_R/n ߦG\S~Hi{AWr$-j FAiCXL&M"C{33a `L*}6q ̈́,&63(3D` !Z{>H=~v D5GkWlkoj65'FU AꪐEZ~§qa;Ӵ/A͆ 'a[ E*­ v.&E:[i4k4M7i IU{ J>AW!1nSmvD-oNz~\QpU^4LvhS9ƘOCjM6ӄNa5m{8 uM;KtI ސ]"WbAcWV6 RwH:A]3An 5^EVš+"j钵L& -ke xeM , `I5h=zvudqK/z;rwIKIvY, jTm4K y (pL ¢BvDDTDDDDe""5K(Ih*\Lt:4;piꞛX! 'i"#(pJuUit꼍֒KUI i֛_WiޗD~jDF;Z_Ctuj֩zJiwkܱدTZZ^VUkZ_ҪTi&W_үZUKU߄wT4ZU/*cҪ}W_T껯4 +~/괗)뮵I.QDt^2pEM(tk%^֪~ٟ,0 OVN #T4E֒rgh=> UUҩA_h_a!h4 GՅI$l$VuDum ?6Q*\z m.ZV)ZƫdcWk)0`vjЭUm1K^_UQ[ZjPA1KimPTTBdU0"iUSU]27_XMNM:M4Mе`L&a L&&§a0L& +eW 'jAZnէ߆pR;gaHpM""" &PDXB"!ńA0@#L/L`GaqY ([XC@"2&Biz݆ʪjl}BAPC4kŠW"b&BT!NaJK)##fyEȠgE̐*hÙ%FN˘A4 0SࠆH$x0 "(Ɓ &|&C;OM4-4IRA P-Iޮ\u7w0Ea"n'D򋺸`B+pwNN,f; zi݄/v~ޗOUjNuׯ+^c Pa ߖ`9=ú0Y_mU]?]nﮚ54帖ڝP}{^7θn߿-`!k$3S35;)Dt$݇ڿ߷﾿>tax` +aK \ȥ@i{#>M;MS +5 pviwv5V.d\SDǧwɿm6 mE& GۦzAN- 'mݧ~L|;T4Ӷm:vtjUzlZߵdn'It[ժa4O L)}t&ɺC:Mak xapaBa8a0Ag0&Q2Nl&MXLb>whcWtQaDDDezQw(rz^GBABd'.?)%4di ]) G_#J߈9=ȮuiA0oq]7iM7uwӧ}k릚~ݧjGi`2B!LIi,0Dcd&qng#-ā*dgjQj"/)S"4骦TPU%&@a%]u[„U;{_ao~^;r4A@֚|Gw [N%Vo\C 1$ +Ãa &#i'dn't> 0&'K%'2xAݽ ޛ߼O}Nh%x}}}ui=PFnnzWޛ[uXK'mzo_Wۭ}]_qk0W'fhD!ѫo_uE~ݏ_>WJD[ f0@"̋B*rvO E͊BZ%( 6rwmGiA ipq ^ @0@=,"0Ywڮj3c6`29+lf ak}SSzMS_}4P ӿuHo !p>30kcx~vӢo8k&>+T]joڵPP^+ oUtoٗm&WDӶhnV ww-}wɻKTN={}7ߵ_?X''xV>C^? u]6NrvG[ }b!m%l'\Rsto-׮!o?_ +iW%xPƿֆ?'AڻCAuwK?V!|Bܘ?oI{N_aw{m/~9=a|+uO{_뒂(Oㇵ!ݵm_xocHC"5/ao!Atkwkt~մ٢k'Z%#vh?￯xWkjP{Oo"ȃ?:?nD~Nco ^۰͉Ʋiݯ 뭪4^O-%{V $ƛ6A>0~za`zk1λm{]/WCMШ«1a$xiit‡{M{xIo?$˵z%Ma{} jM*Ana*J­cMjjb~Ⴕ{ %V *QMqa +aׄPN JހXڧ=3xh6HtJ4+]+ q|]40B H&DDDDGM; kէ]XL t] 4{i]ڄ"""""#48MaBaޝ6O -ڶMv#"!:!0+ja{L. %J"L+jjh08XEjaL UJDe쫆=lTV PAJAe'*Jq $\GGу#0"-YQ ga0(P' " 'l9:""6ȐD1a b )jFB +wMkAPH !g@M0 =4*h;}MaYθL mZT0iB#m;nAdȤwy/c)t*"jDvaWaHXm.7 2 "lDL$fIIi s:##a6u.7'H:W~۫{߮P A4oxAnAM&zޓt}}{uTH6jޖ ׷{TNh_z7{v0IjpۻkXޓ04?k_~鸊-?Gf~Vِ&4o߷z>=.?3E_w,}`뮿?\/\W{d3(G\3]03Fyvpa< ^E}_X`,&łaG@G"2NL͝`8 +#NWG]Pys$9kA^7 kai",&XM/[0L"L&PAX 3[<ˍL dH@Dak״MOcz~qi8AS];B5B`M>{~ױoxcih=\~N;.)!qôڴI7֯馪ՠIN{cm/Sp‘;ԔY+"DZ ȯE\28v?h:ONh l0R7..w -OKwޗ_xN7LӮ0𻴫ݦ&к{m+AA i:ONt%m_[m5&nwJӯ~5׻uk8}}~.=}뮵}+4lkui7ׯtz>}~t[n~֯իj &B_SM&X;{QiaꕝS #t{:n_iZ+5^O_'UB[,>_>^,974߼_ i_~텆 bl⢿֒V_ x[oPVmᄛ o;Ah7d#؄A@m( %[4^Fu:D#"Oo Kix+`lS  ئ)05L Ma[JLKklϿ/4'Ao'a>a1Mi~4/8R@PCLsA *o} Ln{R>PMPh0 D"""%Yc /kj}^&;nKvA +C@,qkw|U\Rh=il'0ߗ {Q Aqj1Cض݈v"gr&^8bK""=;i; 4kA 0XM6M5i< j6!Ujկ_Vj5i4ޓAַjah2M8id0E5d&P5]5]5; W3.BIEmY+@ 0DtPs4ii0B".dp OL(`DDDDF?6RT 2W+[5;2a:{_'{L!i^Uip\SUl'˳B g<OeEeȐ3lA +GOÄa ¨P!``04zjzE90a<&P"iPCL*kiӂ L};ӗoED&=;DNDǯ&;1 z'NȯDaw}., q? %E_i&SϿ=?}kG"0!u2@aiAAńP +A&kM{OkD=&7M4WA~iZ߽Pa ϰD zivIh4N.N˷zpE ݴwwy(wv +Lz%,"OMܜ~Ӵ]BziSe=np^pMMEz' vG" -mҪy;zVwJ,:'E : +Aa0ߦ{v7vE{`]$Izv & Zd%T='j7Huip8d- *6:" u%y+}V,%tzxAZگkz^߇_cjU}BC7}'J _:ONyޝ}G^~!M{xAV5m꾟^lRi|W}~ c_o *R#+v='/ Wrz!aܽT/ +'N*/7j?Cץu_/^%u"pg7v׫\?>%_/^{5uk٧c[w}{u'?ר_ضw^z0_XaZl_I_Vit{O{ 7z?ҵ0/d~ب+mn]]{{{k kNt/tKY;˫_~Ҫv&JVt* 7$&!%w|vEa# -t+JKqzw iH4qTݦh+Z^ + $ Z_iZ[Iqjƚ{m\&Z궓ڶi6$nZM*^k߭-+I6OkMSOOta4aB` G]ij05ᦨ 4ۆpb^RjM;M>iKW{0Fӿ%UPDDDDDC iB""CA +PL&&8R]0al&I¯k 6 Z Sޟ] 00JANDA : HaDDDD!90B8 &DZA ;Ao AA"qaB"""2ӌhDDDN%B" &a +:eb""""5(ih) Q[TJkд ‡`"<wLWaBeiS[i0L(S#Qd\l&E +dW`ܺ8ւh0 *iܕ'z] T -ɏ@v_OIח.n%e9\ g`#m5ODk&үWnq"y8h3g62Ah gV"Ut`-0 4!!a3Ǧ}9S@LYA*Р _D3B/DDeNd0jh&q#0h2 gbц("b'0D\ :BL. j뿇SE𪚦!K #AB!iL&2|3#A0B )8pK8i,&`:, aR'8{&޼;Q7u_„i!P]B AA ~, zMvFvO e ~VZOO8H\=h-BzS\,Z6C n[O^^K9ޛMjG\6Dn IEȣ ]CdQEۤ]v}=-m;k_o,n /œt:NkM28O],'c F=V%zC>/vko__ ƻMpCkzL'Cz6u/~ B'^_ݠn߆*:__?_cw?~B_ïTouMot,;rZ}߯u9z_W/W~6Oտk_ip?6W?ѥ~Z~fǿu7oӠm;}u_}uUk7]iOFmKZ_yuWQr%[m-_a8O4I밶_/ oMI,qTl5]{]:_ޙXWx+]L&8kio~_놿{]zޛ?:uvlV#bk{Im'J594qWUjia7iV 1A0aA1)7IڭJO}674 0AONL +aRAtAυM~봡l$[VtTR & A:T5OhDqYx5!l}*v'a!4 ; *Vek馰Mo} FM]/HDG-zi`DEi݄!, +t)CHym.EIU^mT-AiViD*mDEC(t1 +endstream +endobj +36 0 obj +<>/Width 2584/BitsPerComponent 1/Length 16>>stream + +endstream +endobj +14 0 obj +<>stream +x}KsG]vH(㕏A[Uj'ښ% + F*@3Wy.pG&3 <#ꬳMXWg~4欩n_zҞ'o/~~Oi|_i1ؚ3zd&U"3YfBC`g꒤9D/W5툋A곪]r{)v"Ae3D()k'|*QqoVg9*AEߍ?]v'JdN|т0#aj]'x骻q19S뙸fj09#KuLyLkm̲r!}o~Nʠ3(xmY!dFDz οPg7>fl Uz)Ht@vZ8}fGO߯]2J.Ae'?rT7NUXa]9m9OHA xpi:kuu=3y^It"ϫЖ?- o/JBؖۛx.=UU)37?(XSuQE~1}[FK͙IE?4{ Z//b^)ѾbPU S!|!EftPO|xe[_AE!Π[2]06$j\* ^)&LwnxthcP7m^OS|!HT%T)LF#aRVȝTmF7lz +X+OڝUeq'7ev-<ɚ}G2D5 p*^1H'T'nڑ0]~Ml3㪣9``fk/& d'vFa~&〰e|?ڋI'/ [Bz*Uh#Q]ʚ`I-bz_ґ6vZLh][@m]ClA5ŴΑ(|&S]xaΨPr~亍^##O]<„P(ql>'z\Fj䕚`c +6=Z[1\B/Ơơq ϧKOp5&y9IhoCi\tՂ6jQ!mA$j-E .QÑNhh_Qj&R)%kYAw47o+:Gw%JtSLuz3m [X7.^.W[1\[1T:dީx0UMV%W矫]'ʏcU%Ci+xDJ!|c(}\! Kޜ=sd:D`$\]N߽ `"aT ĵmbg 5pTǠ"?z/[kq-1? `ɒ)guhqo[2*ɧaG\6& Ӑjx0cY=3,R@X$E ZJϡtI5TP?H\Kw JlXNk\MU2}5dc:o,ۘ EzD,HX МdBŎu"?w!ף* ֞~Zs%\TAPGHw)G< E}<=7a(`"J-̣I$s]/)Sn7l!ET'Jp-0Ա?D<- $)wW5KZjNwy\6@%Tib(Fk^dU RH5;.O:=ӓub8Y54Kk~*3`;dꚸ%mcpl n:} J-i[(Hԃ<+.?ٖDP?_ V*υ,QEa ]|P5.ઝL%b -ҹ8 +;gjT!pz]f)aUs"풷X +"[z` `]Al69}ņ|rnu)et`q9d'ʠj9 gnN]W&QiGQ(] ˑ5:^Qq&b֔A)g(HOJrm\EG0c31H~جEӎup#9)ܬþ?N5%FP- _M_?2Hjwm|% Wx4BLm4#M߾t\-ij&YoWLbd~ߊ!]M[.0BZnC~\t\&Hgҥ9]J~L: &U@Bj[UY;VUC1Do"/u76 PWtE2ï^ܹE D6w W'BOz=xɹc#Iwd-^*`Л({Ll 4ƿ0/@.j^ F@pamݦKc r@2`|NQ5FqaumBjpBUb!P7,rٯt t ޮZ2vBI`f@ q!nNlY,KH`zoru'yBQw^L?>dVPbLl7+ +tIT-bpٯRJr(E|[*-u6fD@a~\4 c0~G ULBAmLZB'E֋.ť36Q0gIJbmtu~`I2JkB2uIvTne]Y8AUqEƚ5sL-R:+0}~{\{ +Y t& q>I5_叹6yM]w ] b׷QT@Sp=:&@I'0]OȆqɜr l˟}Y_Gz2H"J!نK@R8HnlVIVd2m}?'!d -0(RHF +=>$T!X&vOO! /֫ca ;9k zԎR +dpP*t#P+dw۟B +x)w5?%ҫ5>6URՊyUxh *9wMi4'pa8 6-$PY-ʄ*T7NDD<v)Zeʥt{ko9Qx|OdnȐ>xwq2^S:D gUnIvcvH'"]$@ +i' npp)&* λ=!y8Gy$Sr=)aFlBx'[?-7buqwUզtuCz\1uqK%>pX9 OIH uN3SU/X,D~=rjAs!x _\ 4*yǼp,0%e:'Τ=TpZ-6\@3\uT-a%A 2̀7l7m_ec"^qnnSH5#[$G+"ˊD\jx,Vg沯L7> + ]ʿ(bPTE֐;RB@y 2XUf0T IE+m7͛JIϊ@>Ԏ0B^aPEU#5<}62+\Ur?ۗ_8E0WB%j/e*<94D_\UVTĘ82q,/]B(.65@`( iI@۴~= uP:Z6)7LFSMb+fU2o]'׃OM+J a(z &M:ejnkW>b(y9p?EP\g57?;Z圕::2% 7)gR:Ķm6êLbtݍp8y s@lE%hF ʋkqj|Yhgu&eGh8A&'T+C##zfZ:kSzNGBIAUqtϽli;>BJd3τrrOJR@]!^Ffҭ3\zBK'+ןJ +iHjٴ,,y Xu3 b ƛ QǮCȃI/2ز{rԩHfI õ.t,JTyQ[@)t-`d /ڤ)= A(#XxBE3INb2ѪS]Z`?)ʤK `퇨+Or jAK Jh.)X&>p%a#ZY2"ͫ@nJ8׷1At 0GUʦQu9#w)mvķw򛡓 p| Tf~ Q!!<fH&s+f|82]$UE/ЊqVI-]D%V9W2"\~ep6\mp s58"ugRN@J)T ܕPaNlu(kNWQLQ +=xŒmq);, +`#LJ9gH#)\J`x[^͜FcǞmm&MgǶo W٥ t!2 K͐$XDBx{H9<_qOi-<{k~*DVB!ooKJ Is(F?"PZ6MƃC+6.H4WZs7y[7'P7èSP +¸s,dqƽHi)sxFC&G"թv1ˀz[S5bzm2^3%P<@m51à1=r (]R; wCMd܄C6r <.%4@j(ceUSZΛJ|j2k|Gw3׎=!u'bSv]E,GYpDhphu'$q%. @[ +"a&a!rW +8?W*ijQԴ'pC PGiNVmQ0:[. iZ&zꔀi*\]k;=mM¶kj]-L}IBD1ɹILq={DRԚz<0dF&D GȊƒ6. `5u5oUy\77:"b[Nq58mcu :ˀN[Da ׵UJy\z.Vhɫ5%oֿk{ۤ/QD 0o0H&6k»C̽r'6 f _OXOA[st>!RM0B+1$J v?fN$JiN,OS{lEYFinlIU1hB80>H;HtФ")뽟2A&rI3oQʼD{\#lTX #%o巡VN4@R+479Pݗ;] ydÙNשlj=x-C2_Y[ 蓉I5Zd ,P ZzRM#B#ǓV- = ʓ7!q KԻq2!`Z+Jw~.愋쪃\U'ponйBFv3ˈtE<8'G'3 (gamE]2MB;Ί/ܝL$#@r%Pu+_nيsw;7MT* mEэ[dFJ6𬐡4o_yd'eBˎAMlq!bmlXhqN2Xaخ[9$@^"]OŮR@ڂG)H$d?\C\ %N$.M&Y[y0;V: ïiU<X4Œ@ffZEsuZ@DގB~Ow]Z樆kAs .)%G anxŖ(6b]8L;t([ +?yc\J ta+|_D\ƥ#WHB15ZWq2O f#?]5.>ݧ0T\E31u~kFXTPן|}֝deG)ZLbl^ISqlJ\Ct5:`2hO<p>}Vy0D$:Ti I/윳a}>`Q9h%UcZ3a@VpP|zKdwO730Z!96+;ՌBp.tgH<w7B4bnM?6-gp -p ?( n]08VdS P2*_ +Z ~VV)Ϡ:nIW-ʎWGTzB[/r%wlʄvSt6dK@p]@Y_ЙLi`9VELJQ/CC:m~3=k'!!.t)Dۣj݈&[ z]JO}4 gZܼjGgQV*ڤې +/c5Bnz˛# Yߪ @F,y4 NN@S6/Ĕ^WqE./׫uf|Y4UO6vxjt)4beL\B؎uHf%"/40 iR>mU?@8| u),AUV9Ĥaf,_~Mằ!@Wq D6~w0HfpU1ܣkHת7ٰ*2cpKqvq$mhibj\FT:s;'a甛qtdXhz[ z98-]ӥ~GUk|XW .ǢG~ Ԭ&<PV96o]Hy_51v1^(tI<5P?JԠq/6lSWo*/X7 ujЪV[d(_Q^(iF@d3Zoos_ K[Qt>GPT1i 9hӈ_.Na&)F_pq%+$6 j5iӹV 3U[DeƯRDRB0[~9$G ME tx!d`9 C:Qr<"Ԧ?K޲r:ESbDA*)l\B8 52<iSkJK&fG\ST;Z3eN0^E0yAr؄o9QLC S3'| hqىtkaB)(Řq# x$2ڀ|XV2"Ź u^ ^)62$@ >-k~2 ^.#mPps}.d%i&CS=NBk /[H p +շ__D8[XpL3 嫷rEj%ޙ30|,ڤ>˴5PyNj_嫙95$%e~z"VynRabr''%!Zib pf)gX¢G 07rr8j %W_ogzӒ:bYhG(YOhhhLM)x\R9L)Pn"Ji֮jK,hxxg2q:W/ݓvLwV+8¿{~j< +endstream +endobj +15 0 obj +<>/XObject<>>> +endobj +37 0 obj +<>/Width 2576/BitsPerComponent 1/Length 31314>>stream +3"!6ARM2٨C2Sv +Dl̍b +N9Xɲ##c0VC1H"$E td2: +АtGGm2>M !jv " a4aM+څDoPiu}OmŤE">>aLNܛMd7߼Ba SHs='ڮ^6im^jgOPN^Hyis^׽i +ADs|›k]\*|1NSNAՔG':D +W 2@9̈4GDl"r;$=6snҷD6iD׸Mi' i!S ϘL'A!fx[ <%]:υ恿H[wN|Zy\^wKJ[I(+_ӯsw{[WK&>L~΋U/KEZVGZJI$:JtfO+ '_{>h~uOuZ=.Z%gK>f}:Pg2œ9 $jbұ~m[ y:]va+WWl-77Woi-Ug$#\:4t}hZ0뮭*Hzi*iWTҴim5aVJ[ٳBJKa[f~ %]m_b[Wl$BOA$ BVvIZmLPN;n^h*C 1Knڦ^Ko}uA[QVu/V*+ uWmV0A*Q ^^N~[II M؄}]SIA &xa.ӆꕫliuݦ.*FꞃT0iXIWˆ8C q=Vh0pm4;P am}L0M) =4JMu_]04BB a4^ +O…C:!`A9PVBi!Xax`[]A00a4" &P B"4""#DFDJ6(aг'(uU""""""*"(!URxqy~;Q=s#3XuFW]Aհ0t!i؛me3+.F#ڼ$d:42]DA;O^P`$]Bgٕ0Pͻ @qT,PPo} Zm(v]PDPIbCx}Z#}J;LZ7zڮ#i@Bz۫MEH wD.쓿NDiA;ڥ@|ԑ)R'v7w N+m_]ʜJ:w;5#rmt4Oӯ_dgg4aPifDAЄWl2qIߵNi9:%8uYY LFg~A S(!_ 4N g3C>3<(wAϙz#feNͳЂxGHL SA> ]}}%MPh[&g9s9#;(s4F&(0B AC +:6agϼ<„.vzz5NEpEPA~8):dc ٜ\gOa *-=PjH5~UnNgz---ܷhǷTQ/WwD7AރX0ZjijBjߢnEŶ\f=_k_?T\=Hi=o[ +H>._qN?]_½_[]4N8?O*6$>zN~ݒvj*y;}~vOKNo1...()5ŷkݓWoiW˽۲]kjXc~_ ~_[O8ˇ_OO%mOնN08a;5}Ǻouh/_'AonֻJL׷,\?Zztuo;CX K _ouU%__sbo)4 o~!t믇6m +m>[cߓo{'KG"ih/?lZ mK\" z=/"C1տ׿dNjGvHm{}}_Tv>gLTdO^g}z0E;O o{OݹFzo u]A[K '"akC!_?_+_Im_~mOzZ+Oj>EŻ iwqVTiwߩ`vk  :Q~= +vUZqulTCZnz{馸A8jݧ *4ئ.Ep_l0JWpmb4&NڧLvR 4MO}Z8k iaRɏv n_b8[[Ӎ׋TV=PA'aZM4vA™t,0 Pi&IT"""(!paqm&O{tINMSM54 uM5a3e'p,C2ph\J|DE 0K[U_}ݯAN.r)Pˬ !` 8`Xi(HaGG:|DDD\wqYǤ8L㦚wh[p`,`h0M0a06 `i4B5"""""""""zOIoq !DDDDDa8 Uk;I1jpUغAacZOjDFal&0a8!7;SFW4eSSA J8~\+tޛ?vNM!|iƵO}zs3!|'3B1%PNo3aXA8"`al@x}E5P5U0V>S_H?N1a%[UAyn=m;E"n滢wwDu-_;LHi켅y;{'4 ; v)ޛ zcV={O}&;B0a TvFi4~a*=ECӯA/x}Q~[[v0_ob7q}UXkjj[ڇ\\Ck(銴**)4S O}8&R5ۧݦJ]7]}L/v$?kUPa:XB"C"DM1`EE)oDqU8Kե x]#`T8p.0|#p\'28f_#"@1-FL/ R|jDpU#vGGx4Dp<3K8Y`Grx4A[ b8+<DHHsPAQȣ9R›@ʙ^@Q '= +~$9#烹C +`L0yNQ(1eqB˂""""&ADFc4VCqQ;0Ȋf 90!<9cR +* +¸w(!! PPDH+AxAsC4sXPq ¬ 9+eAC= r𢂇)ż!``JKI:PPc;,Yamy60DbN"l02N~nh 6J$F;X}{a m_ '޿lє &_5;Y#Ƈnܛ +Dk޾<& + NMc(J\1X χ ]=PkA0&]M8T]志Mޫ ~OAjd(s[WdGoEۦ֤ z$  1pC{c?,뿯,np_ Dݽ75{??{g˲w{^>6Moؐ..w_޿Ywޫ_Іv'WI7}ܻ*ztLYok?V?k6FK~?vO>S ׾SP {SG__\*_ɏ]\!GJ/oub᫬WQ^.kZۦ֝lRkMium+tN4_vVi O[\(MXm5_=;T4@C"!epL&Ma"': 2c#ЈDDI+_Qj^fheLr2Aiik)qa0Ry 30 Zk5PP=5UPbv@ ?U=?[N4A5Q4ӿi>ipwthoM7^+>7T]SE'}oy!_&CΨ%z?=34V]XP>*pds8™Z3ڏB &viiƪg}4ڷk!U/[ڧwvqamW{ބ?z, _S-5p ޟL?{ ^F$+^}'f}ުWkS?2 Uݯ[^.ā}mkVNӺZcc_OIH puɲІפQUjK~}z[^ZUW~BռGK[aK!4RC;Ta-3z HnK{NE +]n) DŽا6MU8 iUWPka*1M]ZpZmpZւ4kA0C ?UaSMDhD3(pDDDDDDDF24BQu1j|ϖrZFf#Ybk  +vJd2ZA[ +MBHβ LSMPa2!4Y6 a CaBzaS N¨L4g蝹pҖ\=SAVAmD3=i<Ô9OH7O' EXuü}E[VLvW?=PV ޜ@%}:S\͑rvœa0=6 Ji{C`}|.{ZKx:RXo\>'yptQC]]KB&I(_xo} /޿园PPpk_CKnz~KJ׿EG?}$u?}u*FwڜZꮽ#a~_/3TI/MM#5ow;-Ь6(% &V]$wA&ZinAE[AA cL{Jl*MutTժ5Pial- 0@5& DD`IXMADDDDqmTbMQ9ʵ-BgŐ^)ȐfDA34j#9(Pi4japbѝٙ +SAwT\; ˎ}5T\3T2A܉Ӱ7Z˽;MѱpkV|5|=t]W_kN=UWF_x>ov,A˙800g;(38/Ekk|Z~iZa E}/~ת}nivihl+zEł޹’wI>$bM~VjN[.>]uNɎ[ZOC=w\}qЯ饯ko_-%u |ߵ/Y!påAE/tX {>Ȇt [{Y3I}Kկ}gIt'ԣm/ﶭk4I[[N]QR,zqR-uU+m)6)i:0ߦZۦ߄&4ҭRuX8bMӻA4]ڦZ }zVj 0B'khD0B,& `0J"", `! @EDb"M\uJj5jȖwDFՓp8`KTS^e*9ijaAB/"AA A4MvhG`'zL(U +ڤ* 4j⋊T$ nS2~\Vs=RւT]vt*zM%Z]7kҕѯM^z]*uyQzRb3Fo_pk +hZw!i=cּ4O׿MB~<+]֋~D%;~njZ&o]xk +'y1[$oJROoMONm$;].W> l ]'~h .,;^/M {wm=:k{_Uƿ}zzwf_3^mvVׯ?tv}#?Z$ -mWk0_HvRVђGudcoU +IavI{P4ڑn5Ջ)SAGe+jtޚitXV0ӶmiM$B4cBVw4WMaaBh0iڴM4SM0L vTɎhDDDDDDDDmB *bX%#)1*2&M2őU̐D aveFZ AɰVW%ԳT… +A4M96* +v +A$U4*tU}vD4].%OsNn>oWWI[7aotkkNkMi6v.!|~>?ok8F ل@9pl3qs2sAd)ɜTg} + &"kh0BBkѣjݧ5TwpahbN{ 9׭}};R vkޝ;'t/;n˿E^N -$z]ƟN~}uvCO_jV_\C_BýmRM/a_miz^%Î[~ \4KyV}8K_IתN?fi(itZޛJյ~MGJ{7jvt\%뤏m? 3K[S=K_bة<^J + J[[T84V=4;]]aA/ƭ:T 6=4Z +ki4oM{KMBmBMP"M<&P0A""""#"""#ЬvV Ȟ:$lT)%ʼraNd)b +M +0L&bC; +3ꆩMKM0t kh0$ ]tMki)iükkA$^le _zI).5?7To҄״n*Qkꗝ4gHPj#8de@i(m4пAB &Ba< ͙fS; %D&̵>CA&J鰯kow{Z. .j_vI·]'a:N'cT6CO ocIi궄FItk!?xdQˋ0߯,?,?\5X$Ҧ~8={KN/wWA[#kooq?ywz :?THT=-c/}+i7ƶh;-wM[wjI6*+c׍]B&H6&jӧzXNm$ZXaWV+ccگZMiNA + 4viTk0!hDDDD03sdA0DDDEDDDD0DDb"+v,?VQ !R%QjZ5y"mn`R#L$ + D2Lg!.rl Q\\аBi&IM0>A + va믡j0UmB *0iQp)q_Mivɒaߨy0T^'D04t:M ?N@nVk۟)Z{c.w~o;)ag8 r{3z /߻ qkz 8͵ߣ4-F~} DǰM۶:.:5ahpmmw¿&ړpFRxw}H:.mnTޛqmmn ml6m mmxmwl6mc~{~km[A,?_?Yzt]J`zYMzJmi[ K=7ZG#av=]t?^8%aX]b;ƫ[H)%kGԋ-~/ح4[ 6+!ai tMim4tM~8붸P1+~ӯWW^7ki0M-0Fi +M4h=SUa4M2C&DDDDDDDpAQ +v,:UU &GEFNA*)iHS#YO&yNd(%ڠ!@3MQ]eGaDBj&h0U 4 d3"Aa?K +ToUAB K﷠N-5FJ誧sDzUmW蛴myoqIw]zF: ipO+tk[{ͭuKUV?_3F\͙9.d ,9434y B0gCYGWګAi[a`Aq`!a -TcﮓWiڧkw@'kp^Gn_[ v۴[wZt~_y}N'v޷r(m¯鿥TNL'CcS|8wҺMm}jJ!ݾн}/_w_/r͕9_~UzO7fR\_//j__I#ߵ礿=%uGկoa[$4mTK4<ҴNkַaKƱDŽm.ڝUڬRpj4Oi*"Ljk1XIpH:$ckVK\Viݺzh47M6AU4=pR wAqLtvZ5ii`0ԓ!`(h5ڠ0@0DXAe h0vMt˵8ɰ D[DDRlմj-EDZW2\ґxGHD#9J&@ؔKb3"4̰M Ma6̩$jUSTPaPw +ty$ M&;OT¦~ETnAiꨛ'2;NGnnPMjڥOKl:K4cW$kg) dv}k;aL qٷ! ,5ȂO#9{]Z +}8qa0]gtvwZ}᷵_~dQpRCdvIz.,.\^rA>Gb`i^&1Mӷ]K.ƿ{+߼~lr{U퇽a aG._?dzW_^ҍ{][ang*U/OH_;%?a/^*_]JI{JHQn~"m(juR[iaSi8Ӧ={TׄدzH6wj6| I4iӴL'Ҵ ,0M{NAL!#~XdeD DDWDDeЭ&6DD|%e3)vFgiX vvd)ܴj +YV$‚M`d2;%Q];[L$xAjSPAMQpI v5DݻEB8A"q]=?K^\z|Wȗ}6!֕[\:&0II[TPI7v.O^]3FC4ՆH5_p0=aH3N\3k~k𫦽tg鰷[4TpM[w[irP +v4 }?KNp'w.\;~R^át!a?=\CF9bQ62Aow/^vfKK?e-Y!󵦑P_v%,$z<GjOnk6}BYIPkXAԎWLmⰂH8+:i鵦LT.t& 6Xvj{M݄A- []n &a0jL' !(iDDDEDDDDDb"$:^Ũ妗o d2)AAKDA!J25EqRU +4L4T *h96Heg`3Y?U]4]n45M0M5M}$tknӭ'r&[I̷3sF.N=oQC=8i'8}z:Xu2yױQ_Yجxgg|PapY3N˳Ǒ :1޴0UA0PaӋ06Zm/K#=),vOƟm>4ۧaukp]޻v+E[NLT}eݓ+lvN#]+Kނ Ǻgc`M/cOC[UE7"a/oo?믮_~!6yook]SW߼C/y,?wK'~W/l{hTkKt{_WkQv=w{֯kkk{=(T;SjZҶrڣ^+݊ +J)v=xT>O/qQƜTSKm[;֡&֒פ' .4Wh4t֝]$U;UO[Na6( [Avk4j5h0LDAkt ԴD5A]l&@ЈDDDDFM`U"8"*"""#GbT+PDG婈LDY$Ofv3C "--`M03&d20L ecs&va APh$T MN4M=״M >\8UP8h܄NmU4}R~v^)skkmkU|^|п}?ꡭǷߪӥþnNv,ATge>\3<zڏU84oK>kkN[rȁ^/~ACwKK..7;]5UzK{OWHSդy#ԎϽ-+N+^gA#6r_ +i+tvҴ=6ׇTC]J+mUqXCcBU}[IbMӍؤ ڭ>5 4R~7j04kݪuڦ j5A B""""#iDDGiaExrzaBl妗IaFBGH1M dfS2%Y3"()h0P&4tS;GB~&~U0wjT.RH(NvdWN1]ˆ^75$ɎMt?=m!?e[Zp?̍2i46\\͙;O.S̡3>ePXu 4MXU0B qvq|PB T⽢j{Zk#oE[Å F5t\7j +گ] ߧIooZ N-;EzmNk?|/.ޟxwX+wmoKb__Oӯ׸>tlMRH["_o,4߃wIPo~ǯLƗoU___g߿Zs5'$ןmO-#뮵/RFzP THWKU +nvZ>J^__bavhb$Hu\TI5דk6VҊin% z[bZA>**M5M&V)m7i,$UMPi&bU[M '`a0NTB-ARcB" u4ᦞDDDDDDDdka ns!QDDG:_C;4uIZ<C#tD)ik\vHrn'OAL3$Rlc##HɝAP*jIBaBIps&.A"ݧtªha9j},$wA%A7k,,տ;-N0S}&In ']](PI~tl{kki ^Oߺtsgٶ@̆˲L/J4m%nK~? a4n4A4 f (0\.eNJȴ"V+~i"~ Z`ݠִYZ.muZ~h; ݵ')鑎Gqa"OWb 0p[׵C]Vi]oj˲Qtۿ_u=SMmo~'zvֵ,wAm#]~+tC_nXfĿ }Zlެ3_}:}% ~oo|G߷Cg}i^s=#+m}4/nmX?9JEhJ)bm{I4[jOƖilPV}!TSQLV18VMS i>S +N5&T0jMS~A  0 + CA e DDETDDDDe1a5j-eb!FdvU"ZZ* +L[,Ðy炅hPEgɲH)ڤvdg` wڄTS`P\:zMQqܩc.ݤ.wV]e^dtiW^ߢXp> yUn}CI7:>)ߠ{~A%̜˲=\H ],U_M4,'$9(h0A |׈4Xg_iwiOZu>.>{\݄m\{ 'vJ ޛaIIا\XRC\=/'uڑ^%[qP렝mֿ]Vh4w1R~!7vЇB~m?!~_uk}_+_I=xҿh2]JJ']Vur[dC3I|Klvw\ijjg i}De>aNd[?bb.)%]ۦipTi_* tإa.;_i}_5Up_N4l& 'I֭ B.""i hEDDDDDDhXB  (#!aQ gfeSVjv +S!w&ű6-Gjfv fPdVe<5;[L&vAɲH s\A A0}. +8T +AW ABH{E5DN + ނmV\S*{gz>_PAқuti^/:/ժ +kU +z3FNi8GX72B#:}oK!a0Aŧ#m, 29 >b!5_ÊS_8߭> NB!vJk__HF;Hoᶝ{k'N}; +M5ﵻK׻O:ڡ˺'~98R_~_}m>/'6M/+_[OUw֋Eoz_n|O_Pi߫Zok"q/z_??Hfi/I]kIVjC_^}7맷YFvHU??mS]0Z餭w_m$-]SM7)]ڑm05bد ]uM;WMICM=S+4&A_4i_ ڠ=ЇhCP#L0` a]^0" ЈFMa g """""#a#!QjQZEiP-I GX"\AF +vJd1MDdBRlXgkٜvԵ +4M4@iA h96&L4OCUeTuO +UwwOCJliQ1ڪhȺugB,X΋MW]Q1n|ޛ޿Mpcmz;RW1e^j_x8{ÿuex&l ǂ~#lYd;@f5i!}OPPpサ?oU{Z߽um{udQ46kwO.(6aASB}P_[ ym%tvAT*_t5P?ƿ_ն1^_~O7vC; \? E|_!ޮeo?__)[}Og5ַ֫m|MˍV*Gջ]_0 AS9*]D5r-]*lza$ A%J[kMU6N)8l,^ŵ*0lla;AJqNiUA +Mm4MAV¯ZanaP0PA\/IB",!XZxe ЈeA B"""T}.d.ojQDz)3ye!VD"_ L)e) i.RlΌb;2gaFvjT(AM4& a0/h$ùnTwM5 +Ow!0T7i6O5phTM蛿h]kJV:;&8}?u}$޵^li7@[ozKD?$daZd`_M +43 +|3l)Va$,_U=P=!}_F{/{ '{}t\6u-:'yo`jvDs^}zӯZrq4v4 =}u֮ 5+ڈ7K'^]lB.ɤu +O_^v0ԫtoI%I߳t(K^ԃRȶ=INGĕ/;R?_M!aS SCm[kiI&$;AP.T6;tبӆV1T$E Zu^MZPT*IwmLp 5]Bߦ &D`T"DDTe>={Qigj7tȂ5FvDL 6BM2&ƃ) m96VfŤ¤V5P *-4$Jv M5* ¨M4ɒwy. -W}4ѭuEDߏMFN#VY^t鑆vi8х&M.E9'AL fH'&H3XH T<'0S v[7UO\UfM5 +M[n,{׺.Mt廗W|^kF37sE5&RoUQUʇI__>@otbOdO V_nH&hZ% =m%s?XҾ?$U;n?K ~hqE?Yԗv/wIJ A޿0mk}{OP[vaIu~v/ һw$_пox_,?3!MZmߤ_/}-%_u/fEGWD{U=$ۯP ok{jAҴ/3FY$Sm0WI!Tml_!%خ8H~ߺxMӍM7p 5Nu]uӊcV{VZiM a;AiSaS-BjApO i4""""0ak 4""""""""!""#&ijP|VJI+"H"M3C`;4ȓ̴>M":2:+##;EZ j&j4&!+PJ­dL! a ꒪ݮ m a<*iPH$]"A.jjUA4-]Pˆv>:kFIn.gsIA]t A%WI~nED)(]m붴vl}p?$3 PhO1gkd( UI_ pjg,i?D&F}脗g[ޫa4 O;i/tk[\?I Kntu˲QKNԛ7[ ICvK*o w'>-^du4U^_Ik߷z>?/6:!C_}u |}]¿~5_D}+/_zK5_[Z^{:_k^jO ZXi#: Yڣva{_UW<򍵘ko un=;dbSV˙%]x|xkWş#3NHx].fy99- ZkVh!i_iA9Bl /[=cO\P}Niv$[ +lhQO~֊Komm2wuwuqU߇J5?ZT4=~MP7մKϏcu='-v}e~|:_IоK_X_ ok{UK_uo_XQރfDNꪫMYBs{Yտ^})Tv&iݿoK+Z_ڞ۬]4y$G;Tthplr,~[\ytMƅqzHhU0MzK tk\=MniM=0J( U%XN6)B8ST&[NiA5TSKJ6][I_L' 5 Z.4a0DtfOB al&a2pDDDDDDDFMA 6%B#b""""0DDb#KI -7ID?Q(d$vdJZZdo d5avJdTdI3)㰱ڒ *h0T SO}WMut¦nDa[rޗWA$~;43+(x$O`t{uF3zn:=҄|Iuӭtt+}:Wge?hC1:C_ !0As[ &g# e9wB, ka F$_;w?' WI'Aw-Ea\i~KڠD& m-<|^ɎY;zKa z?K:@]:oUoKm/`^.}}߿J_K/5ot7ե^,GӪ֑ƫZKUK?ߴ-ɗ?տ6Ңy$Iz{Q["Pi/qH0)Xڏt;>XuXХ tӿi tݤzkj4M0MkjIаMMU/ B":KBVZMD|e-EQTYP3*&vє9ihfN,L&N& PL rl +vgarj4P]ikO@$ݢMUT*.*wr&PZRM=&uJ[nP)YJuɏF^~= Poã_TpƯ졧#Ct6]uk}?AO,x98q \~!ٗ{~}gJao['V޺i[MjtM$vI5Qp.q@M˄'黦$A}/z^Kmh}&ҥp}ׯ moݿ0XKoKXX!MnW%>_^ZYf?a~V\A#O]*ćn{#*/60jqmA;R.}-[#QQZI\x= X qAX}=إm=mWj{N &5׆M$AT m4Lʒdؘ*weNDE +j c֭4oaW +"#"?-@>vH*,3C ;Jd<#!G&ŌɰaT& +Y0RL:h5 +gk rlh0nC3'S=Mxa5 +a4T]SZ'NLwAST]TӬѶӗnD_ϕfy,çGA7?ơih> ޛ; 81#B4F3#4rUIM |0! !## 4#DA~bꞘO'a66^WEnMi{JZV'wO5 +N2{zXll1poCn[muCUn.yxJ w޶׈oMA0t4wZnq֕,rO:ꃾ__I^5Wi/}*W{3_$}(~ҷ^ڶikiieCI7Y-#ѻ{ž{kijamɸI*ZkiP0c ǶP*[KV* n;C+pҊMSiO V4_փgeo\ׇJ?Q h8S͑ yv|q)f̜yvN3R<3نtFi _C&XL'-3c+`3`6+^cT0mp׿n +_ 5E 4z.wm{[tvNBa'x86Cd^}Rj]֛t{ K ݶ%<*Z4c÷/mXnփo%$f''w$_C__үI& 3_oI=$_>Sٺv`/_{=zrO&)nHů-~ $vjV3-ULK9-H0UWM6إwiZ㰽zQ ЬTTR *Ij4Mm%lTTiSUAOT$ޘ_:KSiAj !a0L&0P02Oa0ЈA2`\8 !J4GI'ǻOQ[5eKKFe4A SVjEFdSɱ35jC;K3VgeA,:32 +j0AD35L쭦P + + +S M4[} +vw~m*i$n͵Ms;YTm緍IMV|뇚I$.OȁV=*oKXkXn8_Jz?3f ds' 3Ѹ3C38mwMݥX{]=5VW޶Jly8nǷCI~pTw][wặ^_zwÅB%r~7lK׏kUD_uK^Ag/_Ԑh&'zM$?{`-0^X6˯m$h~M +k9VO0KC)5B:N4a- +i0 C 4tӠM6Vب4ݮ6+i$ V-}[UM4k`M4…\*' &ϱ$"<*B )aua0B DDDD2d<A4"""""""# +zM;_GQS,JM LaNDh# 2AvD*"MavY  +(!aei4 0wzia8i(ZkJtrݧp\0.z^){սnzn}mSJuyMsKF7_V6נOnpoX\]3R>g둉r!s(㥯tv/ׄg-l˘ gG#fr>h]BׯwoiXM>4[5 wգ;D6QL7ӂni->1$}t[۾o/`踼h6]S$katZ.,io]>Ӥ:2wUqbT"qޞ,=j0@ +endstream +endobj +38 0 obj +<>/Width 2576/BitsPerComponent 1/Length 32175>>stream +&!ڣ;,qڔvPDi6> ћʈG`Hm3hfÛfln9g#`3!3Y:38L9fv#Y8wnD_y|_vOZû~nH#/l4zIuz_kB?vH'|i_U%}cZoIkkj)/z^kI>^/iR>~>t}]q_CLﰿ6v 6V=?ɰ9B NZZ&7nNpjm1R;Z i * CUI +N 4+[;x$ !밒b5OPmvwitpij0&Mi a a5 +_M5{#pXMT H &a4MX  }!3!DA`DB"""""HQE!j y1-T0̊gH[ɲHɝ;-2K*Aq PL@fTpTpD{-a4 +PiaaL%AISEM4MꉎZh% .TӠZ.4.lRӴ:-> +m[E'{ַvVRFږ|^>I#t][Ӯ丩-  +}# (jA`ʈdk!H=n,&h8CqG0fFAE6$Bl9'4JI.VjTӴa{A]I'y(%jMOP&oEőEvh=0=uNu O;v4>-;I~׭] +tAXo_ZݧXcӨz_]u!m7Fso 0 6hw}$ aaA_Oӫmmmm6-mۓv'm~!ޭ?uJy_pO?Ү_&[PSL&4 +j?]Smw5hn.D&IҖ=$8ue~Fa~Zo͍ m-V<'_./m'Y#Ki7ߏ]er q 481gA-03oLO~BA<&͵9?i}-UWMjꠚ]_w귃<׷vu[t7uCi%M˷(Ru5q駏\?[m }o}.-'K}*a,ON߷i>o+n?fkniZ~_3MtK.^Rn;3t νߓIH*\!{0vG+0NP+*ޚq7_ڑn]]C׍ &I}bT&4ӴM0 LRA?L$a2n{TT5;Aa{Nߴ4 !eLa4a$C:eO3M`B""""!TDDDEDDDGZ +;-/ME-EMY$Y`bQRu 2>uGB%2a 6a;D2;3S +L)d>D„yDt3*h: IV(]BT*ikiIhzz.~0+ѶY8uF^hiçꂙރy嫦^uX@m}?A`"tf:"P6uۇpy)O +y nkl!<?'wM T A>?X֮o'+}/vtvyﰞ\$Lz][_Kv듷&v˻A7^^WCKKҿK>^^{KB/O_boYih/}]VUu_Eg3%n ޺G\0jo43WI_&r_5-GenokO]7Pmn!/lqVH:uON)XՍ~-VAb|WMXjj&4V 7kuAh4Nj]kMUMtC GA4DaNCB :0FIЌDDEq@! + կj"#3Eɰ2tW(FF3T 5Dev[AN2\S#$h҃vA5PBaIСNA +a5M<aT&awcMTSOr&oˏMrItM۝wz=]4äލͰ;rE4=z^ۥ/AM}k^oN!3g [#4xYg#fh!kþ*3o_аw~M>T b-݅_u% ]/K}Rnޭw4XVsxm_|7 +KoLwzl;a: l׾7}whaݎx]_tۯh"mHr:_|?_m/nb/Ks]wm_Cf"V]l>^>{ +HZg%JKYT vCJ.EYmc&9*v qkm =vX;tlT5Tؤ+RpM;^ 644vH&k𺭦M?OjW;XjNaB ; ++jB P`XL"}p0L!0! (""8VZ;i娶ؠ̢;8"^>]p;m :Aۯҵ KI%+ti$Z;6?o?b}KE]=z_[Ki/oզ]}'ץN'?I}\~Ai6_^tfZKԛ#5Ol5~0Oky/(JzGw$A ,oQez]0V'_l%bL4AWޗtm%kAI pV [xX%렝}'+تiPith5PMo`]DG`j[@B3l5AL&B‚ʕa ׈CCB""""""""2(+Έ%_ziեV |AdMY0S\vqb5d&D3f;2l5D]= kPv Z/geU3"05 M=5OU +U *azN~Z&; +N7jvJwi[ct,YIPAy}B:7Q J/ãQuAպmzX]|4Jo.vSCfIj5%VBq<.>3g\HBzAw_}*hZa0BA5}j ף?D%}~ܷjPm_+ + Rn߾&ߛ6]a:&}dAn&X{Z{듶ɺV']'}:5R~Lxvnޕ-V*;C];׻Tw~N]1I>~aKҖ Zm,ؗw}/KplKgW5]w._ ͠Ͻ֩PO6z}:*ݿK߿z S9%3,KGXKC?}kVID[j֛km+VI4[*)8-8_]|PAuqR|V5cڤMiL5qNM7hjkA + +M}?0aUmuOa0k0 +hDDqcaKp`ɸ-&D0 DDEqDDDDDDDeP]|=^NjEGM*:DߢDajԣ!򸩪j +@%eFGTD#". `)c2tEa kAB 4¦ djeITM?Jel.SwHMh>ނ[] ދxUꋇ3_l'AKK8TBkᴃ{jBu{pAѥ[ON]ۭVOsH.ϙO1}<]|~!0hZރ<AA3C(˙9Zwz3>BB,' !a"_:]unݯ?Oªo/'}&RO +Iۢ!hpEð%ڃx7,>?oPN.zzw?> oVkCN^/x}m$g4!~Ѕޗ~! }?a/7ӺIѭ}/K3_/KUIu*߮kO}e8KG{]awK&p*?ڠmxkKނ?=׶H<'* !QKumAk_lpm֬~a/AVIotM8M5kNjK]6)xIbN+ت ^/'馟nuᄝ%mU݄A &Va~݅_iP05; QhDEDRD4B!ADDDDDDF-*CKi,?WaBCFgFB3RlvI (S8 CAL `fdC ǵ4tU0L* ;L'ꞶA&Z%]*ӹ'i"Eբ(-ݴu}]kFZZI7+3-{KAi4Yض\͙C5!h8C3<_N܋WON&û}ݻyQ.!m{OZ,wZ&;TޯՇKK_  XO]aI>~ C{A0}aNU]74qlK6Nin?Twwwo!  5kݯ}kgh-/o65{Varnv$i]~mvyum5> *g$ig] +մ=׻߹r;Z]#,a%OtImv]qHq  lqzh'^'j6; +ꚄmSAi"h0ByPe MpvMh4¦DDDDDTeD0DDDDDDAB2yYZBˆ l\A2HgLҙu&y՝` .(RjP3[A a0@̎e8z g`A4'A(U +vᄅM4Zh$ U"}Țr&yvSgvIkޝnW:mmdܡPAI]]E8>`Z֩xIqZ#9*3l>Y/'AzFN4#8чߥ@/ڧmaD&~z½|+P.U蝽ڿA6mjw:ND]?Z-'WDE/Aoh ۤP^ޅ,_v7zu凈nNjޗ+oäkoE%ٚ-/ִ]__Ͽۤ&GfC__\35GrG֪{8֭LSe׺J}q_ zg#IP~&:NYIPRHVJ?LiOtXAVS 5OAk 'է4/aBiӎ"HCM +¦za5 #1 J0a4"*"""""""""2(1j?-Hԛ "s#ő#S)-)20D6BgiL5PDSaH )ehL2.XAA&dDF MB'AT*&]=vv%_H-xM"{|':M?x1 kVmZ5A:/jG]tq ht٫Xt?_Z +zC< A +p0'B̉TKTX=aS wa0Bg$Oz]tֵxoO>i__[Nޭp +M..7Mm;/cݯvv^èv+*yD^޿Kn^ބ:$|Ct?{}o߿ OK;[63_үi '~%D1ɰYv}-,g҄&8G$(׾֮9 IX) KդK҆RlTSӦLV ji/a'W&'5_鰃4.[ U:tiDNPa XZxDC !h0QDDk궚6Qirl4g2ƙڛ;nMQGDtv2AvF NS;TANu; +P4 Ah8e< +iL*{ꩄLzi +.$*.[ѱHեKuPABnnpBt~^TߵK]sdfdifh3 Y2ttV>=L&X!a!"x3͑" 5.fg__h\SV xNi-Z"T‡Ѯz-މTT&>ᓋd=nFZ-kwɻxzNm7&:Vwtq ڮigdG+Oc]7[{N:!^;o.NuT }~\:ߤohj^#8B\?\RC9 +zt}m{">Mkoo?A=7^f5?勵RlLWΧ}xok^]oX5~zu֛K^~&IjG(2zMm &tTm+J~믊m+)8بN;+M4%L}EV $ +kZ$:Nm5[lxKAXh#M1PA8aB}5M0 +a5 +" S~B#..$F *eDCDDDDCM G kD1i[NP +""?&Źd̻#QOdLf)6 b25 +0L&Kd&aO" P@;Z#@DdLS?TӐip„siT[?ꨐiU Yp U9NDӯڢ=~%[R C7נoWz *9e:3#2s %Ŀx 0OF  +' 6gh9 @g;UI6+i%Bl_۾[L!?﯊ )\Z޾hmoa;}N ?ڧRq}vN )!踺^޵KcP]>\|'/{LIq~ۯ+"!OOoJ}7i{isiaN^^({wz}6U_E_j۫_UnJMɰS_k_o?mmtNMcZZm Z_Ivִ᭥\p~ƿtLI;cOئ=4☪M;^)-.QV[M 4ZO髧״*(Mma &) Q0-aVk_0": 5ADDDq !`BUQj TTZɱnYO,U&@Y")|K7RDtv3gkfH"0!W(*UA0ATA`E6/VT[~AaSN.Mmyp=M-[Ʃ;zom%t0뮟uޟola²5}p:Rϰ @͙ǔ=\gD5@z0hZ ,&8xA 2kCۃѢZkzh\Fᾐz_]ӢO^Viׅ]y;hl{]pwjMhkO?]cbƾrH%C5;9.)7MS TM4kM>NbH=&*;PӧH6TM:Vi u_a02]ePMV0[ON!(F&aUU5DDDE!eBaа\%DDGGbZzNDZɱY FlZث2Pa!8S$kge8iuu쎴g" hZ%,h3dqa'aZ_׿k}a:ч}= 0ݵZNvktrmtk.ޗewړwa^E-uk/oҪt>oM76.c۶=k|ۯxO.CM?&޿(~oaWiHP4==}ׂ_komj*w5ֺ^_U|~fktt.~j{H߰+^MKr-ˠ_Iᅃm'l}cnf?{ߨCoL_'XՆUFGZ UzbV;B +׸M kOmn  &{iZ=5U!amBV 0L [D]U\DEDFDDDDDDDDDFZvP +תod4gkY&aH%Ge,FCdvΎ0egaH&5*b3M &AdT1BT5IS $fUISEMw.-Z _f܉oJc鴞t2Vm_OT[tix8[}AO8b}MZd"O1^!T}zb:v&q ~Sٔ4s#:=y8=dDń.d]ч!h85@wL,vWoVZM_Eũ7i:--zaIkUjWp{^'zmwzZ&.;TA7m>Sq׷Tӡ>G6oo{k֕t~}?tׯXxa:u;Km>#_`ӽ+ vfk_K ް3KIZn]4_H&)u`m#odwߏ;JEnyKK)1A.*>* צiզ}ڪNH'"@"2:ham-®` - "LL&DDEDDE!- vIkM5D|"56H2vKDLR%gJ uvB,C vP&A +IT2u +B4IjATEDݪiMr꠽Ror&U:EޓDC1=JlT뾽=%F i6YظBM:G{N) ǧO}Z8A43̎G vG2pў?Ba0vAga5}EoiuKF|K+ tۺM46}[]//,&ߥ>Z,.U׆חwz\d1KY1_BNO}[{д_v/~9}~vڵPtO]EhI}^KH?VPuJ__i/Z&_׿kDHS?#DH?¡[>/m-U4S$6$] ֶ)N)+[R-cTJ= lxKzzmRi +j+Opm\W b 6eU,5U6A_ +-b P0Ce'OQ /Я4Qhc娥%&4V2Ĉ(&vKDZOh +vPL͚ „(p" K$ B -jA V\eZw}{ +K~͡{UONhӑ4;ALIEI}WOE7Fn4Ck®ka!W _v,ȆB”H^?j>FAq a~.g ȃO0٦]_[]Mүд4XA8&^ڰk4kZڵ ipF '_V +:Ol/vz&WVyy{ZnM zu^ O?ۯ_#Z.5SC}^X}Vk?~NmyWQkZZVlHۯk?0K]O9W級7i*vA~jGUdnHAx{kfӮE'R Ut*7)+B%T m?tM6PJǰҰA 0DtCT(L/__V SM5""QfvAh8`ZAaFGV֭]X]DG!ayo'L)ڬv|3ؗ em$B@dH2]!U3^§(URe9h4ddj H +T0 Tz$˷OM6meEMB -U_E2O}=r$}޿=?\t"-=!}}ރJK302цI_\3DC4F=/[&XLPL,l<3dNӋA8!h:놽Bl_"c N]0!h=OwkO 7 ~}=pVi~-wӆ;'kmIde )v8A꾿ywDuNӷlKCe]VvJjw#KݯC^Z v^o45I~Ӈh]/a+ms.?3_ٚK&t35w_H=okGm[4q{c=#>MR>}yt6+U~IXՎE֕[R-g5'A馚u)8actEjM +ЫKv*?JAxA*KIUMjM*m]tmVK0DB madWD 24&ZO0 +0v0iDDDC-߷nx!  9D\K'qa,/,Xή,!6 KM}駦 lqmM $p\zzME_/W}~Oԓն)]RcwE^uG~v-[k]뮸Z_ /_~a.1ϿW޻K]= ֯:^z_f꟯I?K=+UkҺF_u|a$ȣ0~󞃵t#NՈkR,{ն@;[m$%ڡۭlRzI7&RMi7[iaTV.ڧAZWj ۱]1A V\TD0\ &l&Y'^TMr 5v C""B" 0B"""""ARHDDDDjeL.GؘY"R#;-Dfv *0MPA2 RFB&?T A0Bԑ¦T )> +4\4'&aPwItR*=.(h%O9A:ML}>^{mi7Z Qv_[JhuQkuDKT-v=H][Æj?~fyl$8*م +h~# [|Ba @h<ٓAB`_M_B,'ݯi=nBKEwAc4vwWOE +kޖN'tԜ4b'haId+L+߰ToN a^tq>XaSVzZj}zݎ9;wFCt #_ᶺ6UX_/Rw/ِ^دDK}NR__[}54}i/}תAo֩_ԛaa[zcoEt[K[O+'_GJH=)6;M4 SzTpQHC%MBS+4 POIziqҦ~MM7RAW@Ea-0Z5k46ӤڭU^!ki A8@0j ׫a{ ‚d4 o[Ba`BhDD\DDDDDG B0B"""""""# B##!a#ƴhA#娨ؘYigzz&QB%]S;Ug`XAeB`caBʅ*"vC0@Mve:%˦*AU0 (L&PA2AY]4ME{M 4 +WtkLQ>$\QvwA"⋊^GA[I_qMJm%m&?N:ѱI}JZf!9/SkӑU_TW xlB3Ef! &D#G.fjկj=׿,&A4ds6g&OWBBXA +}0o/MEj Oӯ{O4SNI)>.rln“OTa 7[_// p[&=Pl'm6_@lm(.7W'i]e2cpd v"v]%qӵjSO[i{t5t:$;aRJk uVxU}iJnj~oB^6m.yKw}/֮kawXF[[?oOIPKK>"Cս'M7V ci$3_ +3U~}+_MK +I]&'$}]&aoTh^$}_ {ZMt%օ 􂶨qP~]oNܐV!lp^uMK(G, +KՍ&+MZҶ 0զV,C]ummBL5i%iZVi4M4Mo]uNv8O)c( ?aALM; kkk0_]aOV ӴT" !`M4!j 28 C[MBBMDEDDDq P@RQ/"cXZIiM;P!"M`| >c3XtW#L0Rh*3-Q8U0e`UUK" ) @A)SA&*jT …M00T"3eh)qﻄ4Lv&,;4D ދ +ZAh/Ѣ{{IH_tPсkOB ̑b$Z?@u_<0Ań !8gƃ>EVuH7&w~v =}EM="h$T=wdQpRon*}\wKzitb)8'[oO>_愯: i_<=~6߯_ӫ\.__z&&'pnm|[3O^z_w +}kH[u. ~Kݽ֟__8)Ko|װҍ ػ +ZY6Ҕ$ 6I#=Ubc5N4ӭ;bb5 t0OKm+UT %@M+ +IꮿcتAqWMWA.)]4^ &5 4OQa G @ `"" L hXTŠ!Ƶj9g$QɰY#$ Gk1v`uX,eFDxF3t A(S ©PP&f@SMvSiS#Ij$UUMS'tyۧ]L \❮IïäJMuIpiTѧ?x3~I!toFw}˙'0 g0=da d 2xdJkz鏏D!чx!a08Z! #8 B *_[&)?ZX_L'i7wr-d&6Ugo_|aivEôHwҵu踠?]]AԜi*d6taHƻɻ>z%mS=t]w_]/v4hkvT?/%{D_뷝߯B\-vO4ZA +Ur _z'_!1_.[\W K\Wok_zz3W]{SݭuojKo9izm} M4[-ҽ'#qO6䭪i :&'a?A(t',?ONm-bN*+_JvՅkPak ^{mm4'4a*T5" L*h3MSWDDDDqXdRa4""""#CUDDef^AG^VӨDGQmI42̐gŜBnS` kRȦE;:|f! d@eHԈU#V* ÓBiPv Th%EO +&LJӇWha܊%MW]%Bˆt綉rUI[͏uA7CUzxZuUiW]G3Nim3a%(|C$D-~ +4XMZa (A;{_}u-]o{/^F+ޗZNh´loUVFïPגvzwey|}vI&PߥN:~m::^MZuk[WH?zm*!־tïZ_,^Oc_ֿVzM7׽%.{i/ʳkw=kOVi=]o$}/Gj"0i+k{Ӧ?[ `wjzPKGS.Cbl*Nl\q蛈5=n(/kbui?pa5ij*{_ڼB״M==6+Xj: ڻzu{]4{NXAXTB""!B h2ApM2CaS_LN[TDEDEDDDDD!e00TDDjd*;\kQj-6fY#L$Y5(P#;-|a0–E1C de(Ր̌ +eHpL*TAAPS Ah EǶuUB4֔-nEBސMiꪜzo>q_匼{,ˌѶ[y'No]t wMAur"ݨ>N4jҜfdr4#8˲s(FCA~?U>-?!a;o +qu{OIէh;i+ޗ;m Wv4tL{m$ޡ0pU} 㧧W'xMxL>/'J >ڴ0_=?}i 7^߈u_Ա_H;~K .}]/n[ZwֿKO?kM3_ˏڶvuo[_zmmI6}O&q il68mimvj#z<O>,68ՊTj*Gau4\kh]f*tإ[kH%mưIzKbM_kM=4**)> DZL&a= ij_AipCD. (M aMӰ":B"""""""" aRQPxU~MYё^&h;$fF ge¦ *3-Q:2 CaN5;-$aYXA!0XP` J(2C +A*A5M5O*~`jSN|AꝪzNZ߇DA"_hrZ^}}RۂP][nku[܃ZZ ŷIA<ק{C>(˲VPۯƗC>_B`0#8A3f .d h_nD-zSZk ^z_ծa۰mgi&Kߴ]:ww +N@n ]~V.Nӫv8w愽~_W^^tޟݾNo^}___'o z^^w}izz c%BׇzW_/K$_]15tfkMt/IyCik-]{ww[u ҇Ha[&oHRCzGV+6NjŭqPkMҋGi64׻IWiok|w;OmUVQ\RvC +OI{^NӦLVU&5IU~ CX[J pMS i_iݦ[[^Qg¢""""""* 2`0CPDD8hZDjDDDDDDDFBQXQ6Z 5gATQ`ڔ(L01bS",)d[L)7,HPMU3)"3-r0*.=SUUTAHE׻u_c]=:PAWftꋺ &WAuۖ[Y tw-ګu_;*Nh9w)"'FBU"]pא#a aZ`<3`geŧ_|&4apa]`w_z.a[ӵǻ?ߤ,z;KnN8>O.i>o=~H.nރhuoۧпit ,7,?[rF=wп[?5__Φ_uA:uyK\?_j o&ٟ?\ *6[MvOJ>z0;ImmBc^ iviWӵ5a=bզAzK 8Pi%KbbtЉ hjvk骺޽4"B""*2К6=BiC3 S>""""""""#-QEi-- +Nյ`8 "i +)ڬdk4a0 +ac,4vRjD $ +vV`i吼0@BiTk̫̄$ tCUM*ap +IJDr$yz_ڪaTӪ.ۿ:uѱU\?ZIGѯAgIjUN=7Ktު|YrLᜲ0Fhdg@Z]&D*_Tӻi4 ' ٛz ̾}}:8r`g?Tjҭ|i{hm{\wQ!6SKK˻{ԛ]'..ajKx$?J^>t{{t~KWiwпuI.,?md q t!iշ4w{_=I/fkik~ko^_]k0-{k5⬺W9518IQj]ӊfcvN)=߿h{=U|4tZol5A}v ֘ * TI5/+A&HX[M *eL-kjkְDD0DqC80B!L hDDB 4ӵqIDDDDDDDDeR3U-Gɰ&Z)636 v&L5P F)0aK"R%GfHDwK aL̉PA` ,Y%TF~ii5 )]Җ:Zw0ES; J#zߤO[%gǸyY3ZO5 :뻮-.Bjާ!g>3͑ǚ`ͽ=Oz8`Uk +Xb?/]17kPﺨAF}1~Hz_'Akﰞ\U{KoiIǭ-sMivӤ*wIu ,}A?wů?7Ia"2 +I!x6o{d)'v?~tmuwuA}$뿚kjҥ[btwWORR꧴SHnIU{aB k/%#ܻ?FM(bqNM7kX) +OKcM + .eIoD*tii:K+N"!Xd2 ;ᄭBӏL!ZWDDDDk{j4ˆ6ȴ#-(Tj#3XJLR;3ׄaBjat‚a2n"!Ftd"/!PR8 +h4ʠA1̎D*t4nSOM4aSM4Iw۩:SM4/{[hݢpխz_pAź ѲRvW#B3g.vUŧ*.x=:O+ 5?o a XA!! 8gYx_g#0q^PSN' +hݧ\;v\6jZUޯ'd읶ܔ^~RqE~u /[޵N ҴzuUӧb{_Хpƻ;}#@ٯ}w?_okm.?owj뿒!~%޷#A=uސFSzV _]~$\mۿ]~^V GUՍV5m+KW]__XaI3T7KI#ѽ#4bQWiFTUqiCI-uHӭ33 *⚄UIQTiwB^)8[]^ӵ]ڭZuUi ֽ%D!L +Z{(AA-:hi4TFHqDDDD1h5DD~Tki;VDDGɱe&L&WJDد*D4PE +;U3NYS +FaS1JfD#S$PMI^jp90Lgey fE*pUAxT¦ +e86m;N몦 :{\*TazN/l+6[3Pץy$pV= P?]w y>Fedr8fڟgN)?:U^`g +8NP +4֯WI֟^޾SF}pR$k ѲoauZz! Iۍ=/~-wz7'otN. ]XMPntۿV.P?P I1A֚QWEtI8B(^BӶ TǦMAqKliD0O 0iNب""XX.2T7vC" *aU0"*""""""""""""Rڪ!zQaGɰD_#4ZD0@s!LK;FfͣZa3N  +BM07KZH)X _P¦2r5B S;*2)Ù{ U^~aߦPMSMB m-e'a< 3cRA}qg,wRz<>gE"8mn\~E +a >38h8\a2wΩVүK&_T2:/omt>![kg=jPfj3{jwߡToEȳ]d)T٥NЃG!i>+Tk M4M{^MZBqA-mjiMꓺMWM>. }DD4""A-(ʚ 4M52d:E[ DFDDE!BS 2ejM4DDDDDDDeh3(ۗIuզEGɰ0W[Dث&YGb]S;Ugeg`vB`i GJ._ +&#"2)GC("BFA4kS„aNLadAAjȚwyt4L' u"{/_߄MSN8j~u #^{ph| î.. nsg3yv~r84E[|_qz&(N.AдǪm`fp$X=BtkwT[^֍_I(n/RKڗ :ZM'><N*:Kꝴ'C.M0tOc?Nt!ߺ=~MoA^XnIB?K+oקvwwGuk^PQ띔OPoU~v}m=k}nZVNXs[ukG5O,/9OcAWiXӋc&Uz $;nS&rVL]4׵OqZ V[HzkBЃ0&kjaU&[LWHCB80LpM50L(ML'"ag0R5GZXMD|O YMeL"f*emN ) d* l̐fEUU00I7J)љ(L&TGe8@ ̐1Oo +0;Pa4 sԽ;NDdI;EcA U4O:A֛uߺh]PH$]?' tMoWP^nIk^1I.zoum+EU]WӋ8f8 rY5Ǡa ־[m?}驷m'KkUV>VB0;wIqao\wVqꃿZ˻AF _ֻ>{}KC 1^]C _u|< ܝQڐl~KDgzҽ m7Y}W_{y̡UiQ4_Kj;_3]֖*mv_ Hr$=#߫KTCgv&Gt_hz_G$Ҽ&0ؠ~;-a.TҾմ7,XL/kj:N4wئ)>جЋB &Mªkkզi]5p!eM0A &0A P"4 MTTDDDDDDDDDDE,)j j1l )B3FgaHSBII3 aUl(&L)dND&Qd2("\UPUL+j4¦ 5aLO Tz}=TM5uxo@t//ifׯUWI-&nwvWjj\Hj{^rHNGѰ'I|5b*qV]vMҤC6ićv'A=4)Zӊnp 1I׈ӆ骶Wi4Ӧ Z &h0$8]5N׽4.YaDC"T"Ја3Q{BM}!dӯa | +N3Td:&$WXANtc,+ + +v #zaGaK-hT +;a5CRm"2'3FMdvXkr%jP *(MS25$Vy~hST𚦩ʝ$6?{-?0ʪ&vXi4t̢8<'[]v_Iokl< MC=ʃA3DNvuF2CCu_^~mwP3 pVk yv|<#lfڄ]/ݪZ߄*ww?uTWq@ kw-\6g[zH7|ްɽmuO5[֍wt۪~|'t'do'xw{]ڧ7uƿ? ށ:K`{,?[fƺoaBt_}xjnf+ ~O槯~}۟]. 7_pkװ ׭yBKZR;z߿\RSJStgQq})=kzpҶ*)}?MSw-eOU'L$i|jjiRoioiA8 -Ӵ M?l*M6M:NixJ'Uqa-:1S!”lTT! X:T-QB"4GbUa*}Z SU&B3#\$galv$p +vY)!P3RLvdC2;JfKPA a4CA'ge0A"̗ywI< S[ +A H:]mg.ˊSgEQwTT>]:Ic=}6rcbeB먏]vtb6 |)?/a3D }i[wuMџWXB`8 ٛz fex?wWuoBU… qݿ8跻-SbkcԼyd%lioA]T߾n ޗ;P_ (6ůuz~0{?K{I m?dտiw;ӿWWϧIڿtӤZo?u]Zڡ_WW]~_vӱII1wi-iVՄM$if=Z-0=[Xct;V;?I43p]4AipRnV;vM0lU6Km(9PTWkiva;Ib,."'XA i &A """" E!D}L'_j"?  +endstream +endobj +39 0 obj +<>/Width 2576/BitsPerComponent 1/Length 14>>stream + +endstream +endobj +16 0 obj +<>stream +x]ۮq}WnI ǎ? hcX{7"a#-ٵXbu +<0NSz7/ߦ??g_~߾yx^߳}ZL1yjC3k S?~է z׷Vdhb&%Ӈwz +Nj(<=}|)Of]Z?]e~ӹd1],ٔϿӇo_~z|zxo C@khˎ[$g͊$Ch & +wW[%kCõM!vS6Uy)>'&"л|mgRB?z~MBP֯{!ޟފJI \(b4g\˦%u䋹&I f7(L:yV,b~a0j,b&Ya:CG/IpBNQ^YYU vy<V[N>c;kBCG3#{8#RyN<9EtHJ^t0&j`q>Tx'y ʒ)v̒z~\:\Y~~[h%w :z߂TfՍE#a P5j#YauX66KB΢; ++NGwCa V 휎{ca'N5UB A|A .'SXv'Is]Dž*<>YL<wi a,#PS712][J`=ţ@UŠӆ-#'2BsoLN.@[5ޛI¢u +vζM9c?< s-X'.%Sk!(>X'd_#$yh,3 7%)!xͱÑ˃c.8:}'_,~]5d/BL%m >l秖>vmPpÀ'.7fL0{su9B3#,Gə(LIx4*:cAʹOr`ʮ 2\MƪU!|NoB} U!Ftg +es8qP8gΏ0KHCEC3Qbd$;G6@_ bIkPJ_KNЙq7@T:V _ϯJfd.'p|!8Q*F+L>ͦJTiRBg;!$P?*IL mUF9C8yRy$̜ċnp%^ojף ;EvΤ9pb(44`>m=Q`gg8m@)y]fBO0BM:SQlP*\k%j x꓊lf yD3R+e EOe",c@Bhu pF\$f6\`=WWC6D/]5A0T53&Oh 3d TDe_@\JBnE0fz^` 6Ц< +ikp3U +>Piqz]t]V|в DÐ@|&TP2tJ[%_F|\ nt/fX2KU5hK E?bBP7 E)O88jjS([tp*B>W;ŸL}2`7:Jkd?Yy=2Oc]{9!.X@)9uFӮ۞iPZ3ww8O֣b8C^' (sY9U ]wtutݜG% v Ow}4B)wF\ €P)Ĝk."2ZDM@.]:)Mw/2!Y/:ghvFҦ ̹]y3_jgf`i +s{ ׋)"+xƒLwF_aU(oh4pwGUdtE`K/Y\ yuPvB`9lp$ {[vBAy@&w9. +(l8]ELhOigFy s(8wY7yx#aП>?[r?/L[p. Rk6j>Xt(#s1#.N ">{hK 2x$D/Tq4PMQEKz#72KP0Tt:$D0%t1=B9 8wP"rGƎ!Xxm(aDA:t*Z#AvŜߧ=aRlK-qAs S˂8x#4ȯ#T <x0nVn,V.YP/aDZ AY0XQl2\͊ŵ| F +(ۖM|';K +Du3KGFhE5 d>pf"X3b \F/ +(;ob[+!M``xϐBYPq'$רޠq(`5<,U +пt29QIuuBPzQg5sWD*=#`p(f]˚vCU͒Ёr,{5 2OS V<9ks:~:)wɄv٠}QyrfaTY4Q(vJL8ܰ3,%BfVlU݁c9BLWzPg2RuuƌKr aqzg-8hdl"vO~ᝉr0KżaAv@{Ԫ./g9j* jrmI1^K]oD11a,1 +GPM\կ`uٯ@WROE)H}8,{oƌ#ɤ.&JnOs3ؕ 7B `0L.x1.Y|*JʬhXyi,#V}nib&@Z$AWY <|^d@Qh/ÝĮy1vMȣdaEWkVFJo/Ttx۷V FhUYNLWr[gr𱾧 zrz5 +yd0G!TM%N>ar 3[Ւn=<@J>< 3UWcѧ'2\aE`(a aFQ8YqQӈ$=RZ?u2c(;`Qb4t׺q*}d01L&S81Q'ZvaaH[GQ vAT%c k u~Ojbr.<$ V 8q1r^R/z꒸*F3PÐFb*x}8Qe6y2{Ë< #5/]q.mٺ)$pn{EQCV<߼-t0C&LbN%'qqH@wu<,xh%d Ԇi<~(5,UuT^%jLiNwϓg +tM+fc,:LV$X0I đ.(xxZF11lJZצed35q;9g QG%YFQgӎЃ{s{@;+(ڍDgx0 Ttк "idgGaߓ`]Fs2/ˎkl2:+o('cvP*6{f&NMуR`lbd0y@ҡ}oq_qrbRZ4Xz:MnMq@ߠ^>lKԊ|)C*GUFW֊+|7e +v8z,ֹ?خHJc$K.}}7s>`gFRͱ<׏[!6\ ~~ I~9tby@.u*Zw$uƷ#*[xn ,zmaÐ}Ғ"z*]ITXgaQaIp[`s\X{xx:KmKcKs*j}W8$Rq4%&)7OL0G%6pK%X`qzpI!.}QmOyG}+Pòᆱ#SWݾF o銸ܸPCW_qJxlPAPrBeZ0HV݌ U +4B:(;e0 G8jT.Nׄs3Nny t 5tl%KT6T L 4醡LcWs8gNDC] +Pl02|[e!zmMyl/U$28pgPr(@{ 7A}0p+pu F)at"^ű07lhV(c1 ?e "URQ.e&G"(7*e"64 fV B ɢC]רFi{U9Z-,`%؜*uf"qp<$tN8iR-5E_QlPl#QK/ԃ ;gpͱ=՗]nS="s3:+P% LqpŝȢ[^_ ;S $njo҉~.!W Kʻּ턅1vڿ vFvL3yaMM{Q4Ҩ;v5,릃anC]An5?drK5\nc4mk9j(o1yZ~dE+1?7?,u +endstream +endobj +17 0 obj +<>/XObject<>>> +endobj +40 0 obj +<>/Width 2566/BitsPerComponent 1/Length 30795>>stream +y"#;J3%2;$dQKH;#aB ;vGJ ʙS2PC#_ O eZB 0(M0AU +ޘYnNNAqD[]V )aO} jZa`뤝XT=>,]=:V: PNv&wҧ/RJi/+ z=~DdkHSh @ˌ|rO]>7-J(kV O`.X0J_"8֬%RuA$=\W¥>bi銫ip KDSwa0U[)jM5 łXj + +W::L* &aU4Ah4B5 +"xPR޻+-B""""""" BHG w mR^ƅRI(I +[;OCURZ_ +uɸC #j ڬV"""""#i=q,H[#H2!m. pBӴB4w4%ˈ}i$]oUjRra&wa4 > gr83B_?Cwzߪ&h}t]a>&;TMl]8Z_NO]??׾o߭U/Jݵӎ/ŴJ╤Nni_$ u7FVIh ʄ-V\cfFGE*#\L>]GD@(!94GFr:#;/`GG˲:.G #s#h0hGGh"G3H%lˣ h#9R>G">\ ,(#6>yKqL4#r`gl: +rr04r89H(sLsXN9XP([&Uϱ2+ +Y8YBbe Pr14Q9~A @9Cʙ8906o)te9\XT(2sS9198"""""""""""""""""#MQ(ڠFl J0l}3p­BփmtFizߠ@:|7I+nOݿl\!l_Y['C'Mf_ &!i z )؇:7Eb%jڪֶ9(tPIknq[N֍npaiZOr.U__M$Hwz{߈_¡Zt>Y/͔!z=P^DD8۵+Whw3Aw&W}_aڂ*0i}^kz]uMjiCIxqZ/iSkp{ڊ![4-i>6!WiML M6Ma()vi:a0ah0^!kL *aB""""#O}>5j"#\9E_-덣 ..E FhX5’80q3m03DtGR#BI6Y$`yܼ +;ZZ}kd@d`OO?g6|h!fЏqg3ž63ҙk/UWרL&0L!vS… KxR?=}USOMh._:\A.(m.R <'F굫ZVz;컽;'vwIzZ{K˟'^;Uh`1@o[K%_jI=*_^a-'?]/ _~ZK~|uMKΧl.%Iuͧ{iW_GGv߆FS%} vm/]}- [ 3#ѽ/MLj5NPi;[_m}t?KT)3mS?MbbtT/buWj0(j 0ASK֫ATDZN0PT""a¡[ +"""8b""""""!TDG媖E&Bs6jYY#2 +K`L)4d:F*>3H+)A]Pԛ gaH d<3.fAPi&? aS +lA uDa$4wwcksCFvuAEôӇAjo:N6DӢ⋆ZmMm[vk׫km{^+1fytc3g +tg#OM~"=E3mi4S",4͵3+VaWoS?^ޱatn^w| -pݾk+__aI=Iw};_{_KxM|.-Sگc]t]|1;bO j`Io&~i!V0_offno4?Jد% i(?m_o'|7Ӓ龽o'_-~ߥ^~M~i /׿_[0I%ZwȳV"V!D;^-I.>H&KVJ5kzz馃mK$V'm +S{M4>H5}K{M+H ANؤ6)XwM0n )CTy$ +2&qkeM4‚ITNXL!DDTDDDDDDDDDDDD0L0 ¦"TggՄաPS;U#Dn:RlH䈛3CL)؜ PY@ٙ N0;Sg`O~vh2v A̵DT& +_;âލp j~X]=::7W:H Qˆh'TstwNSO^puW_8{wUZZ33B38ϑG# 33:]__M,vu}!V}7P>M ߥ.#Z5%֩x=k%Gm?v_{u^ީwij/^ZۭkaaaM#_Q\%-JV* '᭄XbڴKB !J-;KM*I7cI8E&V+bM=(&PbccA_ ڪڪڽ\0M40NI]XaaBԱ̠!L&B [H(+R$cv4l+*Iml +S̳)qUf3&#*6U!gahԌ a4„ RlEA ՝ D=Y!C.B(؄ (MPi 5 vW&i7i駽XEIu],- Jz TlDDN:M4JTo^6h;N>#ՠ^H כ'H6ZnW[qz5OWt\pK.^cZ׼' h8Ԍ49#=#!5ƯZ3֝?T?U7H -Mj1 E~Zg&, NO~_zvݾ{޾{pK_t߯t68Mu/v5O޽ӯ_,ס~0z/EB֫Ja6{{2wK]c߯_}~?f]k}_Wկ_گ=JW淪G~% TδZ?Gש{W].㵵ϱl0o ?c-Z(5}iZM\T_KR,4bXM☯Юm-[ULlPObiڿN)ӷh i5iݪh5U[M.]I5 aV֚5 a""""""""!"P4Q4hzUˆIR;E/bXj2&kgJȻ&dHfU2#2.ιAVv4,TjSU0!az +k#\ d"BPM$[Lv +U4McPmPxY EPA| GTOrM:JO -u[pp:UaWI'ZqtI_]_ovFJŮLvO'EI}_ީkgA 8qL; ȡ0A +^ڭ??\'0TD&ԩ~4tڭEnW3F ^?>ekl)'v'dcnZ_MWI/vNyї;}6Myr .oua0488xAq 3HAcյH=5Zwv=?PI_Q]*wVl+ѡ- +now_' [uԜ] ORoI'ÅޚkAzCރxm*iKǯiv?Ov?O _v+B$=ѝ跥? |%B6}$hE-+ ~+i7/K wOu^>w_E_?JO}#J_v#5_[_HA>}KZb %zTOItw#jlWkuȷ߰eKm#+N֓tMZN!WTRkI6;[w~ӵIT*XaUi݊V5`0]SGTa+4˅PAB &aBjT qDDFDDDDDDDDDDD!qRm$FTZo EZJ+;5 !IsVa;0)&&L2:C: fCDu A 0N_& )^TlM0OTT\0F5 T[KmW.ɒw"i ޫS]=ށ-'oJad^O71k5{׋ 6k-h4/h8!uuJIy =z~-??Oت+KZɎqO^’{᰹+_ [˲wԻɽ?o§?N\t7?w'}~p6׷[_\8_svvިj.w{[^zVKkץ_K/_\vy7BIBN?_jqk^+tU=??jA0mjba i[vӠi8 E Z6+U[[^־_RjAAaMP(pB"B84L&P(BBBaa 4HDDDDDDF],S +BM"ȴ̧j%d*fBG3VvX*)ڒAMBG )dȂ; +G\)N3$.:w M7*a44B憪F6l4]?Mi:^wiȚuҴh6n8pn7,Kui'u]uwI^UK]k!5W(uixY) yH;#9vñ__CFկzKSEk{ ֋{I{V +IJ>h1'l)7s[z j?5;kkzjVY?kWioCz}_A=4߇i-ޛ_;?z_Wzՙ_K]l/kDIUC_JKMޒ^<߾eڱ_[S9uL^SQ]{⡤6)Ri:i4MM66Ak0LUU[AM{[„GXjaPka3Qa +#B#-]IBVk (E3+I0S(ŐDD#Fd)DHFfUAPSGar~s< B  e}V뿯l5:(_Dڜa})dsWi+kK +MmmSTRTدX:cTOOt:IPMM]յO0 &iئ@ 0 *JP馫ha +(t# M41ai""""""""""#eViIVk (PN)q;$DeS#XjY B2n SFvhFMdvdd" FAA; _L$  lL&:&<.ߧP&4M< Ai7M4k.ދyXJEDiu O~_UC/u>>>/^)/׽[k>aVSO#C4˙!#H☨bݠ4*ƜP%.i4&Mua +]5 4'd4ah D:(" +Zt4"!"" a;aDDDDE!Yg-]Gz+Eɱ",y.EreĶ&їFZHȜt;* +vi… +M@! ̎A.3aF n +aM?B L*iM0yT\:QnӥDݢcqT7^M?r&Rwt MtXFnN})S[F>ԩ=7ra ]}ZR]z}Gՙ:%H:փuUe#m͑MlFz gœ3D04#<]/U=4za %I/5]k([ڢu}UZ].޹ݢ=V(^:'ݓ+r֗VM,:\g#?M]6mt>:u)4/4j_zw7uup +Xt!WyX+ѯZmeW߿{׿Kj~י~_kɱ+tK׿ﯻZ *s]#O$ko۫ȳWPzttiv-:ªi,W $1N[V*◊V0 V*ؤi8iڽ ڮt-kjCL]mBiT !aa +®:!eb E}FZ1JaZP"?-C4F 6Ud6W3Er +3 p$UTNFȦGFIE 9, aaS;, &v AZai B`Bj-y DM: +9nzi7AiY|Wi)yޛN_ ^TҠ Ç6~[KF#hfQ"%NΚ?J!3P, `8AŠ~?qOm4ւ GȦU.h.ݢnvvK4=-{o/Aj^ A8M.NɏKU^޽돮:T{vֽ_^o>Ҿ^j/?]$:4/~Khk,rkͧB_:ޖ_]Xد^z3_aU~/խmlń޾C /V0mpt~䗩r9:t{ &*ӫ[J)4*?joBC[S[ǧ $W 8ب&ӠӤMizZliAӥj]n'ӴaӠXL*[ A08 +GL!a0Me9Cabvj Јqֲ :VBj~ZJh2e-ȷ:6T2;RfS +f3 A D# )TJOB $OUAPYE-4PJt[Ai8r&Ț}($IRm Kzt{+;Z1>޺A:u^[J׿H<>w^}uֶ ٢=ǔs4E2>!%3Yۥ]|_kCOB 08;LG%+D&>ڭקwi!Z{Oa޴hlѮ63 ]_V~y듶ɏK:-/mWVOB\oB4Au^^W[~]z;OiT߾!_#INC_Wǫuڿ}o[ޗ}]%~KׯdVGҭvN_|VM 6jil5~KSi:I/k *li]6'lUiA56(%A1[UARm&5_L0V.PM U&80@C,0Ai !a0DDDDD4"""#-QtT+'XWj)i)D=,Ga"[e!vhfEדeC!;TDd0@Ȃ\(PA$D e^e@梠`zi4AEL&wEÚ[] UDӤvZA'ώ{z04k7/t.޽+ְo8_c +D3&p<$\ǑR9 Gik M4^!a4/qpC=&?Tmn,wjh\վIFoEa_7oRCAaI='pmR^ޗZ[OkR/ea7&{^Ų+a{\=gk#;Ijq%>ҽR7i:ccc!?Gƿ]_,?r_M{BamCFP͐Cɲ_^ڤyVCg_fK^I7kk_zI$ZPW_tGI GIOie',U+ZJ;q}v]{UkVe\v]|VWmRCKLA$ 6qUm5MZcⓆLv[P|PA%넡(60jNӶ68MAI48h $ APMV&jPaBv^Ӱ05 jnAgGdD8,DDDDDDDDDFDDGKCH1tiFN"#! )i;TItD2;2#@&vd2RlgfaN²H5]U4¦ +$Ad2BjꋆET +AAQp܉r(>ׄ.F.k1tsAIS[UFtڿZt[ޓ={Ӎ1d!s!挝_[0Ҥץ8pͰA\,@!#a>-KBiVp)TD]> }(w +p5PIԻ&8]n;_i{UuwIv\> e}j[Nگz+_Sh>鶾?|чa-_T{?6oH7N/ׯ~ɲW}f_ }}*kK_3_~nR뿺=ߥ m{ eiBm^DޖO]gjVՆ +Iv+AݭKLK^¬UE}&qHRlTWIlRlS$! ؠjz}iJi*JaV5OҽZ LR ԘRcT P0D@ +OQaQLDDZDDDDDDDDDDb4R'OXAˆPR%hb&đoW)0MT&@ gffkd`̑ђd! hsX; ~D5U; v[U;+ AO + +{ThiӖ;% +0N-'ki;;NDdIt]N n~oתji#l.W]tO]iպzJa7u֗߫i .5vV~B#H0#9pVDA<^oۥgBa4ւZa F^Dڧ^O-!k}R_E0kgl-au\6utvVޮݺ]˶]Bu7k X]ihka'v :_zi*dA֗_uo,: 7L=}yqdAo bɲRz_fi޸U57v}a}~үo+N!Iñ>[{yuZw\mnG3֒i<wj~Mvup]ii҄MM]4M=N4MG&WpZlRaWu4*vm5Ta5`MUb,Va b!a0CatM;L(""#""""""""= H;qꪕUdvKU&ʆtH 2nR2 x)Q2 ̆e^d):avZ(S\aPgeA& M5M}$aQ1[OM*5$MMүދ.*Tt~ԗ^:A&M6&IUKZ_}]/8K}siJ_c #3T\:0 yhFyzҵjKAËM{B _4Za _Z!6?kM4馴>!fDCb/I{}[M /aK5"qopqK[7T\?C7_޴}__pW7 Xu'??}ɲK_u~_zKiU~Zֶ^뺺"ߎ*&I/uλ'96$i.#jqzh0}m+-ؤئӤ+Mv ❊V( )6))m* +7kڄj׵Z MM;- R !u `! &0B#(pB e(pZ v`DDDDzDDDDDDDDDbZA)j\uoDG$3Kv ؍D-Q2NU쵑ѕr; 3]UUT8$ ԑ hȱi;R +~4i *aH0AS + _w 4gh„yZOۉS_4DҤݤյ'[=}y{u;:]=Z֮`^D`Ce s=g238! yvNG߿[~P !п 8wa G~kj},zZ}Pco_[z.!o]6.!kl)!'h6ޗս/eOKuv7l]]K'rMZד?U׮]]:cc]~hѯu:ׯ r~o,?[0NI;iQ_IWUC!ɲ߻.-^ k]3_ZT%}i%Uޑr_K[k]itHG֑d^߽il'^e40Ik]v]46-;Oj]8a,6mA"Z$h p]߭%65bJ4ӭnRqQ [M'nS KM?b/VaoMô\+aVޓL0p [XUNhEDDE a`0B""amj"""")cT"#(-$R]bwMZQ/wHq-fIѭIvV-ښ4ԃªieb L"3#5";Z3&(N& +O0SL +.  phh1P$aFi9Ⱥ"ipMmo6‹+^]n7ä >:jAa/_|O KWh?KR! +]3<g3dqagk/4XL qj OTXѝh&؏o; +IUh'`F;6ݷZN’zWx:yyAoI|'}Dv]P˷ۏm?o?;gb`Z%W_iuoOm?sim?6 _k?޿__ɲz⻯?_/Vfc5勵K_kmKWMl/v=k[ .0'S+Ti#DT[ki?ee$^t~zLTo0S_u'&}VIV CJH ؤڪMta[M&($lPA{{ + 4Ӵ]Va{ alji=aЈ 'B""""""  4QiTDDizR@=U V +""?-B&ʱ7tvJg"Ye912p;;4dPjgeAN²[Pa` a**a% &Ӫ5(]0$-AxA&mMV *I/AZOtr;ʼI?=A#t6N.Ճj5׿ _(Nsm֖k_z_"!jTzJzuSu־џzG2InjVJa ]iMȒ'4m$4IaLU1[oi'=Zؤ]b_ Zi:N4VVA5 `-x[ + ӻ$i! 5B\-A"""#,HG/i]#DG5ȢeX; \BJ)eYFdO @4 +vT+4.g` +SZMARM;L&L*Pn +M>.TAxIӢxՅ+.M4^gy)GW5 +]}Uw/Ʊ_9.)O.c!Uz5A6ut}N4qi]wIPkrOU} I)sNW\;h0b6utz^޾?_/tl7{u_tW?1 !/ɲ~Im&?ֿI_IzT?IϬ5$_7h,޿uG5>^gZZjzK km PC9j]C]ޏ^'}.IbV4b)0EiTURi]UMv]ii4 taSpGL& b„ B"aPеm5DDDCB"""""sjje1㦞D~[5)6Td6W3Gal쑙 +@Y:dGGiFSddk##"3`&3NU A3\v3- „\'ASA& }O4f5àU p5F[:Zr/d +tI>r}:FNn]J<xBtS},=I2r3h^.fh#"333FrxQ$X״K4-&qXB !aB(Aqi|9{W5M/~' 6IE=.*ACxN͏440];$\8dA.ZִԸ_l:)I8a֛4uK\z~>Cm[ +v!ƚu~hTV_wփum4o6.Z^;?{h[z_ͥK~X{Ҧ& '_oz߭IJkXfuޜZ _NM5_ٚi-'Ү׺ky]#Wu[kG^_ۤ+xkwa.=#ຜ.A vT & [AMa&a`ALpa0#B#2DDDDDDDDDDDizR֡yWa:½!Tj?6k~_$JǾKݳ--KwwzOk;zWHK E HzFAT?fm>+&zU4Kg^m#KI ^Z=Z[amba+ IiH ; q7MqASb xIARjǡB -0$}J궪I״HJi{I +ްUM4. A(p]- 0a0BT-5P0S +"""Јʈ%UioIj?-%,ȱZ!M E;S(gjH>K(8 vd1Ck&˜MAiʃSNa$}Ut"pKA&xIzmUtkѳtLxz4y:JvږVf~J=ul U_~ҧZڸBVU-44.0f7 g.̞#_?oVT5i!La  ϊ}6M_ :1ދ}h.Ib#gl)!czwoӺ5]k6Cj_V/,.ikNtMm?] +[]hni~l?_ ?/׽w{\ ك_fІ4h|Co khO׺_Ooo_C[uꫯ_N#~޿g2Ak?խFj(^ҿZkS.FCS9uuZ6 _mwL>\ku[oCa|0LZ턗xmaz~X+ %ڤq֛itIm5Xk _L^[I׵M Aam\&݅apذB<@0GjY䖚"8)M;]YCji)fZ R4d C DxjPΈ)^S3#PM030N3 eE&pL'aB j&kM0ETM4[\*몧kz;PXDjr 'L^ѲI:S㭴 +{yoSKJ=c7!TV!4Nd/ vHK>K֗Ijya0 lFA@<3H=kd4"wаNhXAޫCao{E۴Z&;Pš7uWi~;pJ4zW2C;%!K_ӯNN| X_\ K?^jNӾ\z//6pu_MZKo/Z_ɇ_l4!~_~"wK6+'޴ׯ{4]5oZOzw^_M/OuH=d7vKOCKiQ%_YGQNd7TKa?9jkȮAZY; RifTZUl*;{+n?^^MMSbbUUjaZTu_]U/H:m'[ ݠɎvMSGd+ M4T5L""""""#RJDG_ +֪I?e\!fd+f6Sd l)٣#2Ʌ0; l(v*a(g`Ah0T a94(TB +J4PJק ڦ@h.nJw"z83y+-'JsC:HWuIa*%+^&TT_%_K8B[1$򝙢1)Dkzz@xA#HAhYs6gC8f 30z_yk)};7g#>iK*W"<~E6Nv kwh?[>UWm&9C;]5ݤpuN)`u^k^ҶNN'x']?{m_aۦ׎]Z_wgA~CJ׹k5Xn/ܦCW!O%߯D_h_?ǻ_q_ +_fkӡ^fkWKU4G/}nck>ZX~a%#HH]kaRMOzm#Z]Ho0_noRobM҈r+ܻ]Cmrva`+L&Zi5Oث ҦƖAMN^_] +\UauMt[a0 2C MS ",8AApѪDDDDE!  +">#-iȘ%ՠG5ɚeT[՝k1l,D#42C2dc;4d3*ٕHP@)V +jL*M?L$  ` ;[, 40&_ T +xTMN \5WSI).l V> :l:I:51t++>9g[U'֗:Mq*}Ui/z_R\C1yglh":.>a $]^BA  4M4.L(' mwJ?&ֺO]4v^_&̩hKsCkH7Ӣ4^hw_OKT],;.-.4S'n˻'t=~_7uj;}kNWr~N:N~W߮=_N~!{Bޡm_еm?_سohC{3~/kMץ,ZK\wjT)0#s]4n0(J''F{]^ކP}iUV7) m!]oT>);L&5b:i[[q[Ub6IW&iM4i$4&05AF `iB+4!`5D0X0B8Aj e4EWd,_U]j?-QR6Te:;-M[;U#BYOѝdkgaHE)vg rl'aB BijvV Ta4h SAWDaSM S  =RM'*PA6tPM跢[7 R֚jUNuy]eN)OX?Kx}\'^;꟥Wzj.цq5Ex=˙;'3'˙;_WK¨! &h8Lz3׭k?UMwG AoZد]pE鷧p$| + ]'N/)_.Aح&]ittz;\uZ7-qw{_k{_//:Ll5[?uׅZKl[s5/KgGڮZ ҿnviVڞW>ui)LmBOVdMOI~II UhV4Oj xoAjӎ!E~4« %K+ouöbM!8An)6+Jtkk 4kd{OM4l& '5B !]AaBg!qDDbT}$pqƱPn&l7'aI-BX)6TvXtvY *hjMaCԒf  +fE^dp&ˆ „" B ݅ L(I5P~ Wuf{5hieP/*&;_Im7rdhthtrnPM3TK^ um'T!uC +<q/ZWQ%"_Z.G.gC 8򜍳8haM+JMb8B0B T߮D/MkOݮxqM&/ֺD!?!5Iލp>kW[L u5iVa~vI ^ݿ?\{tvӯo~WT,?֦7Cwڸ5A__[5KK}R^6:J^ _zF{^ G(S)G~ث.'e)U&KI'nm#%[MioTMTmXⰔilq^EUI4uUZӷN+M4ݪi& 5AI_T ±M/_2CeAa5al(MuMpaT a`hDDCE!ˆŰj$:֚Qg3W-AbL0ܩC!C32 DE&fSe"* +7*g`UAPa@OL*aT&t5AL* 4a4JW :}48T +kz f-Qp TȚwuhuÄWҖCjo"ǸI']/zJ:Pժ>(F{߯Uiwͤ*_[K_qh3fzAvfp&x=`͚aLw7-zZ0]Ba ZjKTBLV_!5!*ZDگ}}-[]_֟O݅Ӳqjui ?/_Mɽ+e׿5D.vz$;K{t;ӶXnnu_߮J?iz MwotKoA}߯__ӿk~o]Zu߫^vf']wI#7޴m]5=]w)~׺a+Om[؇[oazյZKm\SEUzwƛ&ƼSU6)c7mS ڧ}ڦia&8MUVS&ොA" aS(pBTa avU.B""8Zdi)j?Cխi4׵j b(fѯD)ؔ +A&Q +h̍FN)‘gLfK)Sayگq +3FUTa&xNP34^c]>: n´gN oI:H6t.kjMKuJyY> 8yצѯմ^eTCV.뾷O\'ݭR4]7uq]*;ZD1g#8g3f'/߆-8a4h<0 ;PGwk;%KMQn}S]Z-ք?pmѮ,"x\E6_׿y8nMۤwn&דIKoW#^˝o4~uߥ_ǿ}zu_o`O3]760/?KoWoҿ __{4M׺{[}ki-*Ω;P_HgJ{ֿ}vխץ0zDGty-6T4/j꟫k po턡{6+ۮ %qHV] +jJ鶫V0һbN)6*)qXL&LWi)^ZijN¦4jڭXM0@a& B!`M":aC1g-UA zOaE#E3|V!q9GXG\'D|̱2;!3-*D6W2݄¨P03TSA.C52\rl'geN°3O_wCh4aSUMij Ѣ#]Qpj45ODsgT;34T[8JAJA+a"kyE?{ ,!|sV$}voLk[K_T|˳^8g̜ϲg񟋙r6f}4;~ A3; +B vj?r&?=ߧ3iQoA}zラM:AF67zÿ NpooAmzܻ{O/ee_umpiaCgjWR;vKNoإw?oK?nzw1oC\w4kִRocoֿ1X{3]?_z͠~` WѬҺo]zwa$њSQGIko^ݺn& le.ׄN3Hj{K:^j l%\nM4VvkƱ^+b:* h8qLtqQH68'4LRh'/PLti&T[PM4! tN A[MAa0q`," l axij+IzЯ!֓NoQ+6|7g +[XCFtqΑ$Lv/5QB USMTh*T  a TaWA3T0 M8M4$X+LAftIEU.>sEUH>vfO}|G6󐞛ѴSC:A;N[jM~;JDz"I om޿Exᅢ 6*PۿiIw` 'mt&v޸A7I=kܜ?vv kЭ0GoW!wlJޯI^{tb~4O[_}{W߿_o_]Z_ *VyS +Z}g2G]Æ_imՈqaYU}ih5mv -N^ض7N)l%Xi1Q\S'qWlR4 ؤ0ت=StӠ5{[تj֭4h4j&S(i h0 4Ӌ M4vXGdDDFYYi""""""""""""1e(?!_h&C v">SԵFDUb;USAVE90F9e@ȃ2M3@jHgaDv=;TMN eM JSaBќnuaU 4 + +P$X_aתzꋿu.o&wHEы|6E+uhwwy68}_SK7n<;'k]_H{Ǧ]*oU~cGC4F3FN<=2 Ry]_}o֗acg AyA +L! 9Z p֌~w}{Ba5zoHWe&z5kѮ"⋈l*Zi?\?iq{ 6ONwvN/_OMk_z~uov\Mqiu֗Gd'o/?ƺo~}kӥl/a{?_]wO ]n#I}=_n_IIw_Zoz."i.:r]{3Y J}u<ߞI_KoaT% ]NG?[l-kt]^T?Ka&*>N8⣤4m+z+IbSOOAڄVjB~ޚa[iwzL&LpK ª}~n "vD`ё᪩"3"""""""""#Z]ZuP­UI)֋A-EI &ʙ bq#" )' e[w3@jHg`vI_T5\*ata=U0l%v$_E .v_TP$;ZTIU]:TǝPHSButw=}R%nUQtwJ?߇t8ֿ Ry~)*h5K/AN'ƹLs2>`<3f S;џ~ݣ?_>BiҪ --{m֔6#ִBz-ktk{ 绾vno8:X[/4klZ䇃xoKl6wJKov|c?ƖNWO}{\?{4!C,?NbP/_aIֿK3_EfiXKu_^_ͦzl/jA&LFSO#5_߰oZ~s5I>H)$)W}ث#KJ?_coA)+mV) +}JӷTbjM4tT'US4m:iiP]il4J…l&k BJTMWa5MSRCe:inB"A M0":ag!DDE~ZKЭ.i6DG +endstream +endobj +41 0 obj +<>/Width 2566/BitsPerComponent 1/Length 32059>>stream +US;%EK(fVZegM-(P&Q +hN": fl!^ WM{е¨L&5UAl%aBI{Ai@ 5pU* +[iٝ:~MN "DtҞjVCGږty*![ Z}. DŽ.SA%|b$f2ta"莭f'X|5mmki- 3q@>0!#m`h˥KJ;+I~du_L&> +ئ+%nYmz4opqFwm.~N/L쓷IJ7^}:NirC?P!߭7߮ApoUGש3^*mWK߭{3֮t,KMҺ=Wvl%ii9jpat+kkivMQXiE&M6-b)6*!'}5CT H5bڄZv^RTMMuM6+Ml&[;A +p1d&4DN<4`DEDDFbDDDDDDDDDDb""5_!KTO*ua^ˆJQH(RψM$‘ +Y7( sB;dPD c5SeL ;S^A}.zaMB 5Aӓa,*(*i?K6 4OF_TõKwjNi6i$uN3RӋΒ3:6 ^r|sM6oKޫ ' Ǯʜ:_ u_5k$s6ytFyQC{_.g $@'z3 v >0hF{ /kI|#=u.׋Atij\UqKWuD}EFIռBrO,0ԻnoT:˶ ֡H6K_M~enåuP‡:vK]KǏ^znޕtV7I[{uÜ_І4hjwۭxa5ַ|~ 7KӤZ֓B$]~JI}_]%/ȂI}$+/{Y6A>kuG]/]*nV??G $iA,s 2KVC#?[ﰶ %CCK@CT*iC IiqIƞƔPMbiIB\P^a> Zo tӫtV]kST.jO P Q1v&NAhD&U`&`"#b")B#3dDDGeLaK-8z +#*EIDȶF=S%eS dv2\ De&ʙgevgjک.SL 4XA +MaS +eBLv&SEUE +QnSh6}: zM=&|ѮaOa[}ީ]M~=>AvV#ALխ~vSՄ h@YN43£N^+bO Vuq[_]wעw}x[+u;nۮ'v 5> K~خ }uPKWn__־:F0F҄5 ߷^I?ZO?KRٚCW^]Wּ*?I#E}KOWr1}-r}$h/]ucA+ %z/kpVӎ=i>*)~ TqQIA6*5A/j 55m<A&0:ival. PB""""*""""""#IWVj AQhԈȚ:fer3!#HԐ@Ѓ) s2@sYɲkge;Tgj@_(T0rl%*¦=۵UPM + Y..v;4P= /IlW֗Pvry+3*pjkb^կ/W{;SeB0LSLe:7 <$k;CA!f  a , Z 3Nџ }--/a{va5KK]Wb( *6u@pMqܝ''n^jnK_*^ u˷z}{Z]t6?î/Ka4!Ph_.On/+WKߵMQs% Fi+YZP몫_\Z3NzR?ma~½W/OC0inO(CL檙{ {^鰗L+J?a.+:I8ITt{N ְtpبpPժZڅ}5ZiڸOP0v (A"40B2ӡ'B""""""""!І1gk4Si=YC#M"2*&QQD FCfEnY#+2k BdܧL vh0;aK2aDuÄ O AL4aBM0X(]Bᅷ}^~kj^kkM&"Ț}2Ǣ݇Gƍ +j{;toI\uUw]@xpXuwUwzys=Igיe=͙v\/ <&h8 z_z3?MR~!^݄h`kXo\&KO}w^{e\=Wi~v5^/:%ᴵitZXm.zG凈:zekU4>7u_ uXWW_C3_ٚ%T_i^ɿjդW3HGP7Sѿ9[[OUWٳXOm,COm/viEE[ EEzn 'BKMӪu SM>aӴ鵧74vtT&M SZM4״ᮚaS[2MAX馚&DAfBV0DDDDEDDq)jGjQPo&Y,ɔKbnJpDh,A)ّI'"a …LL da<&gjPLMקW +V¦ +L,0.]6U&o܊'"i܃^Vgב=uu(pu}R^zҿkWKuz~93Ցg 3qafbFKVa4-aR/C`*>+ogZ}(WjOJy!zѮRCm:Sg}ViB߾RhZ]o wֵ?zS5_^}ڣRmrn!O+qu_~]NGI˜6JZwU_zm-00IK*.Iuxi}-PtqBV*)8lS^_IӠjXMl$U*Xji 0TMnaP"-aa0B *& Tʨ,DC9"""""""""1عKT2ZUTG)h3LSKbnHA!Ȃ!GfDCLȃ$7s; + ;$Gd.4Ԟ; +T`jY6ΰM30PP酰J +-Y-ww Jlzh*[A} DMdQsO=WG1~.7 ָ]%w߫zACt?|w_]p3?\~:֒Şg$ ٞar9.wK;K}z}ӿouzZ?}x};֋vt ҵ=R N! ~:X_OOu1G'ZD·w_~kƞ֯#?oxtXg{}/Mi~ҫ7M?}k[[ߧ꽏Z4]~}_Gj[TA8^)(0ҿo׭a,ԔjrKtuiT6s\q;#*ۨT)mUKm*V[SuWSh'JR ! Sa(ӊ6)'UjӴi߫k5; -a2&.abA '`28.0AB""#DFZb֫Ua ~Z(őɸF!㡐q٤DdfdZ˘MH + +MAAhav (A'&FH#R;Sgj kAizrl%h4 +.64p0EQ1ÅѭFʢwr&I&cOcI6 T]o&u AVէ=ҿu~ޞz}׆8un볲՛>,2wgg2V??qPAAa O{*z^[k_o龚}mpK^Ѷz|_w ' +ѡؠ-_WjN;ܜv']ߧ[&;U %}MoOh_cK Z; U]Oݯ N+ $m.`z.,-F;z!ȃH +Mu<'k~'OwV޺ ^[l +}_]/ޚxu|t+I߾W_tKIfpNP}Kd/m/Mo/aM6㾫Fwh!C_Oi.ߖW,%߯3_M_5z]wK^׵tf]#5Kka#.Ou6Ԟu:;(㿊[IkKU0L-mbU:akn`]:ӭSI+}ƛ $MV}CM47L44w 04i<4UT ثNa{_O^X0LŜ `E T] DD0 iF]E HEA #T"."""5B)]N#+,45oV )jG4Eز +#PS2!(gah dMdd,(̮ *iPtM4Th96R2Av Tkz݄¦&PL a4X*oקT{5QpO5[F]6fF/m)}4nzoȚ%t{t{ 맭:PvӋgeBvNg2hscxk(LلӴ ,&Z]T?'L~}K7תaAO\Rn.^Ὺߝ[?ZK}C-iX~tڠ.߿&׏:&]?}RN^3H%Z%i$h2?, ^DZ]|F}v+ +PmU ] ߻ x.h|f K^v ]&_:O YfmO_I?ݯZa?_/ޟ <7ìe_P{i}I7 IݵK}SzAx}~4_T{kN߳Gϯh=^jG]_a/K&iO[ ;_׺GҷZvG_vGTI4+m.m%O]=Ҷ[J6.7]kM:N+jM-4N롰VƜSSNS&M{OZc m]0Tm4Ɏ ' ɱjt-4" {q`Gaڔj!HRUNRФ+UiP1!2*JYAxΆkG` &g` a`ɲe \(L&U &41iɰAa0A*j 4xAMBaf"NM:<]Ci$M\X[Y?MKutAAVn|!Iím8t{OӤ;;-%_kkzg A#"!(JdfKIhV㭥V!i^:IHcخ\v5-zUtN&9Chړ}_\4_7J'oIK?j]}5OC%kuik𝨈A3Y $FIEc(̓ʾYQ6aN%70AY";„ӹ6Ṙ";U%T@0Jɰ0Aɂ6PKZ.@ `P¢ݻvצUoSc;$DxFrZA]֭ }%!}=:ZZ|in/]}wz}^קȮbrGT]":$qzaJh3dMl 0@qh_ g;#;_I6gKK״ЋOӸvۭ6Z=XnEk:WO_P~]A8diR“WKܐ $޽=(}74گlwj %}z_Ai'ޟAKo]}-o߮`6K7_ү+k/?u_=u[3Kfk3_{KmH] vIetz_K_ׯ/~<jz+ iK߶?_wt{իILpa/m- +]+IQnLZv鴜WAbpt=azi0QmU>U;{ jC ڄUMXAaMTᦡJ """""""">A@(ɰUʁNthb?-qUTM!Cdvd6D)ܴ"n F + +pf °iɄT)DeڮvGax^ 9[M ɰ܁3T{M 녺mzQv5wiR ڤwZ6³]s=6>AÑtO%pAH_$?VՍ/.A+X3Q# TF# <]gQjW $׏VB!:q < @v-; 0IX_z}囹ՅNz~MҦ\_[_߽mڭ"zѡVvWvd[6K$'w;oMO˺o ZXo\?}_'\h_|8to{zKW5跾mX~'ߙ_N{߳:]J|8K0Z;F;zO{ꖒOo_J4[gn-#4ޖJ}}%_~/ϥS)&y% ^߯j\Yn%%nI4K' %mk.޷i4iXIv)ci1\PM(+i+jj'+M +L1QZmRjtᅄjSTb4Mm'U[Zl*h`]aa4˨TC +Ktk|)ppԘ(4,&`aDDFF`|DF"".>@}i4ӭ'm/Q|uɲʖD%hgcqѓtF<P.3ŭ̗@3Lb +(]SU¦t,v +Gj0hjUU Iܚa0[IiQv~(T.aQ.{s7Q&ѶOA&*D^UATѣXzy\_Tx}Z UI'[ֺ}/ G@ag$) ;>3\a jџ>E6žvC0xP]z\?6Uu^7߮*+0} pyP7{|"ZiIN߆[7Ua|ok Bּq~һ|So]޿=@=4D\ͥwn# _7T[XFWkY7W*xҦoJ?״k[ZפO_]fIkGVOku}TFk jKw{{ $B]$tSZ{WҷIN%hU߯KHv *M]M/M?A}m&IuX^&4Ok SI ta2C]aa )FA (!Oh5 A """MARB"""5DDD/-iפŅ,S5#!##\Ԉ背d~=DHd!@Lg` !'Ph0e4jv34UBId$TN0Lgjz  v𩠑1T\9nnN +v ӻӤ Bnݣ[T./tjY8z ^^PM=ۇI'ImUpiXxW=^^Zu{O~z{?1x=a!(Jrg&m*_ݷ~0Tаh;>BhSھ[Kb_iN-5Za~C'+EwIM66H}Ihu&z5Hwo N֑-}]l2ޖ lSOvبa(A؆ll}[ +ߥ4>>_jUӺm(x߈Zgou_]u3a׺|~cd" &_ ėd4_GT5oA~cEƿ_KKOuޟ4^_ZKu͠WIzZG}$A.ֶz4=V;K'Ii& &S/=u>m.&궢L% P4m-T%i%MHl5/CiX- -J|CM:I 'XH kliEÊ(,RƷNpT&Wh4&BA ֘P505*L!afN0B""4I * !AAKp!6""qIRKm:Q +h!;)Hdܓ)̐gLI&AiA&(#FvHVL4&T6GC gj0APUe - ;;M5]AGSFkeEÇ&àZmzZ,rۇqFK>:B뿮վZ^:_B%RVa[P!| ϑCr u}i}M4,&ND~W %خ+"ݭ掚 B_K AݒAI7`z.^fgd/׭{&wIKOEv}Z/ni=l=ku_M/B#mZpTC!uCzK⫢͖{o]g|_ +]Vw_z{TKa¿i5 +^ οԌ,?ߺWvtKҔm֕6NPV u~GN+s)_^G{ ?Kn-%~*˯Si\q붷VoCm$lՆn}ǯT鯅'6kOMӊL1QLRtNUPi U4aSMPk 2 !AB#,HDDDDDp0B"/E|^a6FBhd&dj3C%ٕe-P(RX~A;- T 2eD[Ў#;Rr\*L' yX +45IUץa  Bk$Bm] -F:s[ѝ,;/+j~~gk yoVAV뮫ott> _]_[5GMsΨ"Y[>i{!z #B8< LsOҾ:}(PN$&[K\Z,wVVޑq[P:j WkI #z “z )N0mxM1tC^ O?,W1kk\}]xM%3QJ֒֒G#5?֛tmW]$ۣҞidImsF !VQKﰭrJbyIo4z\qQKIV[KNM4 ҦzvBN A*thjM4{Z^F=V + &[ja4N:N)6 U0{ - T DDDDDDDDG#DDDDDE!L .)Z +E-Q&hk#q6532A^fgfs;4 Z Dv2)ެ(PMB 5P;,a0|)2; 0A?-hS + 0vl7&a3)4h5: i %龩vڢEQ5d5ܷnӇ)YzyUxA6oVߥ +H]c}WNCCx@뿤k$K]QufǢC "A3 ᜬle9g\3Nкkà0BA8j,&&B ݏ]-t EKNkM;a:{Cn&|,0^=]m`$}VRc&k+pN_i^Tix^W<\$f׫ /V/J{:]oPM_J`_u}J4 +U_ +7?_ V4:8i WbH8Q^kIF^T$AӶ$M5u6զ) okam5ՊMتipW5<4B hDA,0DDa8IRahZ"" &,[bD\DDqZ2zia5#]Fd -P8F4e dfSv4"v d@ g2;Uc(ꪺi¯M3D0_ªaPI"ݭ#cT +SM0UM5WúM(I7̄$*iᦍ4\=\HEMN*5ä]6AEZz'_uWNޜ7+[[>U1iS(uaz״D=A"q 63' ;/_}W"VWޓPńS4ۤE-C[_ B I(i/H8t z 'dN䝆<7B>_i,?ptۧ _CߧwҿK>{ժAi~6:zkC  _p44_ Z_zNzn޽ݱ_Otך/=SYVv +I[to=tr<']&?/ }J\JLkpizS}# E .J>N)B+{T)obTiQZ I[Mms@wWH?Ӫ צ5Vi0h0aPuLPL5[ ?d4ɺa0DDk qDE""0f0DuP.5 ( +QqEHfUAltdY )&R pA +DI*fC(3C[ +ha4MiE R&XLՄڞi?E7[>tmtPwJhNW:]:_]mfs[Ka7?Xu‡ǭ7ӫa_>uZE~__:߽ Ok턭/~+zW8gkraBx{\T}_V/[ *5~mun4\? 4{]wk߄k<iJҪ[[_&ut5zjja?kTM[v^Ckozl?Vj<'߰E-Iw9C]Ri?A~+oKuk/DG C̆=[ngTפ{^ң/ ultvL%#l][ ޷Ⓤbq^lW'KݤڦWMRmVMޚWilTRt'XM>  +L(XeaB0A2' & ipe}ATaB"""# "YGjHRѐ(fѭD4342\‘@s3! > "KBh07X4iM)3Yڙ*zM Ԥ`ui  .lo6xT0iþOrI^XE&mxl=SE"~B:O[t[6Sn6o_w[: z[^/|,BWv\ǒѠ0}}w_8Gqh3m0G, i邅 BkU4ӿտ{T~-?Jخ)k\;w`Ѣ© .{25p&uM뭆;Z 0vu7oz ޭkm;czN[]xmOK.~C>~;;a77U}[I~o[]zzM&~o+S˼6kY?kF}6}=Z^K_I}Zګj>ҿbcض+*)LUIV <JmLU7 5Ki:k[BMM hhA`CLe[A4h42MS0LJ)0Ea0aDDDVZ֣P@2HDdV7-Aw\Ere3&ƈd,: #\)f A;Y@-B§A&U…NMOڪj@kIY݅UTMF&r *aSL+w}xpOӫ¨A"F]"[C3[7ivy}4M: ȚG_qJ+J4 __wU~iU.ϳ3Ef5.3A#krgSCG}[׽zZCP[awEv[Z.)Dn5W6Z+k}'Ia0ޞkia[zkkN}7?W~n}Wt/xcZ~́=^C/aTo_=V %zooo:J~߯kלAk: ֪}]^{IJiZݶ=G /IzL%+^[NG?}l}q.i=lqZoO„iڠ'[[i☯Ai]iݦKa<**)MA&4M4UB""""""""5I҈fm ,&ZD" iΈDEDDqڢ -Rjk"Ϣ'3 4ffZNZJeѓtfkRh2\gevaGdBCPPj +UTe&N찂3K~Ux](| 5L-iu/ ݅F.O8N-ڕh>ToI6z~כ]ui~V\/yڒU-%I=m}n8ޯ03pIqxA+k[wSD!zI>z C?ޚѮ<&B- }WOӫ_oK릭u_[Լ__r꾃^O]:&{z?׿z߸i;jo|'H YZ>M\=#hu[_Ƕ߾]!u?eX[~^R]~=\^/n'9%Z{ 'dtS +X)uخWqQiZiحM5M[M?Z XavkkN6;h4pxXAhiDZILPAL pa5B, aBSBMDG-i^~Zyg/#fDDk)jGZBAlNEtGjH*av f (NZ 3H*aUM4aRTxTҹ6Sv`3[^4jA#fM0[M0h,~;T $?fv憮Ț 'pN]6?M'wi'5ZWF_q~WP??]k޷ ǐSStz9h3٠4RR!+_žbizL&vŷmuK}U+0l*]7OFtG/< 'iѲl=(׳^N.\;]%MRtm5?:][;}~ktk} gۭ_囩޿m3cuKw~74zdžO%}}I_N?*FjҽOOںDI$g?m#[ -w}]vii~aU +U(a>)l]aX7[ضH4Tƃ =5%k[UtШ a4a0kva0 *1&1H6 +R4`DD0DDDDF4!hZB""!A0DFF Јf+UU-3։#|FXτ)Z( +fDAVvW4Id<)fP& `A;$(PU +irl }=?UpWY6 &[th,{K7-DW&hώ[DjtMڻ"kyޡWM ڤ-(QǯwѦIutͥ4D$wZbL/> KO}&+CO_V]]lV'z]RհD9=TC{i?Oki~i$mU&:ii(%lS0&…[RRCWA4"4 6 +3DDDDGPL `ЈBDDENTBVXC%b#.## iZYRu v av (* SR"a4 +0L(AiU +ڡO +Hvk/+W&i0AO4{3<=S^tēaTaQpj9ۅ zUEscZyz$>׺tou-z]h3K׽F}}W}|(vG3mq3m͑5aL]_{!T[wjޗ{G}lWupEa/?<=x@}oz_C&Mc }l;=;\~ׯOѣ/u]/q[~oduվ_n߯VPZ?:w>gTjJn]7[~{l06TS *{\޶ﵴJ(tbЫb ROzIJ*88jDKWڦ$ +ІOl$JN))kNӦ *hDDDDFF 4Akwa4L*jgCB""#Wh0iDF"!*rB;T*Մ1ѭ9l(3hՓz'dfvdJvvd)@2vxy\a2li)dgexTh2gdPUP&AS +A"lI3;TA3[rN8AhvNA$ɰP0ipi4/;it1{hݬEdGO'ZTATIzKizX}u[TkW{7#K{r$g#9 ឲ#4$&zH6Ҧ)w}}-a O\! w5VBv}ע4C:. oâ15_].( Vl0?'.a_x&ؤ M<}mi?޸ckFK}믯[|e]$;̴5zz~m>Xowkޟz-4wJMud5RI7{tZ?#FkI [ 0m M`L4AP( ]ե#k-⽊cA^'Sm[UMxij]8Ni]4 XaA$TRUW]uJ0M4 'a,)="" 0CӆDa DDDGStCT +">@HmFAT +3DfB(fVY QQȧ dvZaB ̇”)R`“t аi(I96$DO2;UPM4a=5 +Y6 a;TIAj.ݪ~T0a4ݧwwt|4eO=!ëzhm<\Ii-uwj_|K\'U{K*^{ebf3g}gѠ%iV_G[zg4PSfL(AƈM-mk;YcarcµtaދzwxNӠڠ%H/vONZ]>NU}kK~.ct:tIm/Z_kF^Siu.zz,wko_{дo]tMoh$'sH<7ik}$ +rM!U{6{ONJ3CCmnCj!A/ꧻ^ҵ^a6=01VVƖN+ iOMHlZ8>J0UL}5MI-a%tz >M0L ©40c(1`GzU0 +I a'h>" DCB""="") DDD/@U' Ј*:Dth^ -B3GbȤ_'3hדpfK gL찈zah]¦aS + * 5Pti5bDCGjڡU~5Fwa=/I&0A4oIm%O@V?$i3' Pkƒghio>g>k +5£cEüGkVzƯoKI~/\:[?r3f30fΐ3٘C2oџ7B +w}UW]a oZ[ %-Ǡ4C1tAPstGG2:~bt]pZjXl!,%]oMmu<]zp|&ߥצUI$e]Avƺ/3xq%u{}fAJ~A]JUІF5K}_KK-p}k7k*\iy${HE^_{a5 +tLv9O}'t6eRmߡqtWo~믯1ǭM{DJOzZyߥ_W;+}63fz@͙A ?z +׵ + CuªI?Z}wHϺدmh{ E ZGdA={}/KץZK[ﺶåXiW_/BBuO?M=nI5 wIw֖ Kƺ4=kco%pXhzJo?f֌9uI?UKժF*L.v}iQ#`[7ӊI:I *Om$k ^kd7&-0ZmXbc؄t꿽 Ӧ*);w =p¦0k1I4ӵޝRzؠi38N2X4f e: ~am4vЈ""""1 !XJ $AVAo Y,u)!59jαWdDM@a0 a AAA;$ږTauU$j;Ti.lIvXGjA (/^HwڦIҹ6Pam0N$Ӥt6 vy۟]..*t\?q[PNkOOOI\ MI[At^㎕cڽm'}OI{1z+W69dvff09̜άaS5;^5 +a 0< 0AËχGoXmKSMa;;hAA>=F5۵Ayԛۚ;{.N>v& Kح~Mq`ܔu]ޖ'ݗ.HwaS J/`uN6?uR=W__hZiIoKߥo_ia?߷KD^ -K_z{߯KKB!^oTO}}OK3_fK_I#ۤyGko͠ߜAT_R3NzHGHmސ_k{am[a+$KzCXa$"c.Y=woi5:?ⴓA:H (JJ뚙]mHzkvvi&C +k[QZ0lBV*Rӽm5m{[UA=88A<&oMR}&QNAM4x@І(sD01ZҰIa^8M!!MA  6'eA,pXDR0qqHR~UTPb#DdMȌVLL2#q, 2(D {8(M9jH\(PL*V0A;,vSѯ-LZGaP\a?_TX0.t\U6|H,gjm0TzuªL*,wDӓ4Țt` 7?^zJO<ҿDǦoH;tSĩuz׾(&\=6b_ݥc]=w]']5nkz2A>/خ._ !gG3ys=&x:)l@&FA0;׾k+0O +q`El,&~T}>Җ nqWEp> ->D_F~h$?auLFaK֍p—ml6޸>_]OR/WP]M:Tlu_iZm_\t~NEWaZ#_o^ׇ/Z/4_vt[6OҽXztAU?cZsYfkiz뚍]K>֫kd[V?}${_J޿/{bDAY<+KcpZ>vbiC \5kOث#T 'T|RWI-{miԋm{M4j4i7V+'Wii zHlRla=4ݦA;ti=SiV^հ aPDDa^(&W׻2 jIaɎb" 44Ј0qB"#"#"""@BHd$d~:CjII!/jz<{z%_O-$ wj/bKuKd7VI_>>w)uTm}{_UtժI~r j¯I+m}k_߆&;IM%VҊambob& V)P ⓊK -c uMZ;k  i0Aa4? c6)=NX`&B!(B"#O᭄M*h5T@A34ЈM3 Јq"'k8DIA@:N +"< -h0##3F +-@8TI5IKw1pL inޒwGN疠*mm<5 (@k[uTA&涴WQ-|7m}[F륪w_W:32s4FgH<'2tc}%F}勵q~gƃ6G,0Ba8pAi`@ݾPaӧ,vu*=]ۻ cmTң[aIA;6mpڷѢϻ6˽[[B˅]x~Bޯ!j_ zmkw/G7un[k__]Β>usWvsE^fׯT4KV\, ry\0^I+_kmokaV%ASzמ.ӿҏ߭n)RtMS %#*.T㊊kOj߆tߦ*iD~ڠؤت}Ӡki;kMxKA0B#O +I &[0Du805 0S)R{H-Vց""#10R@DYZ*mCB1 +9FF@R!W7&# $PS&R٭T" L „.2oO aBwa4S; +#ڤETl}Ӡ4:-&Tr&paV\*4\<"MbvI45sm{W}/OѯWھ\ޙfd.ž3DACPc`Zުk'3l D!wh0}Z_U{~k +Zw/oף]}[a\oհFu'&;k] .Uxu{znxm[Z6x6uA]/Tۯ኷ӽ_4wqK\$i>[Uxz࿥K å_^c~'4u }_5ߤ?IWh;ֶvO%]%]i+T \mN?NH$; i\G#*I8ӊ TRpF\$zm{;b '߆muH6N$bz):Ӫ]TBB";A$i:aPanl&8< []0LڂDFc8֘P0DE-(7+EBZM #SDqUD]\Ec* +29fd3H)4j d2[G|! I0(A*i,xMA|* Qp~M"{ M3Q Aҕԛɰ +iEDӨyHz-w"k]uSh&WJϔ}r\I꿢_oyg @8g h9 BS;n |Bt^i m^t]hv\ hvJ/N4JI&/W^jW=tl'o7]j?N7z߿ NhAk_뿺__}33_O.ӓq#lJֺkH l4Xi' ި'WV?c>4(&]RH)[6l*h5iJ6׵8_ 4h!jH$IAUp]T{ -AP)jAb""#DDTqK")WedTDy!P6en@Bhda4T3GcYv:;F CgAGAUTAKH-aBe)`S aU=U  B +Yڤt3T3?_UWyRl&DQ a4U}>JXBa04T[ܪ'wrd"iYGڞr~Fv7u]>ZMa鷭|4zވ:5KyztK 过|Xw[!3Glg%𓓲|k` !9@8K|4v>((BiE?AK Wz]Di÷OnVqzƒz]krPF=KAۧNދ +HwւvVt__ڻ‚{^oж)aM;@:T5""c8DEWhB"MYZA(ZՅL(mz,(o:F2e9Uc;~;<d>GePPa-Q)(T-1L쩂I)ne͝gd5 +JpH6&Č; 3T +_H;h$ɰ +0M5E;;RNDըuFڕaVڛE UNӚM ^ukO_]QoNO}unhM &sGnhun_F#V/o!IרjG +vRǙ9ag<8ds>^\x: ᜰ@@ 鴮_NËU!iMk!{h?Bra* Ool7^$cѮ·QJ]};'wnLzNk>^3Yo3o~'Hʒ.?4uմ_avUڦG#v[K*? o⬺?>Jm&=/IV#_AںQ斣lR[i몯VVmiim:v0MM'ija4 '? Mujwj_] L/jЈѥhC@aT"-0Ua!j4"*i&Dee ֪amDD  +endstream +endobj +42 0 obj +<>/Width 2566/BitsPerComponent 1/Length 12>>stream + +endstream +endobj +18 0 obj +<>stream +xێ]7r=<2$ `ltH6yͫ?z7?+o޽'7oտyW͊$e${Un[IM<OoVkHM_m} +&PtD~[/C]ގۊ;fɋD}P̆%C6$&5Vic,"??&24Ή@L6xw2#dt?o|閴W۰~9K(Z7lZgy5y#Ľy㇧}(W8&l@y s _?o*f0yNׇۯ`6Xڨbڟo P{VWH'}5nӶdh*1c+y$$"UXzJ 5F +g@nz;.ԉP+((ӭ=<Ƕt=ݯc, #8D !Zp "Ĕ~.34P2=c7~z\-hQz(c1+Mn 0 %;>f}.:L,Hz3kekMjĺ(uK{}:ΰ*ڝ[bg}p{WOb$F:Pd3QL,QD: N=S4@m#U rK&SGϦ0 GYC46D~̺s ϰFܿ9&4 +\QΠ*bY!ba/RyB4P. ϰw!Uc,H}{3*dɢF!#x;aF#J66n&Y=x5*)8P^èGhzt)c}cu (ne`v(RwzC.6uhw(#>;oXjVL<Ă30F}d- MLQ +[ca JF{#: +ڣ\gD|uޑnڍ_zFL=ю%:oY37_Mhy()?^OqX Y qbjo_r`a!!zoXqe^pڧŘGXaO gPm]E(ƶW(]dfld+v3uvc2|*X^ቕԺk4ƃXQDBo@:0KF +L3(DvBwn͹۷p3,D8rRw9B3(y|Mԅs5T^A!4Ry>EPwlP헄sȟ+&U=IH! ϙJB mJZ{r˄io{YFƗ˓ 엧O͊l&+vڹNfp5ޑ52agtɚ;b/HuLd˰L6c`3ehҸ>]l \|Pr5|e챪7V.$j ʸt.H,_&_,r߉iu'P !D)΀萱oޘ )+m U׻yWzyh%]p_XxPkBݰcmQGd{ EՍ_ME+Q0}c5gJ +{s9VP=?>M)fQibx_.*m$S)l}d(-N@8@@nUl!3@\qaG)1tLJ!Ǣ#ϋխ D{>Jou eZW) Ng[(šwY,\KTt&b\ny%F/ +4L7\ajtYR7Y:u|/g쑠g^-Trǂp?MP|/l橂*%kpS0Eh~"ndF +I`0E҉&q2%> +/ruUl5@DN%Sb]N^Jݧ`٧Ki% 6LsSfP.gYςx. aC/d0ʌ=JwF7PdS9NI;N !'"_)H:rG3_Wffjh) 3x16D+zf)g%4)Gv2{6w,y ҕ2~Z9DUQa3·13}U+T$儏0| +(/yƋ|$;/0m8\?2&xR%l[|Չ|bC_O*/1ytze)k河V]AVoew\Mm椶2\gOZV͊v骥G5Ws$c/@6p(] l牽 +I[!Z ۏԤ d0S~o2Ml Jc*p$B&e鲥ѭFvͰs4yG2\V/\Hi\_뾉 +=Gwbl5FTYG5Ș☛Nwhvww4_#V_y6W ׯэ,f?xQ|K<M؈%pCOV q\4mzj>mk4IǪ٪Czb7s5:~5CGVK"Etr'),_uל|umP|47E:߼ґ5/ +MZŀGUJs5*e6+!C- aF7\ +JdB2BI^&zULȯɷאYghhk7WKױmnN[QOޞSɖ; |S$]{H6Y՘Rj8TXŇ->=""ΊE({7*n!k l>\1D @.Ck 3w@Q =ƃbq ԣ &8ޥC\ʕപo +fё%^ϭk.ےUI5/CoJw Աv3RLTM<*tz5jlWo}ur58 +k N+]ppC0 + +y Nkrt;9yhsEq+l甿:#xv`\PB!: …7MqHuj0:%vzVrI\;6gCN^lC/{~p瓝5=T[D3wxvXZ qO+%c27%#EWٻRcyӮ>8`ym,Co\T>{:Dy{N:GP,[G%.ʍUXg4vq5Iz^Sc7ٜc]ڃ#^yGTs yn9əcx'kӾu+^\V*K.īWmIyj`kX!\[֤9Q#1+zQ=ng؁?A99 (^cxse. ֕:'7j#pHka.562]4uMv5;}6b.}ub=5xb\v"ʧP).xge;ỉ.+pZCDO+Ok_';Cڟp;wݼZc>t1*ЗHNxHX*n7efC0r]ZHnex^{VvXwW@g[t_ e[L O +cug"wiJޏTZ,NڡIϡlr Zۭ{lT{1GZNB>/XObject<>>> +endobj +43 0 obj +<>/Width 2566/BitsPerComponent 1/Length 32254>>stream + -3!VVY՝Ji+2TĤldFdV  PP8̊[,R !T".xM;40TM5A6Aۚ"Ђ.dse,b jꩦaBeH6{I*S?DB۫+N2Yڮ{*wIW-,6ڴ +=$v&Apihd0Ds + ]Oܸ֫zN[eAkJC/j:N=zTDel{ ">0dRzIJ!l(3ϠKV %  H2vG@dH=4 8gt!! 9(D|"%X&rS"B.f)(fU%JgQ7g &/&]iz=>a_OsAi_;Ը0 )8S@sc"A3Na(9&$j'A$BU륢c-0%> I]ZiMw + TLvV wmzw4*}B֒'o]oD Nj^Yweee[j^<7ܻ= cMEݯ "cW uwcW]'/ޒ۫_ ~I^4wowM˷'Nh'}&t{TVJ:ե%m.`뮗U{c~?~}??TmaP=^>tDunT־a&4_{zkM}\Eq, E_ii%]Vcp_V\7?ޢM璯--BZz__޵|}}>O;꿿a)$Z׮@KTiA;~͝m_vUˇmv֐v}uFkJ M;[U\J S +XI8I${ }m}$[Z7}_ˇ +mT ~.݆_ a}?{O֫m^$^ +faV:KMi/cqMQUVخA ӱ^TX[a{[oUnK[ _uh؅jװ!Bm5U i kamX}ƛ *ݼPMakA(jq om0[ + 5_ MU44L0 B *hC`gdi4z 6:M6M&&[nN%l&L(A)0 0 6vx4UAM0L(!DhDFDa{_L 'kzam8#.!ka'֝ +ݦ0C"Deҥ-a;0]ePM0,! !0CBІ3B iVIJ""""""""""""""""%B)n5̂UV +ԁ.(DO~}I";y~0)OyI '_6g+Y@q8, 4qq` +N 5B;_?ioi|HNpŭū(_*둗}?$?7[?cn=xI?/V|TR[mߠ6h<4i{Tzݦa4$aWaAAݖ02E:JG5F2:#艳DG bm1DtBшds."Ȏpp*":/dx d GDt\5q.dv`qF6Nk"ye(G e`Ep+#pR8[tjF":#8*>\L5h2܁G x@r K !A!2F…g`#rn8Xls{+g(r9sbV85-(sg!e9PP)*C ^)*k(lDDGBhr@H4 /2gdaF`BaB SM{o"hl644'y;zn'V?_dkC#Imɴ9fNUA;3aK.'$„!a4uL'ڄXAńOMpzN/[In\t];cq6dRB;MƷUU'}.NNtR>o'+o1?̀=/K e oS 3H/wjMp;GKڧfrڥQi]~ 41w ZCZ4aia4oZtAӧNV*8ؠA^k7fJ\f.t7[O5uzum|gD.]|jK_ges6d˙8> L@gQNӸzz|Za:DOֻ+T֛V_[h֋ EN/>m}I'Kwd'z߯?}ݍw_¯u{{NotLj>n!Z/K 0WC̍M/ϭ?ٚ֯i$U{/Ki0z*Z#ٻ*HKvG9VMݪ .]{T=/<v"ǤتMӊxP[[C$%m$ؤMANMb$WAu$a:^iڅ_NkM?Al'ih0N ¦P@4! h ipB"""""*""""""""""0K3QtV (UJ#Qd [}yi;S UU20SALO: +daH3MDd1tdLv}`j0AɰtD]aSA骦uTpM4M2NMj~kk +vE[tXShkEEtU.3 ! u_: 1^k.FzNg\Y(kds׮,5Z7/:7}}zFdSZXw}[퇍',…]mSjNA""4""#"!`a0B ҈DDIPgb%5iD~ZyҲv]NZ}& $A0!aYS2%;4S2 ܛvhȐgkA…]p U `M496GAABiO…]O ڄO +p4jDnTӹ[NDuDߤUN\aT D5}Q] ,z/j*uhi7ꑱӯ_\.pykuַKϟ_[M{i=BۧKsaC6}toCoNoPwW;wJ^>׬C.aXowÿo3Uk}uCH7At^t}1^.jzom~|_w3_WJk_][z^ +hF־^WW2~ZI4<3ߺOGئG}Ewwi]A[i0 asI$$H!tM=8M?V4*(*K zфTI8 +XM:N4Zu:kN4:ڪO %鄿qQ@kM; UipS]BXaBt[[A 2\C(DDDDD2"5 ]}""#_ڄ !n Tdqh"j_ +:ЍoPk"$ 0L+Ȉ)#[(" " A:gkhd0WPiM303!:` +vfA0iOL&MnML*T$IJSzz.TdS>Vh'֫'' ?}}~|h`ڟޝ*F<%W|td 61,K1yvHэqhWxm{WC= #8629#53B@8 q ^L}…EӋO6?а5Fz_vnZkk? zwjW_t\0·qn1 +0\=p~ë.㏗{^]bLv'xo=Ç[2?}}z_׭q_l>n&5}m+I{_,?˫ [ɑ}з>ܰj~äH4{u}?sK??kg]}(zjd~Io֩={ k9{_-I$Y:=JIZGeʹeI]n8?~*Er\%4a+A+O.oЦ.Sj-;*m/W{J-hVX-+iSbji5tkUZi4i;{'J[5Wv]U5S ޵¦80DDTDD0C""",B,!ehn¦A"8""""#gbүQޭS +">[ +"#y&qzW)̋- +% U0AÙڔkA 3*rl31Az +T& +h50l&M0TT֜;ڪ91U;ODgfI"ES"k"IoT j]pWÇ?OpUҧI綖^q}O^XquuG}k"zS椃Q?קK~vh9 g7` |Y6 <$gĵ/ۥ/ >BhE anaꖌ?al}[_U_?ޓIu~q`+ +F=l5&֋V-A~´ݫMLtSvMywCeWi|J.>I~;|=]b_o_MBiSu2;küCI-PRW{KˋIW_'i?I% 1 ^]m a/YdRuh!oTJ*G}IHv*Wᄢlr-; .ߓ0t4^i-wzM4cNoQI>!'t6(%QNM_viM?W^UoAh iWӻª궘N)!„0zkvP DF\\Ј"""""""",#Z B"#gI!Gn:UqVL(kɔvIGF[ C2Hȿ&ҳ*3*ڦ4gjQ 0A2  )6GQ Ԃ awL* *`L&NT k蛿h$5L-tӴNvzxOJAK.UEm9q6v5ht\4hCyct onki6m&W +twv?c\DS߽~?KzLj5Dr43L͑Lff(@ gC3/:N~B`ޞM8…O{FI{װTZz-ܐ;Kk݄rl&H8l...߿_I۽8$dc➟VApڦvS_ӿӇuCNֺa>׶*KSU]{wZ;z^{k|V8'w}/ȡܻsPjǶ/b?[_~pwK4j;,vfa׷VUo,_T[p -_TԎ#_u3P4t{ҽ#;$?H-)4בgmRo5S%m+p{4$G"rDsZKPwT 4`%A"kRF~D!{Ovv_+.- EzzåO*׽~Kj];'t9'oWZ^_K'J~'mNJ+&XB6? tIEtT)mt];VVAzm}a/ޘ[M{_kݯikzuL&B,aL3 0!TO%"&0m٘ ab""""#2^'kjf ()!vє;KN<k)6UffdvΌ gdv_L&*4j +a* aA U5 +XUMU8T +vUH% +\jK.nDỸi$hI"[ +ERIi74PO4i|jjҨ M/)& nq}-'l}*5 FuqDs*:7F(H7-XS0< g03„! χ4(;ZaUM;BM<&Nǯ!<$ !+EpoEoAXKm5;$)~vp>kN_]\k Luܝӓ&Y51-zU[ݭ~_]6 +/xc_1'i]Cmp:wU߿o&I* +p$h4 _MSj +0﾿ ~wD᪢qEN\|Fn˪[aBw4Ҟtkio>;%nxOJ[mWAxT}fFqs!fi3B38D$^^z[PL*x@XA0, ^a=aSMSZ?M].>t\oEzivwm A6=&ا';'ovF׻{_;)F Oj_۫v\%ntZe.-*.Nv* 7iz ku}oz_]7z H;__b_6mٛ^w$=N¿ƼwI_z{j[WZ_MoK?0֊j~koT$O]IU~zJPY>A'~iw^$CmVӋJVI=Z[ (a&!QVƚWǶ *QH=6ӸQQKoqZ^}'[IAnN* +jӠjﭪޟxVM+T +᪭v +ji: (Lj01@0L! *aavPGil0EDDeSA)I[[Tӆ"#YgL;:D#2De,c)vIfy + + Դ &da&hd<a2A (A0P還h00ISAaUZ%MeMWN$M41߻oHձ%>e /gs:#34vQdڥPPL!` 0Bi,a خ[{TNF> +N!h*&m[qyno?-wփޞ6>8N?vN)87_?vY;_[dV&+uź' ?vR nMq~zz}ztuo|'] Osb6KK}yc$mR߿]/I07T߷~>n25kitz.?u_%Z7]K鴽}/*^B޽I/.}$U?}4^{HDIOI_g5׫ѢZ–M %NWJJ|$ʹ$ +i\4+i%oa-Mtm% (KAcObXuTSmSh4m `1T·MINRL*jAzkl&v &\4 L! &TL!3O A`8+-S,ʁ__YtunMTDD~ZXȌOd#,ι3-E#)evcv`AM4 ),4`Pa&hd4L S$SP8L*AaS^\4H$8PijKJ]렕rrm Hd-j#I94\I^/W{ҫ{it7W1Ç}h?A4_nwȁh.Ιf9"NE3Fje4j>Ba0L&p"a 3 ` 3 ;$A_ڄizotÿj_4e\nkoM5z.hvvm{~NI|:Mpޛ UدdQɽ'9c[{[ONum6AnxÆNJ(Cj䝇uÞD{߆+?>tۭn -]Rߦ ہޟ ?+H/K}+?7]W'KE^czmUKou>>^z};vT{g]R^T?P+rJi[I'IWtrVK4JͰڶa*Mڥi!ISiƃUZ*)=^+BU ,WiCKPI+ +O4j*☥ a4ڮAJmPqIXj5U0kNҴ0I;MA&A-‚a5Te3hD000LL ! !  +. !DDG!VDDDDDDDF""#Ou\Aդ0(5-QfR tdةCgA3s;Rα@SY 7&ę;%3B 4A 4 @ &aSH&zNBVih?-ˆU;jNELw.*d>r7AtzAӗON$6aImWF/I츺&\n/~ݭ ==/?"wtcB=?Ztg J8G,F{ +fJ_zUO>w?By {^ja&mhqn׆˺4SP޿mKu˾׿}W1];oO~OZwv)[o_c_Kվzd}& QnI_k~zpkhu{C+o\?/_f׽}wZKKT$􏮒S\00~x]#5#Ii=>A3vkɰj -$JI CFViR,5պBJ)BQ\k-i1ccNtA;I8L'{Mm%H0mSU?A.M*Oa5NO a(Xh0QJ"DhД! !B" pGZ DFHDDDDDDb"YĒ +RuZ-GXb28\#$e +vC!PA&fIdH#jD2%.:p@ZeXCB2 c + * 0 + &vgNM* & m8a4M5iR4Wl;:h$\QpחtMމTׄh4]#KަMӢ:h&{%^~ph?^{zV}}qni~Nk91,2D#'{UL r`A#o 3oA *iUo#[M>~Pz!?.iyhk.Vta쓑 ۭ 'a?yv4]oU/L'w_I15c^߯`V6֚xҾ޽ۭ|vONӥ^#Z6t\7o_ֿmp{yA]?,4f$]W]fi"_~jڥ%G疪y6q~$iG~bRPO=zxi7V]otger 3dy{$A7.̡d5+[ӇkÈg Bpа,pW^x}3џO?ЇY ?o4}M{}.ktuC}ҒwW\˂QE Iml6}ڧڧ~뼼A߭ =izJ1D\wy(k]ݿ{zoޛ:n?Ooc/o[_X ۙS㇧i-v+/O棿9~kq{_zI]o =i$}oڤfl>#i)?ڷݵ_咄LܷH-Ii&drI+bTW&㍼%Z]ajƴUzjV ;M5ح*I1MSWO]5zi_N.jtX0ipV[XaPj&d;i-h5jPk`# ЈDD]jT+tJ ZPq";/6vj;HDdvfQ 975fQF`Z$00a 40Avi!͵&YaL iZ{a$ ]aBI n8zAxUꕪz&ޕ*tTEk ]EۧYnqƿ W9-kzt]^(toysxOu8\Zma=z}M^0?.>8˙|H ь"pZf@3<.fNhUjcUӫ +X!a,(OX!a0B ! XVO_MӴ_Ѯ[r^ +v7I(|z}ɺ('i7dN³{;]<RvN麅;*:% //=>[k}=/UM@ސt*}kIVkzKߤXWh'$x_I'k8:WJWE7Z G\z>JOGoZz=ީ$HSzGP??ޒJ{o C ^tkiV}ʃItͰ[zI$=&5.^⒍; XJ!nƬhVHVƱ~$V*)%꓍ TU ւMtժvK6($ݮijimCTWmpv¦j(Tj#ts +tK, Be ! aB"A ЈP"")7Z4CRh0"?-QGdD&F42ffkd`̈בd1nMB3(gjlsPBA` Nd0 ɰ֡va4jP馜.ue.ڦדk᝙nRNDڗ҂Ycy6t}-ټItzKۿTG&קl)y%O_} zw0Ş#a yh9 BS07ڭ^i4BV)_64[ݯM[ZڶJ_KEŅ$;jm&N֋’4`U*도OMmuj]_JkCocoN^[ӭ] 骇M,?3[էnhhCm$%kMz/c?[_$cgW$K k__o<ܜ<ߥIUMdGHӭKڇ=Lܙˤ޺$zE"[{O +ںIv _m-KtӥbV$Ǥbi=դ뤪U'M& ^kMpL' Ӱz rhDFDhAa DDDDuGsZMD~Z$u&Y\ҖD[&TFAPKc!l̐34t#dkebХڪ:@앂 5%Aj*L& `900M¦%PTtS;3A]Ț ZAZENvʌ"{`#C:&jxTc[;E< $!7 L#8w7b_^Ch4ǿ^ӺVv .]zJTFHkњgyshZA,CpPAL&O3fA0Z|>W_OV Ziwih5!j}[ __$[;j5 MCVo ҿEگa6'I䠍ARC޹8`Iqpno> I%.aC￿~-%}ֿ<&v6I~}`?n{U_ݻӈ_זs[%ӿ+wuHImh{3]v_{I}Zk]{i$}}HH _if^_?as)Y>qO$IUKTh29mlzg%L, +?Au#EȿEKSaU +B}/]$*;zNiiiN*>bbOMzT5pizu{_M4NӰ &'UT j0kL/ka4aUB-a4_!0DhD82""""""8DDDVqU*Ec;q֒A# +4ˆQo:js*&dteW5"$2 +@'`""̕FQ2B")96 OA 5Dڪ(T j&M4a4PUH5 +UaT&""E]?Mu_ދv'{^`".'SG߿,utI~xNì7*j8t'IuXp]*_^=_ݗf\˻=ffFqw./ Z/! g ͑ACR0]oߧ馝anK VTֺiW^ߥ%IxIZגv.,)'V8tl?N,.\7_K{{vM=o_Ce |k\~]}nvz{^\?__TbuC[Ѓ ~_,;~%?~Wj/T7|l{PI} Kj'K}OJ.kᄲܜ]Hko鰷+`CJ4E0AZ %i:&ZT5ڸ6ib{H:8j)UN6)T&-iյi4ҵiz~jh08WM5  +N50 &i`} Tکce{5D-Qw/XPN, |]A-? !p5:_/MM;A}/\kwkpڴ[?'p8o<)![.O)8 Z!?~O}[p8tj~ᏓP:Wo/{kﴋvWKiO[ibWj9&Zz_ٚ/O%?_&H$^u߫_]#OU>=zI]kV[6o9-I9*IFƆpM:mvWU] + hWЭT67M4kNӶcUm KuH6)T&KViִ&jjOj pe*CMVXa4a0@,s +0iS  DDEI- qJ𩨴~ZQ2b5k-eFPq!|! j,J3HԎґɨR +&F +3(:gap!iA D9ڑ  &44 PioQoUVUm4=tVӑ4I6˶]u1!nynh׬_|<&5ku^?s8Fg \E <>g~."ta80y #ʃ}/oJ{qT߄,&h8XAk4A.aZ[kaQZ~a4U'_uDtڽ1۰nZ.uK_'a; +IdA8ORpz*ҁ+WNvCzx +,'IWmm߮U$޿m}D B? ^a@,?ǾIOީ/k5g__TcrCKԃz~.a3%d9J2k{zGmޓ]5u^$_ZZ~oI b7;KizqQ~`V5b/_^.IM6zqM'{I tM'UA$ &iiUkaBvw  U0A#[0vń` !BkB! !Cg7'QeK-Qq8?]jC\b>ZjiL; k&9QENš2 |hdA rlZfFvD;YT&`4ABh0`9lM4M;\&* +' 5MݬiR)n:v.Bvuu[DH6ko]'E0@y6;pwK]zq[^VƓxO(tFzƱS0@ϰ9da qd_Ko]{Bi z}!hF!=ҽ~gi-/KT˻:.ݢ Earcu{wxoN;'Wv7֕~A^?t6Y$.NSI/{_UK{$9  ~Іwo#6EA可KKUޗI?k3[H-JI%?MG~Nڤ}$}-oki_N4a_Z3O*L/w?[2:t+vM [eK[i!i6QNGIKҶ0 ES8lSISV鵠OuO]:ڥkM{U +l(MBa}(r4!> Ј0B!`Db"""""0Bd}*uVQ-Wj-L;%d"H3!25"IUOaPgaY 2A5.DH0;4TA*  +SMS "݂j +*n꨸ˏ5TEV Qvt]+[=Il:N[oThEAKF40vx[t۠'tuKQUfHF1ֿjZTn0B|" yh;Lg];zP~Z]N,&,ZE*,zH~իOj SzI2nl'hl.hzonJKɺJc~I/khU?Zm=?ۯqOІv%$:^hoo% `P?N~I*o?7ofk5ޗ-$ozrnZ_}} G}aVޒ]toޏ%O2monAbI_WeWޖVI]CUal'IN($ؤب+:8TU]VA{I[OB{I * ڧ &LiڦTXhPC*A!a0DDDDDDDDDF"""#>jڈ&e&欮]Ufvva ՝42 @sFK6ÜvăUPi +*a8_ + ?a=UBuUT4nufvtw!~DZmCI 6)hsC mMZNy:V<']uJQkUfff}Ѹ2|&oW?]⋆"Wi֋wץT/KZ_ޝvE2N vi/2_6L}\']\꿍/[, V= +~OwK]çoׯ}ЇQzwu?wq_%PO-oz]WT3_5UwZou׽tm%:=,of@GkץKǴ~(OK=jw[ _G5Pziյ״E&ERkuz'N8TKMU^WkM0z5~{…]TJa;AB0Aiݮaک"ӡ`HDDDDDDDDDDDb""#$*J:V0Qo;!d&Z2(VelŽ;Ti0(P 2RpAH`3*̃M3( 5L*OL40TiON&S +Mu5==v'r&4\4A:ˆI]?|O4C>fuo_WV_ ۄt{ƒߏcD5934˙80"N?>ŦA Z !&h0BX5^W_NBk^a/{I>[zq;wz-M~q[d[. NRoIuOO+,k}ӯOZ꟭%rCua?E"_=m,?6;N_"޺p}Omo}ֽgk_I~]{kk_+IQG|Sim=߫_d#U Ik~HYSZhwz^Ҵ&W ( !bI  qA68&i` m%A K'O]mUm5vj]}O AiiHMmAUi` 0 $ q!i"""""""""#ҭ*@O봽EaDDG娵O"2]#,#u +eTD43(gjFC3`(L* 3<:gaz ړ`90ڔh4§T S +5TªiO}4cׅ^[DODݴvr%%zA.AY!7\g<߫ϙMSt;~ 5q/]t|RQbؽ흕džgs'3< #S̝lY˲s'E귯S &}ń!s?jZ"봾Xc4M?kOJ_5_N 47a?-5 zWuuvN)lZz8ӲQۭ&]ڪI4K҃ZKC:_ɷX_'w秊}cOW׷]~W~Aq iCj}=Iwkڼ;W)5zKWK_u}ijmfiKW%]f}gnfI T%GGkk._k0sG-#ѿ[t*avm-b˧c~m%[ U?O]׵Oӆj i &C !` 0&D*J)dhb"""#"#2+)hxC]njڇɰVuEt[d.v(v-tΑN̈1ŃMA Q "4JU%څ +0A;Av *(T h0; M4'4jvvKHe_6Q8z.6.%=]m'I ZwIIë{a[[o yk뮻}wݮۥcӽgjHk >/ixAR_޾L}zTX}^_i+k_I ^֋vM ڠU~I~NԜ_N ^֥֩wB~XM 7z}~^kH>=/ךGi i/&G~=NI +!sC|y.GPczJ w۠UK'ooWKctv:0#L2JquK_?Ba0B Ag69>5#ZozM~AU8B._kq~nk֫}_zN',O˺.}o׷tJ[ aQ'K?";_ۮ{N} Sׇ~^XW=,Kz_I޶~5 Gi~I/Kw/H~/^u]U]*GH[o:+S[ͥ$ +r^A c:/.6=p ;]&I zliJ)7O=4ڏM&(& Sa^q]ujU?M4XAZImMh%a,p[P i[& +& ʩ!fDDD4"""""" !"#%[ˆGg23hՖ@>M̭FvGk(*!M4L!A D[!AqlRlgjPA _M4=ASM4i aS +M4iOT4qrzetM.h=4]M}76/'^>tѱڷ?9ck_…`.k0fޙ7]5Pp_4X~ۯw}hUﮫ^'NtkMׇw=:.A:]kKCvIt,l6=}k}I'$}4I/޿D;*wҦ K-Xf$~a!t+o'5wK|Ot _itTI5T4$~G] kړt$% +T +%iz=v.+I I^8ATR 頚}' jqITW_M6ukTզ&*i kM—Ai +&BALMATM;OQDDDDDDDDDDDDDyZK*:D~ZFyi੦vf#&hD2>d[l4(3Tt3#!LgT +M0geC (yO ʲ!L&a4_S U0MT& aPva]:}S\.E>\U4]i3=OY澓s+C54C!rǺ[]4zZ omIjΈ/N=z~oœgDY<g=e93oAKƿM0N=5…4X?%ע|OkkPZOU\>/*_;5j]w7/nNEo}.]O7v?֩.鿭%1v[Jo^]!kߪK,t{t kwR?%*? fkK/޷I$k:oجI*oI^|; /oaZ3 #?53^s-؇=bEw[]C%MCI>5m$O {\5UB Z_ATcT7)ViI $P0kk]a8a T"" hD3(AgDDND2Ch5DDDDDDG+#ӯQM*xW:k.ț)LG~d d.3&WLO"N62l; a3YUWU +50@P23$@;PӰa$ NꞨi;DeMU5N軧i;bOw+^3TuTm8p}}^>0$^OI z}zMt#23,şJC4b(gI<#ȁ Ư?5A3d`4 Ag¦l7L&zm k}=/0UoXZ_MW]4[֢DI?ދM|/zT[:VA}n+wFW _ywE,'j_O7LJw'm} /%+ֿS}]7\1/뗍t}WU;^;I/mx,5,?.D!nW/zKt֞Wq[J__6ׂ*/޾oI$k {jduWi!#G_WV3z $?ֿ %"}"ǫbX͵cTtK޿[ۭ4@O, υ8@0fރ6 kֿ_'վ0{Wa0ZjȚۯk[kn. D≏ CKkNZ'“uLmMOZ/et;^_k{K?ZNynI/?_l!zHCתIo_O_Ɵ[I_K%^I|;IuWuOUZ_~_o2/I_=_KiM)_H!#t#;HﶨIm$4=o[|_|[HIk44[E[M4:wIvl5 lR +qZmPMZM7k +lU]S[J5]mB0v0piL*}j[U )4""#B""""""""!r;eV""MwX%ZaD-|*HԌ#ȏ%"`#pE:.d|GGVˢ+_0Cfxtm#̉G, T!`B`g +ń`aaXL* M;0KjBD&EzO_05~"=jߪi[OUU4NOODP;m򓠟Iݩw-MvӪ&;vLz.ݢw~7zh];{' 'm}ƒ8#[%}vJYJit\=tN-ޤ67A>˶'mN' +0Uw7]'p&6zn4ߏݽV^Jԝ$nչ+.,%|6^~/ GO_6=mBwc_xwdLWO{>:._+ n~ֿдO1_ 0'#ޙllI~ ___ ׽_-?ؿZ_zd䬡𿿰/ dڅ#}mCk/׿_޿q__mh{>tkno0?(٧o/'~J)٧._o_/zv鳉K_1_޿ka+]zuxjrUKc޿|5ӽ"abm*bߤ~0i?ڱ}kkwwE;XkjqQjNKkV_a{Aմ@.uk}}>SBM4tRiMS]֖kkSݧx=cdST?^ ӱiA 7i5Mi; >i޶T*( }M0 : Ak4#iA0A?Mtik[ v5 }zUL ɸ&F0T{IV/MCIR{V}iCTӤTi2&SA"C5u^§E% [ F8N &F 4L2p]4~!ULNT'h3PDDDDDmNEi :iD"#L""&AXf֘AB""#DDDDDDDTRq +endstream +endobj +44 0 obj +<>/Width 2566/BitsPerComponent 1/Length 63007>>stream +-ęHɰ&]YEh +_T+}p+Ml(qfRfhgkY4v4Bh0Sf`zB]?{-hwt[s%ݭj>["Duț;gLR%"WXF`!xe0i !`g`ie9BY,'@3p3xPdvpPM5 fl< +~/@O2\Ԑ2tme! T ¦h!B`OPt '`0!aPi!l]PB "D'0L tUSG AknktiiB-k17ܛN%ũ7zhD۽]hݤNO.pN/i$ܼx&7nv 'wz}D6'"wDO6kWIwWbz+8BJڦ+%R=ս'D[$[vO5N<%ӫ׼mqvN|/ޛd}?ӷ\7m?tk^h/_O +l1A}^!//AOM$w ݪzu__MDcnb^ߺf 4?OD_饶UiB{?]x_k:: ~mz߿ua==5a{u| {__m?}jl^ l_m1kV+IW/avGqJnZpMݱ;ڧkli۶v 'zkObT8TmMV6m>4pM:a5a* 0A6Ii"xiDեZ{]&i>5m[0{% d 4v'Aj(M$8LUT '0vE}k Xa4LMS"""""""#DDEDDDDDAQZ""S!Z#Y6KQ꾯AUhSaDD~[;8³*S"0evTN W Dw WXwvpY ~}no]|W}_]<@B yTd_:5@eI_D]a2 n\iB#칔 .R0 .a>Ez +N3!E)`@ >.\̎$EȠ8M8!j0-0B`C MB`AXN `XA=m5UOa4SӵMS_O L&Za4i~.7Z'rɿDoDމZD}C88c+D`/.`vi t˶6'Iv 1DVA\%x>wC+n㍒lWWIVum,Y+uա߾: +{ZoEZ]0h? ib1WdcL1[}l6 +Q +|_j'|!5^OX6KrJq YD SdtGɞG@BL!@9!| (?[᰿]_?^lʰE93Έ>d0 B)c7XC A݅dF}Dcد CAHb:MXmֿidO~u;}:m_(:P{_v頻Aۃ" ?}no _4?5 MaԏM27 2.dp䞂qdÓYa{k~Wŭ?Dy*l.Vt{aajl,5 =铦^_AdmA=oiu⡄Ͷ{>ӏpu lOK^݃ =[xO77 [om7G"k8Ml5Ij??m2:M[u߾ݺWNӆvKǧmuqUƜnUK b /{o~wq|qm.m4I[XM6uVOx0}4ڦ6)ؤN!{~8-coo'Z]pծiZa4״ A'L'M4V8czjTd &M'ATpR'dSLB dn4:FL/ a[?__҈}8yrQ0B g_X~I28 W [6Qo+UK^}g}ZH*N-[_p_R>/JV' ;wobowNd|wdG}Poye:=PE߿vo!}/!(/gOu}}wL0_]nkav}}%W"dn$[Ko~% j0$p M 6 +u P)`Sؤ6MZoza;TC4lmPAB0 A;0UB&iaah0AAkm%W[i;VOVAAkh0TGh4D /a{]m4," DDDDDDFJw٪ws/Hifl~avO%!WK!Z?]+eٙXA@fGS<2r$e d`ǔ#4 k2`efx)C$#l:3[ +R5$ AZ M0B :x!h4, LL!j & afp`@f  O[SM5MpO_ AM0a L&0'ڒ~M}=.*nN˸`/(;/xA6¹qݦ;w8m'Nn`;HzwJޯ#v+i?mI[dq =ڒi': t-8ղ76a/ҸO\\Ӥtw댲DgAf6/ +^qBQ)B ! PCK|BS_V +1׽A Apv~~-|ƿz_]d҃nޯi6 +W}E_/-6ÇD(:wuO?E) t;%nJܝ:Xo_j{kU~#ufpvZ]mdt[ :M{__Vֶ_ﶻir+K/ᄿRtG~ƇK@["]/xҫASkft]keu CS4aa{FKxnwz[ .دߥ v&AN֛LRw Si}'[x>0ntc )zڶji֩SMڭ붩7iڴmZjZ#t[M5T8N F0^[Xkdc7Aݯ⢣մu}`A a 0`eL`9[50aa <):8L &Pa &0A!_ӿN""8qVj&I.I>aC_; a_NxoTn>6mǓok|賢AoC)MvZo}~W]_K4l%MKxiX0In\*ګ[ch6BM0ojM vJI["W/a[I.a;P-j`0,0A" h.""""""#帲;ZM?D[;kp߹ڒ/OEޙ B#l:yC5)Agx<4&db"Dudmd  3+AJ a00B hZ@D q ".C0< x`X ai0AF 24 ia?h4TSLM04h0LPB@OwooU]8M5蝼0[I z䇶;o.=:'E I{z' D˶0HrvPNӻJ ua4]'do݈W %y+tS>FGjr>0^. ]uV=t7mhz&&0Az~ޟkWƯێ߾V7״_w_ƫ}xZAo|8_iB>|:'RuwyuakO@_R?_u^NMpZtBO}EuzZoܝ7no_VK{ ~ % Mivio^DA?k ;[xijڥ|pv+/ZyaouxڦZkLi+Z텋 ZQ4mm*Q8mxWY~a oi\Ttlk}iUv!5ڭm'mZm5TRiiM ݨNL&Za7xam4[4mV00 ao[M~Ma;  ^«DD!` ! " "<Кp['h0FB -x0B" 0L a`0AtL aN@a5DwHDDGK73T%dC1`Z(_}0*IA)7#YPe#5*;Jd(˳G aP& ݑdWvs] qwu}믿z-hu!h A<aGFF@FC?Af a08Nӈah?8UiBiwvUOM7]*ߦR$;ӹq ;~D{}]Z'*V蝺_$dqBxRwBm쓨׿A^u:_޺鄯vZ 5@?AJ( y 0[uO_ ~IvN(:J?꟠t4}k_J]V/Ka)x@᤽~lv_+ iT{OM*x7L%>N}h;i + I׵Pu[jZTdQ[AiR |kڄXA: 0A5 8B<4e( $ͅDkHDDDRJ"da0_iT@\ Wjdj,v*Z-*UհM:u "2:wzi +),A$[}h05w띃dEuFdF "-s 0@C hȇfdN3O/_: " 0q`%A4!iM3l32% Cd@AAa0a0/ *޾B04ezPMPa44^ Tժ=rrq&D/7-") ,JLc3i qڢ2GZ{[Yo=wDSgt]h=';}'ަaMPaU4SAE{kD~\tN Ӣ͚ "xl:yd2Ct$l)@['m:W%&޾tKa7% Cj_ZmEնC9' NcZ4pOm; IUVXc%??@-%y:v4_ijܐ*L_֕"#p_h..p~O\=D/6_~_ w}7ՠ߱^7o4_x#4_fw2u_挍">H2$ :"##R#Vusd Y4?I"O'^Ofp9W}3b0L h&fl j ͂aƘ@C#6323@Aq]e3320g q3I~׽/˧1^}p߶_a'Ka? +a O8 aS-ń!h4-5BN, Kdo|x_.0jub[cu? m*^uSTi]k+}5~u/uFwu\Wi-үynN!y8tNN;{C8w{.=_~-VՋ=tإvWb]wIm_;#r,p ; pH w} kW j?AƛWVk Sb] +Ot< i4n6O^z['䞗4yB߿ JC[juo& + 0;HD0DDDDDDDGk u 4'h4d4A0 $Y "DDDGT_._zc2Hc DDDDwkVbDDT+/z%o'%nz"UiX=iIK0ڥj? Jկ~axu^]$v]v_Uۿi M~ t?Xmm^ ב)ڈ>wqh&APM4)b0zZ ?t=?V֕jTM=0M7:i M6iL'Oa( 4u["_}pWWP䉄 / ! 2P 8@ /h0 h4aijM/Np2N[09o<%" dhDDDDDDDDDDDDDR"""" !^Pi -APDta5ӷDܨT“e(PËJ*nމzDJUEM &s޵;_v6׎ 4[DfK:Ŧ6$[Xү@NIy+DPD㵲\i.‚k30E@h ̸X\!͙  ͑`;.ef3s4 L{wPE[K_{  ]UL'~4iB-ti_zkaA L M4,*ń&ClگwDǯhW{مly}ޝZNi鮪tQC/_M{OcT_~M_ئ_tu&;} ᄾ vD'i˸`;o..'mwD xDqE7o-atM{>!׫IjZwITTzq@mliJ6%v: +#z68mb#}:"dAN&)r$ kqEŻwtǧtnz oPi>Pza7d|&l ;KaK w%u~Uǧ M&M}Pka?൶߭;[|1zZ~kNz4Ӥ]W{MZᦚp+^Xe&TASh ! ߯^ U kJiM]dcNMSLa`[HDDDDDDDDDDDFkBBza?p_4&=!0fD!hDDDDDDDE_k'_ompzjZ|__j@L!Q-|C=ۿaVDDDU,"z kD꼡vNqOU!7Z5~a޴ַڧoڂ*ߠi 'PV_Ꝩ^ч' +kVW鵮o+_AV [KKxa>h9 UN)[c/'w!a 5Xkj]*q{ $ .I}-nK҆_w_G_胮*i&0h6i5))4vڎS4Ӹئb:]XbM;KInZWNޫM&]$nm4TAiZ 7{h< iVd_"ii/ _i Wop`D! <4""!n]" a2 *E` ʀNM5&0 pTfE}iޕJQUq$pB*"")DDDDDDDEydd)6b";"~wC4d"JTaŠaC ӻ 030B s" !5'38a` &e &SSX(KRC2]A?)u[ѳ4[vYEo=4,&zM0L& +a  Ała 4yo^կ텸kix[U0Uv.OUMoމ׾ +O?k{ta&VRv~;@݋i] ˷5$N&0Hۓ&M|'V8M"nK z.މN(7jiXIqm&'^Jj앑=@N%zvo|>’ӆEopGjﴞ? ں߻ .+bZO 1_Mo֚aҭ|7Ow!|z~:6Mi^6p3vF?}7j)0V M iM}WVA-~߯\Z_wOjh}'Mֽ\4Zka}=0OM2Vh'j+ aBgm׸h-p -R+U[aE5[h0 """"""""P/~߷?}Tj~\Be8Lpa2&M4HA4B%DDDDDD\DU /˪aI +?""""#%un}=~*٦DNu| _}wע1$uCOO ^Hi4G^S!\5L:_~K|GQq~ /a.^AZ~Q6V*Z$f]|Wi )rg%}AkKn>؃֨;㿋׸>M&mF鵴]7&iH4]4xN4kTv^T'Ui5iꛠNt0a45T{XiPdck_-GU _{Q0DDDEB"R?abL& NpB A"P"""""""""4DDCg/$$ޑ62 9;=U3 gj #y0K-Ō CB" + L ¦ 0馚DUH54'iAADL9 GXMvm&HNNh;Ou;?Į7on'^Ztt~zqjoNxUE8%~D u vOạ.fpώAsfFL53A,'_|Dw+םUҊ~t֫OK_i`(&})Qv~Lw PiOjDIm]ml/W_O%ַ{vWŵ[_}, ! &!aTF P4*fli < g`h)"#.`EȜmS"~#O5L!ixUOj&tU4 & +h0Bqh0!aE+knjqh#9RP}WD֚&;M{oz]ꉏ(5Ӱ:Ն^J]7i:yM0N(' NӺ'N+hu8Imq _r%Պkq[N}m+] +}TTZp-SmO_ khXM?4ixii >qTbh=ƚivZiVM&UU*iTH4 8z#V & &HpL/ \&T52+ר8hD! !.O`%akA"" aC +d͵ZDDDDDDDDDDDv~ \LohȚ""蛅*h4&&EBf@/[g2/E 'ܡ5 `L*k޶xZY\wr*9әWwÿpMn]+nӾEUQhO W)/i͢-fs8ϳA3$2@r1E4D3}CZ3K2 Ȥ}ѶfR# !/ B;*$d&}(P~MPa ` + ! A` `Na|0A !`A>/DC3H<)6NʣdA%%YDEnv'̨5PF!HDsxT5_MVTuMiT* ӴB,;Dxdd\LVwAց"6B &STAv\u5u=Ɲz' 'ȯwO *M#TL&Bi[ĚwiZj_.łO/AzDl+w7a(Ah4A ?>L%m0e"G A0A PA? -Z&z굛-#xkŠ40[Zhɿݤ'zuq?M]4wzXm|޴N>N&뗟&wMuk!HQ;l$N6iNȣu΂n[u3@ Dh0At2'H.gH֍gKhd6THiigi/BjjӚ [X}tӡU_A!i0X&4,fl SAHh @ 383aQys(ah0&'*'[({a]Z]ҡzM{׷ŪT(!UL'a _n-<&,& zv!- 0B _KB%zۮ~J +^4M]_8zMm}Bj~!Ѓt"ۖboA/NMhˋm*h˾EIuN7k׈U/$VPP@ nOul27"n:M[QoûIFN )vNᄓ}^4,/"8Izt+Dwidd_v;YPi8dwpC"D߾ `Od[CuhmֶF_\oᴟu׶%R?<׵G1߆5׽.Wfu_Z[__'}kw|/;l6K W~׭OuH9WS]0EtooX &˫_ \av NLFrI_|{@ m=_U*?MG>+ +i'hw  .5zi?N>ֿ{~NuG?$?Cxi-]1ƚM{z{#Njy?"QM=Ⓤt k]Oka5m5{u_m/sL7:ښvk h6AӮxMU7^' + MS % + C ?]]]n+NBp "3A r5otqKW{f;unKaid&a0GT !aqס-X:k[?j{b,5""""""#krW6a8i4pMoINMxc Bևi>Zj4M7ATXh 4շJ$_ANAS] \/کֻU[M5ȃ>i:ᅈ&C2A &qqa)0}B-5A -ޘL&Hr({#t"+DDDDDDDDDDDDDDDDDDE am[DGiZVҊT[qeAGb`W;NR A + ”(믧}5_{-@I=KR(ӵzдnϲ2#B+/xN*.B%p]24®믯^*<(*~* 2߯f#Ԃ fBL$ hyNDA97B:r,ŒDAĀȜfc8fdd4`ʸ̈́@ё03 +q zh(ATAL M;T̒a+rXv(S1"7d2A EAOŠa3Ba0 M:]5Mt⾯AWXL a \$i֟Iiici8zHk} +5A5[_[D'y~'Dˋ4.۰ +[U]Ů-j+;ԻӸpȣڗmMNl4i7UdlO2QaN;Rfyu$2\ty0\ʩb\"#_' 0Hޝ;}:_'w]zVL^?uVM0B 0!gg hAa03xP@8 AMY :>F3#\KPE^-t׽SQVm : C iaT§'50aA;]0ZzL.kvgd /zRhva>}ww>[[v酻 _ D[Z $qo/X,*z_'wD'|"PDŽ$NN&8j\$=mv5ˍl;I^Ŀ'WwYiFzi N +Fm/اդ^Y +n$}.µw^yzi8W WdHtpd[mz?KN-GkկkU^;M kﮇ:KNu^nҿ_{_U]I}n^Kװik~p_H^o[˫˯mz>Y$K-#_N0aC dא__kk_~c +{KO銰_?ibjWՄSMkMؤ_Dc'߄F?b}n=?V9n-inUNM4wMSiAi7M:t٦&~?ON۵}A ~8axMnOi AJi?MI¶vk,wkA/iޞ{mZj }^V]FA¦l&_4%_oh}׵zA0ߵM~0#A;L&M -0A"B"Lm.66?O{ &ba+^&A8~y_T07_L&[( +D[ݦƛ% x؇a\-KX_[~of"@ V""" It|R~ij=+jM}?Ba_uXDE'n{WM5w~54iu'{n~ AiUON3)a5]m[4i״}T&Ӧ5Zt h0@ʢiJiNA˰L&a=  2Pa4d* +   a4l/dqx"LІ +~""-,0B .UKj}AZXI"Y3⹆<(Ym+"((N§ !!jMN@y]oNӭ^eqdTe"Z2ZH#ܔeFV+M +!L)ڡ Dz?UP& ${i75sO + ]WROy5!Lq'e$ >[S +}4JU0ɣ:yFIPu% z# Ar@4 !]@ i4vV}ê"ԃ AGVdAxLSInݦ}3Kب*+ ӄiMW}6Nv &kdWM4k{ ]K_sW{W(l q}-ii`L&@8GTc_np_mMۄtۭMtS h0B 4N !4De24^?"_KN*n¿޸i`AB, ! ːqVMM8t bl DDDDEpI :zA5 &iA & ?ktcXԛ P}ծ߻ +kOim}PA  z +A w;M=S[_(wA^pJ^DDDDDH"" "!a0C. 0atTDDW"""4Ia-WUiT80aJ#MVZ0M^Bw:" E)hq(`d§&2[ T­L&k%W9On#;`[2i_qX&K) jD)'xMn׏S'JB 4,()l94`zT SӾW[L<HD6CdY4IT~_; )|2C50 r' @030 .g Bh36G0:h; ȑ4H50AȂAFN@Y8"(`@A!LŠa0h\&„a4&תO:O/,h;٦`0DQ0i-Pi4C w>kTjjxA>;ޡSZvMt i;_87e8pK΋_L/ktw7l$NN,0PoOv4:DNӲ+Iѭky|qo8'v'mH;S+'j앵~ZzW!'W 3̢0d3̟0aL˼224 mL2335(~>o*'Iޛ 6׼:Na4zeڻ߯zoWXCo0!a0A +V&N29 An3F`.D12TAO%zzz;VKcEa4w,{ ,'xO `'q` A~OUoB<~ӻMR~8Un;MS 1 J}W^7ywy;t;wNnD=\;M?|A']WB߽;#8+ovINȣʁkiDr8z\==ztF;ivݿ(_&l' NVB;ۥy|7=78߄J?P߯'^N{4۫J֗tNt_t_ޗOq7w}~?,w[ [ Mxm^1u "{awm_|_=}oֿ^צ.I]+{j 0/rc ramvX"V海m{Xvm]>6+ӯ޾o_? ^ȗnvM}էq\ߨD' '_aP n84M6tv*)ئih&8i:PE_4_q>N/Y:o'(齤IH?M0 A馝m'tT״Pku2)׿_MRDЃ OMMiPkڑTӆ+dhAPA L +_ڶ k׮:ݰݭip"_&JL& ' ae " +ZRR_J?kŔZziZKa;' L a2A B"2mbcUb{մ Oq_P>#҆;DDDDDDDDDkN)A;w' tiqi6jҧ0NORvՄ(Nt`@ 4)vNNMSԊ8^aPa2( &Xi?Zr(j8"L!h3X"XAB" a#P @!M80+M5P Pazi#&Y ʬGAaVDDv԰G`yUGcQ[D#.gA&&թvPh2-(T PU;_?XL>ӽ}3WZg`k}wav4&Zr,vks3zn"L\" PR|*SqdI-h /Dm +Dfy\ f)83[\ԃN"R\!'tfy𤜅#;#VG%7' +ɞ_N ,  0$:v(%OxM>[Mkt:VPUOT?z{L?/N.=wL.ׯ _:߿y1;7_!y4o__}C8UI?+W4;I\Hu1u']4UޞGuO`h_J?ﯯ /c.{u^vKo7kk_$;m/KH7iTǽ}}k_ ;k^+?K]_m{OoU}{ /V/NUӷb[=6)5_=vGU)kuq}DZ}qIqXMmM;t-< jM?v\vih5jh4L*u0i4'A4Ot/} [[jUkփMb"'hZiva~a{ }Y{iX4_Z}}*tӰd dna27_tD@iCA ʀ`2 748AŦ0Bi! .w&vӴIZ&?>>kT]t"OE}zAi`ttN: ` {kӵˆ蝿{ymdq $'oz'5o'}-2 +kɄJ +Kn;eIOɻ 6S+wy'UMnNkt4]ON34ug@@"9aAf#hH31s1"$E!@ȟ.N>ld}6R7rWITl& 'in*zzLjBh0P~-SMxP,(!aZ 0 + ࠙s3a(%d_fZ)zk[?\k^A׫kao?uiz]dq5 /uO_zX` BԄֶ[I~u{[~_>q/O ӤK;#i|~r>{ __g_0P׆~lhkWګ;izlU׿^% N;OSkv]{Ȱ=#jD=Zb=4i 0M&H:i7 UOI'.vixE;AO*/;RiƷA >q'ZiҽSWMvl-xk_[+mt_Ɏ-KpMa7MTӺޚa^[kiᦩ0Jh0Dtߚ/a~Jvڶ^sZ0-{VkiZ}ޒpMVEׯA t RD0DDDDDDnk{f/n0¸"}5KuEu +DuikpM4Lg&:a0DE +slDDqji_Q x> Ӱ/I*-'Iu-!0)a*ЈiƘM7N5qݴjjiJݷQCjUq߳6M*Ni0N:m'^ViO}0馃;jK[K׫^oKm~UTմa0;jtI-m P0 M0C4dM4S,u [$8MJu+]Z:M=B"""""""""""!DDDD8hD4'6’A뾗hDDZii*I.iUqWCl(PgdԦXHd@a~".Kr4Sv;D0r ``NԞӯTj<^ww*|v9 +AȦwZ+i~-h=?_MJhD<α.Yzȏ$<߭*fo ~0B a;6(A0>r8DJs4FlHdmPi3c6a˙ eNfCi _tRQ~Ҫi4an, u +a4Aa [CN0@ذMa0A 0gCXvfwzTפi}VmvvBMS0]'r"av'?v\;V\'im.ᒲ;Iz'l0I6ȯa"(u $>R7˾ݢqphCIYv$]'pK.(uۯwN|R~x놟JՆNuےMJȏtNa|1]n[qɈwӡtp&o _-^<76}__).rC&K _ Z ;t;}v/[w'M].BB~__v^Od4p%V$u,: †?i+G:mic(v}^oo_:M;N{ a^{^}}7Kk_O*5cE;?T / t]muV}&8[Q"_ }vZ_"GbOկȎ+ PjvQgЊC 4QOi ◻MZMOM?wcNul$}?RvM h4i>Nii0UH6+ njԩ F^.EpտZզ{NҵNu.*R. a{C  i4~GցE S4B!ڠӴkdoڊ""""""!DDDDF DDDDDDDDDDC(p!LaZjaC E0C-XE0 Pe",D;+0LBS +e-CM0 -4DC -[[1UJP+?Ӛ{&UY\2! \dWh;ҿwkL(R@  rvGu_IkPaILKK T |*C RDE Iy(uIv_w<_^h83BfA@P ״ ")f f3p"C +f=JD2@^ԫ|j+#;m&_uߥӡx·z{_TT0N/Xa MC M0BPNa>^㦟oOKJOخRc CA~h5]4ﯦ„h]ؤ}k5.Ft *bwahCpIkխrq\0k-Zz$U^+ȣ7&G[ aIE["ujI6ZADH?'HCW_ +_#ed| ߲pxA޾ j '}ݒ^#U_,G#:>N(_eTNֿ׾v_8ׄJ9:L7斁u*_/}v[59 '_hv-G_ nm/޼Wa_X=;h/צ_.׵8o_0oJa}a ^k|C{`°{ c% _[]{Zq.xcDi/km,ACQuJ?m{h>ؾ!QQ mjLRkkVjAiA 4pGo8}V0n5 w wO݅{׭W/[5L m&MՠoONk65 i .G4 +kzݩC?kim uKMimk}5" '[[MSAv +AA>"#4! @.5#' 0Mj~޺ᦽM +xC0 !hA0B!Ʊݵz? %گLC@3A`: &DDDDDDDFxM6}TOؤV4☭4۵ [JDDDG}=h=ZAz4ӧӷ=OX-$Hm12PHנJkզtM& !:qˀE1paKCAMSTd੧aS% $a|DDDhDGIDDDDDF\0׫Z\DDFVG@D\MHIDR^4զCIXTj"l/3&Zp ʘ,DDK@4SP8.]eL(& +Ph5SUmcIrlS/vK%wjuQW̃Bӑm_naUa0RPD&Op￯Oh5M;`u̕GyDH4HZ0"2#ufAe8d8"N|}{@SUAdD<18y&PAo@uaB a aXL!a5L Ih''(2x5@4# +h0\>)Da4A AXABA +TеMU&MIդ;-4аM0MPpj!aBi~]u]SB~ô7n~J}6X}m=OB$>MrqՂEߺN'wwO?I/{Wvh?ywTaI'+#r,RmldqO)>kA RC#>H!o"k}8uO NႴM;#]jO=Ei;$zn 8Zk\&׿q03A@ !aO1wPVnCUu_ tJ8L&Li}H Ny9w_ _5_uzn5ZzQ\_a BDv8}p..ݢp֛K!DpP /&FzkjoOAȰ#AE~t_i&Oհ[B8_z0^'% <&td}u׾$?nnv*K:֓{y(٧ WO?z/MNߧ4ٜ{O/l-׻޽]VC_hw_Vz_]{k// -{mWvx㴾R_?&u^׺i{tiCHDQ |:^UիXaXMk_J;խZ>MD54 ӊbM<&iN)M7ִ`=Tk_=Qawӧ NAMچa0^ݪvKޡ[ 66< iZkm4醪M$_M~¬0M02nL*V?߷j>iiUkLu';#L&N0M2 *> (p*6a^*^^VP쓄i4K̔&CA,aaVKmkvAOQCWIvarbDDDDDDDDDzLWoI~"?v 'JIiA-i@ؠӰ ,4M> ں,0B@a Ae:d4 ࠃ2v2n&8B"""""""""#M،'lњr^2ZA!TEL0M4t %PL +MSUP馽-[彭'^:)AtܖJIV:gkvJ}ȖxIWM +㊏ +2a3"I^u]l *uꫯ믩ކo $ B 2Li 蓑^="F2$# .flR9d쐌G|Q !iygLh8sӴeiw20ܩ3њ\ܝ2*hD<3"ا`h ! &Z !ka4*M0umA`qa A /U6PUMU{ kO}g_[ wzzzA>N=whrO/<+D/OMzmKa"Wp07R7w *Ӥ#Ԕk8fQ꺦~kv?0B4 k_.n7t.蝻KZ''vvF>\C7.;Z'LpߥM{p_ 0/ޯ%2W'y+. tdq '.8`Mӆ 5qDju B, ܞuWc_7;' +?~ޛM7 ꝧOI׿ԝ%b?X/wɏ'Uk[oߡ֗+Ij'?I_m? WA~ۿc>/u _Nw}{z_W!C_?iw__{U~AvFIښo~i{4]u^m7/S]p׆k__/0*׷["c+ me鯿J_ث}*^!u`+ $DZvZ?wbDF?˯/[ooƚiiM8zm&bzi_{ZwWlگGwM״Xa44t]&Oh0tiv¤M{amu7VZ$]~IYO SiI4M=v? kjamxjZa.޿~RD5Z5{[Tkl4$8]0[NԺ]&"""""#Ic h>afO%M7V =O *EVڧ2PS) 8h4"Ch0B!"" Ј4鶴Xa(Z5m%Xڱ_=@ Oڐ~"L&t0M&IoISMp=8ROU醚UItuM;j 7&6M4 iaPa5#uN^a i>wi4Ү"#'QDYv# ``X &L0Zd,2 8KM4Ȯ+0(Um}4|DDDDDDDDDDDDDDPBzDDDDDDDE$Na4C 2iU~DD4>ҴHiW*-6[zJ -&aDDL\#8&^B \+BdR;gV Y%Y=Ȳ;n +0)3 gMvT/몤9nR޷pJw;*OȐJCev8Q# W}ibh hL;ⶃ +z uJn8hZDA 4" h eٜ'd3h 4YȺ(E#$vJ7%&<ܫ˶"qt݅M? 0-0 MańAOB03ⓑ0;0@L<&N2s(Fpϒfkk%m뤝]5M<*5a0aXBa N.@ӈaB !ih'_'KM}]vƓӵwM>;[ӻoz\0_rIA $O:q'wDݢü;'\zo=9:'wOu WCu +~#V޷P}~zpޓ]0nJ@UNqo'kȐ*k$?+&vkPE_KE_' b m{_vuTVk ӴV . /&K }Uk_5 +VU8C8 ?O[; Vh;K[`^L>i alJ+IݱPSMpWNűl5r%M([0_A aB"8NM0M0FM8uFջM悔 4{iwC a:TN 7ӻQNnb >һM0 )&a{AMlA_ j4kª &_DD[DD0DD0iaKaZPM "Tӆ L&0L&2vN DDDG""""""""/]&uN1m%"X2hHfq( jK jUe, +S j__-OT%N&v;XwwxU5fK>Ӌ*=m;L_}x_v5׻vIFʸ P˲d@Rs H"|L9naaH@ҐTg6H @q4 f"}dr%ǞgLf\`A0L(ACp-4~H3dq aN2>2gH@τD0M;4a8POPӰj{׿4ah4,&XL &SM8ꅭz.*&m='}A; +8=5DnMmz'n]l'j]]JH21m~<ܛIwDv>mj'8do_ڒH[#W0338aN" <d񘤾` o Q;l$m}~%dT'vO}.߭Bk4vPMSM8CL ?J߲Cd[T7J c]_NimꫠU L(OImjҮ ~zQ;ÓŮ7zy=z>OO'.A=60ZZN0I; +F/2h :.__{W~'wW]M%Bt;B߾=?Uu߰t J>io*7|Ӫﻅap߆?Sz$'V uf٧h/͠z _ׅڿB?*6v_׺JL0{_V\{uZvF.꿵]C]_{_l/0* ?bK}.ٹc+l}bSunmz;Lv6گ_74ZtO| ?:{KXa~$.j?ؤ>M=4iiߵinMӧ_ݵaOM*+ ;ONMMM4M7Lk}^JfT'iv޴jWM0jM"1xa>O`ߧ]koeN>ȣi%0aPӆ3a2(`0AЉDB""(DDDDT=Xbc؆x +( A:MB:N"" CAt:iI׈˒aNtWmuItiA4 ׵(U? ZA"0E: 80 ݄LiMT1 MTPb Do@PvU,US8E< ܶYژ7 +L*aBkB+#B[MWCkovO-Ģ&6i\wԃeNWvQ@!e# 0ؔJc8et aMkP + ֵ*%=\/]v}o}HE%NʳP<'F]˲w~':JEs;rEo"2@fy]!' 3 E٘ai 0g"0,!aa4=7OjEQ3+HŦ&`аZv N#'w>"  B`O~z蛿~"N]~7W4Ӵ\iCE.W/&wp< ߤ~A!k:YŮqp'v zpSnwi=[ԔUòCpGM3pː hE20(2Ah3)# : +td$Bv;dWu[;';Mm5M [NBa?&~?\X aZcm߆?,14(AߴOMԛ;]HviȣuMm=5N_i$9cG_/^#r΢l=q`*Յv+M74Ӭ4TTMZMSia.o_kkItکoO{ZoVij(_4id0aWrv5ik*ڰ߫VT[vUa5N[0 aA4D&aдPDEl!WNm;QO ?Hq_sPIoDo Z /׺I{][\PD<!< SN)9d\O,ޑhD!K`3lØuݥh<@'F aḧ@`LA4PMBiqnwA @44hA34-00 &ӻ?j馃[ +T!S⾝>PڄzމhN)ofZ]S ^/{_V;a"wMAZ.]]rBAkSꝘgH2ɄKLޓ% &N+ڷ )|MtG ', <XaAń.ϰA d y\͊B!eZ1>`s:5gB)ߒPNM=;vm>MN{v жF:CҶN^;Oև}M;0 00M3&^AXL )D`iW 1 3LzkJ}?O߾=M/7 ֑!Zi4дIS OMBa M<|"O V6ua o.w 0^'}7Okn+YꉻS;ƺutLwP/-'nH![JjG^[ ;"2ZRtۓԅQ;aoM/cBˆ>.ɋ|n+i> Cdߊ+dqtl:"([IT#Nu:~_omv?2sW?V.Na7>i[Ju_~m.h{?`?@KP}kVh7:}V;Kao\_^rH-YuZV׼-{f?z]_rZ_{?_޴5_톦ZX0Sio_ПiZ_a.MM~.ͻm_`km_zt 6T6v4׵mm{0݄a0' p -U"g_bbKݵ+K JtNMWm{]u vi'ka aa"BhDDXB""""#Oq__ w~Aӵl-Pa0 i &llDDUqaZM4AIKƪ .-A` mb""""""".k}[tIm'm&a N ~ }Tاn*7M0M{]l,0k_XMZ +T40]S8]hDCB# a45MA;) +UQkdQa}{L*:"""""""""""  B" g~GS$j ZqK8qaN¥ޕ~#^$0 )A=}0!kB[['}F;iOԊ4>^ __@A}~ iנWZ{t+nx_-c^=ץ_]}עca0Kl?op?q&_^aKF4#V~5 EzD($ݎ]]8a5. zh_Dκ $qO^~^Av"Qۈ?-_b l,ZqI{I|kAlW kHMOWZNN=6)4MM:vm'v֞i[>jӴתWM]޿oKnht{I5ma}WAFw4"TNMaOӺ_;i_Vi0aoLSTh0'*".LC )Ј1} b-qX@/ >i_jJ ]i. 0 &# 5 0DDABDD\F\za>N8⮣c_XV88l-q;Wbu;Qkv;TM a4DAASX&Rh0OM=8ߍ(E<$VET.l=\&a5VM4m& ޚPaQV"0T]a (M0'"% L&; 0ݒ0DtݯzM=;O[P"""""""""""""""aP0Bx ! HpAW b"""""""!6K~l04#5hlKm+;BѤJ.AfL' i +UU +6gc ʪpF(D>IݢtCUM2G"0`S(w"]L%3\I.b:B1aI̠`4ƈ0A<gg׽]2UȔh2Fl4hC0B„T` i]{_PP`V8a0ST_ս4:M5_OTwݴquCduF̟0yHn:dkRWyqM>ד{[ Ea\wI^ ߿+ &a,<pc"A 2tnr:$#P?(8G?F\ADinOR[R7ԔRWޜ2CJXdoxM4pav!a4h0Lai@a|)V ai#O a4@ϊ. +N&& q۫T=7;M}ni&aOMA T  tX!a]?5 z'']oi~MST..^4c/_jk:27m%18{މ 7i6A;x(+auWK0cD?ONK߷L?'UCw?{Cb -aqz}l[VqI_{uտ]a_WånūM 6AӺq_^.]a/U,}jO^Ii[M4խS]zYW[uu / lZ"xkPrw5otKViֿ^Ӵ„L'awP{;[ |mvH\4~Ҫcxbc i2n&&IZi"A" fTRu'i WZaDwH{i|b" -밚zkAӺaL ӊ8viA4M4 ЎU_A3jiiCOM44ARPA׈ C B 4L'i׻ aSA0O궽#G!B{ N@P4LA4Mi$  !ڴC+6X0D*ԈW(|gk9P +iE geoiyYߖ;D@n@wtdqޝ]|;%WӤ">_ҳP3H쐍5_7޺+ i.Ղ c a<3 O" ÙOvkdIF \pXOh4i08P]O|(ALdc/ h0@9 aNH"|? @yM귧iߦ?Ai +UP0C B0 wIi~]N:r?a0opZJjOM4YI㮂tzNp'v:'㵗v +]/' "vO]S&?0A:>Ւa+VAvEr+iӲ8"Ǿ_iwUk}}x:>;OoaCd:Nm0^iuƵC[q}eIד_(֣7v)(Dk2 Dt]- +}h??_.zɓ׆pQ+ f21 eh0Dgbd&v&` )"o%[Ul00AIzj3 *a4$ ׵::y:[aAS UPz~ZVO\4U*"?hO% ׵TAN#Ӫ%nN__aRV&vn9kW}v}uhK}踢( ރˍp6+K Z Sﴸ`L0{}ouXauۧ6fHt4v{n XiبX>*]WMO ǧ괷 Ӡiڪm+kTKXtwխUu@ub~KUm44JR ӤIڤL$8qM]8nPM5`kدݓ["L al k ~^i~ӦMjiiZᎷ42)~ЌpA0;T@'4Ɏ *jiatk a4?a-ݲh*W޸""""""""""","4B! `O~_+``'&;A?ZU ׷aid`gOufJAqBk S- Xʾ7i_TK0?P~ D k 7CgE 7EeP;릁kao5Vt^k޽zZTҮ}] e۪_hμO-{SIBHjdYTީ=3KO6""L]顜i-\4& */KL-vwP3%qD&N?cM +kB+Pc☠iAW 2.a0 AUu{OUl'v:N;WIk-0 :&>M4ױߵPOBЃDRlDC>uՊ]){i+ wҿw{a;##]MQl{iu_U]EUUJWT@jLʍLD3Z6مUCIӥ, 3Bq`6&4 e8H͙ x'$P>-d3q/(YDF"r;-Vt] 75U4-x0Ba0L `0U "?pf g`( "w/ 4Hh0@νb-67mɏOcxM5N5a<&Z jaq60A{/:'tN-ZOD cM5 iaDDl#O|vE~ +I蝸Nȣ;$N'p"v͠n"15.˾NMH}o}믧au~] +;O/|6N-U6Oz k+WJ;X1웄l{V_?iaJ1zcNK;!^M_i/AAWU֯?mw}[K5aZr4=ZRz C?c+oݸ/k. ߢQt%|=د 1[_ڂ*f"VNW OZ_T=ia{M~Omm? + -v[a}}P_JQ~;[[:Eo +?m-`Nk_ (#t[}ctXM4M6ka\0vkbjrMa4MAmGi jAiǵƞuwKM{OMTӺӴpk65q W\ &8MSM"Qj &aO!ikM$ZNDIyDD2D0DO7e@І,L'a:B""""ЈH820D4">_i% %i%IciPB-46\$j"!&2կ%1ؔv$T2y +gBC5KdϰA q(L NMIA `.n, heANԍBnMu0A“c 󷉈#*ZV"a5 +uL?ދ~d d@2(ɤgFL&apL&HaIV&Mt00h}dDo)oܓzҦcD}]7Vlt8(xOO8h4>C ғ )\luekRӦt'i_I'Hz0_n0L08fl!\r Έtk8zI*~/}k'i!D0| +:h\ @A>\!a =Ӧ5Us@B=_Ak PA@ 4Ƣ[?p{W ldhy +AiCwmvûhz&di¯Q6͌='"7B/"%ox! B-[dWMO\n>j]8Va.8w}}i*&TE9izzv%vO']vG|6RO}6Tyv~:_}Q+uMm:;۫N$!W6V!.?pm]]7$k>}F;Nkfr>+ u Qݩ;qȰPN ֣ /0HBMoGB#_Ȅl1ID`7$O/\&bB4'؄/|A]v턒Di}O߈9<~~}>'^ҧt*KZȂ^ׯf/afwfviJq~onF?ߦS7 Ÿv:[רӰ5 GmZXj)$_a )G]/)X5Ra&)׈v* b@NDa}cد+P+I:kEJHOSo>a44ƫvj==~40UkSYՙki&oKkv ?5Mv5zJtAa7M6cHbaM$m-+)5XN%_aA>ªNIիHWzm lWLUlUqpRp0Dt"gC@pAOL#_Aja-a0kMkLV*AK6 nv4"""""""""a BR 82(0ii9Æ""-4Іaq  RUީ%QUL(Rj#4aK7rLW;TXn L45r. Yǃ5 +}¦RE)HF#S-32 Xd*ꩫڄ([аFlpFUA*a0(PPW!G6v +NjJރ!~_l\4!#r-Dӑ;_p&\]Nii,wȞwQYW돎7Xe=]q흻"jӵoҮ8]3l 363'e d(F 2$/3UJͩ'+ֺ߮PBkM; +ń00B >˴ }]r'5gg'eA˲(d@rzA S@%§ͻ.eO1'dr$2]~iLM0B4wA 5 +!a0| 0G 3Bfے$%ȈeTαqa 3fᓣe4 dg4 ` +~Aax,Y8@,3C"LL˶7DivkwiMo& ã`  ˑND?x!a% ;\Z 0Z &ipﰟ}qIޜ0W:>;DyGHJiN,)o}qN{z|1,&B&Za;N'k¦hk5_}z/Mt8i6ONIF4M$0H'Dw|0̸hMUm~UujIq KrZ()7V.Neu__ F dFӭN4k}~I_OWV~݇ܛHvhD≻mryAp"w6C;-tjFJJ6’J1}W}<} _Vn '`;mPwl;I/N`A8P7nɮ%VoomAW11%uNlm]Oׯ^îv׏ruK?Bz7*Aq [/[o֝ߧ׺}p>O 7Өu*Q['[ +/]v߯O_]tJ=_ۆZɗ6_׿=?ڵ[a5mW~QY8fJ'Nd~NJ?-m׿ݴCo/F:' 7=4|/ͧ~ x뵴{Ӱķ+Kݯ_ +_龵ھftOiwhkb54 cV\bR:~{j&ׅk}uk__nC zM0XNtiNkQQE;>Ț!ޱ&wa/o۠4_֟ "=/폆k!"-ӶjpMޚh AM'jӴ 4ثӷ{J$v_T@׋v~FհQ0k -S4ӵAz ]4_Rm'OM4pA vj-պzmǦmn~&B)AM4AA5hD3NLD" L a8aBaPi1Ul&]ZkڽZaTiOӦzM< zt-A Nӧt0O{ODDDDDDd0DDJ42 0GMNMN\j[; 4Ij׵PM5Bi: NX0i02 ɹRJDE&DDDDDDDDDFL*PݒAV8fA0A"" ʑy7aA3Dt""Au(p}/Z5CҾ/H_ID˺_ Wp6p^a:·<}oӡZ_/iHHpWW]R]-Z~7N%}xݓu\O4п_ ?}[ժZޯW]㗯oێ=+@KM~!}bW_uB7[׺K_u_IMu\ 0p_vx\wh.!:߈_f?'I"6_no,?BɎ| BVO[{]ymN~߿u|+.# ?_:Յ{RB_>'O~G?Y:AiՂ8uO %m+mw]>j{_տN:'])٧f ٧NKﵻ_ l}TJ{ Kv <5a7xi{ii]k^PڻikJ[wlVw{"_bH[j>*+nak^___aKNOtM NMJ iGmZW}DR$v+{a.a~=]{_ث/wew=cb鋡6M4T tiiڧ M&IQM'H+D\W"[m/ZWFt &~bdhvU 5;[ {MkkM4&C]=[^VՍ4z [IzaZj=m6"""! +NrDN@MBa0DtP' +diXiL*w j馴ڊz M:tMݦti Wi»L&j""""""""""""" 0DDAa a 6;w4t׆aS"W^4N;AGAD&4q 3X(4%jiݦ40  +h0A aqDDDDDDDehDDDMRQ#IttŪuچcS53[d;PL& HdT* +W5D;,9Y5ꫪ̒&W+D-\%شKR0Pa{14 … Pi飢p4W;몪믥G2iߨ.;;LʏR s!MiWJ>frvAW%tm\`p h`.DQȁfy%Ȑ)'2'ͳ5ɚƞaHqk믪еUMV-4 &X)AaaC@χ@h3fmqa3Lg.Gyx pg "#r25%"\A!Љ )#tu#y>]h3`fस'~i5T*ia0M_L!a0.Az  3 Ԇdm,dU82x#lf{4 drS8&  aS6f&MB &A,!a5 .tN' ~NSCM};Otoi-0MaN5`!8z !`!aAŦSPa`W +MS d]*IIL)A?N^^ˊ'NlƉoOa7'MU444.[T[դLwhD'z$vDCxN\NwNl&+%bYm龛}h<*=N]ŭvG mۗzH&mRt;~_? i^ O^}mwՑŤNpv8AݧM0oA7Nv]앑}$oGW]?N} a2@A3-gH:7iM5 +=03f,0f Fm2믺o*W*w m4„&0BL.C5E#:vT" HfS$Dj42|=dtq>3œ` 0 g g̎4 8oQtpatBԴyNqH9$lhL0@ Bx `S&N0 dA -8:8A ¦]l; 'k'D'nLvԜ;A 0A&Z,& !a<&ba; +a …5O~ C{d݂@ti`V0hFA4UnU4dvH8hk;Mt{_ɨO$uvO fSO_{V۹7z'L~D݅.'ypN!û (Nh'v ]}COn^p͞.N`wA=úOOݑ^m8uݎ䱷[ ._~_oƝ[(2Qy+j%m[ 4k꽿k_#p~]_KiO=>ֽ|?izz]/듫⿯Wߧ}F_a_QW ~z?𿿷| [ +U87i]_ol/.*)mm(|ZC׊?u;[__ڥoDO /PҿdA %߽O8N;Mi6* m_?[~.K_ a/M imXvNM: I¡[^ݿv_a|;Ȏ >}=ㆶJ('0za{ZVӴw Ҷ/6*V WmGM&N7M; A&2'M4, Jp8dw &M릚c]0jiMbmXM :iM7i4v[__DDDDDDDD0DXL q='ӶNh=4{^M55Mta5T5 """" oU]A Iªa2V0h2vEO@",iN + SANLɎBP:C+PA!"֚I +⒨muMkc-DZi]o +dj֢Jb^WSʢJf&-4Ii ̆`5^&}i[[NFޞU4_J#jٮdFUz껇D_ nTwa?| OOru_qܙd;#ș)5Uw5z i  PADϳ<d$ǘ2$3^qyih0A0C0XA 8M2A&H" 3Py(ahȱjw`^tltkԆNMB~h;P 8` " 0Ȇ| )AqgiK%Cd6TM0LՔ3Q ˑ8&dA 3`0?hN.omZO zh0Z52P(A#0Se(C>4 yr@ )@fx&0ËT(!a4 5O +CN/a>a"vDm;LD;.'hxOLz&SGXL 4a A(! "&XMB B 45O5O=}?_uWVIy+ۤ᧪)(j`]H]&x8T Zja5M4׾U]voˏˋI˶]'RoD~nڵCyVk^~٧dEG٦D:u""Vw|+\|^D] 0ka/ w7ԱjuUԾN>kj]?݇k +ׄ[vJ-5Nl+ (ZڎD@/-tBG; ; +Coᅵ9w -¶ >{4N>==Mc;Z-4VXw>bتi6JWw b);/H`vm]~]յUL ¦ ?iUiA[;;^AӆG?ؿ__ipS^Iou LTitꕠM05^  :i~Lzp[k vMդ&iSh0{N""""""!g 0BHA4iNL'v5L'i<4]}iQR 6 &Z 6pM6m*m5[WviZ)b""""""""! @H 30LiiS]tIa{Xij0;Na2P`A Wj aaǡY0T8&h0j \ 3TB"$ ""DDDDDDDDFG"" ah ./>U+_UV|SP`iS4E0vhQ4]1( +FyTIL&`!nCT–#8FFCddFdYyuU dN3 ӳl rb `{Pet~xt\\P0o餙{;"[0v nv>.}Z-_TImM6GaTuk)r]]7}DSWI}euL 3@2r +'B1f㤤6j ’7.u-W +  + B Pa0B @>3dN)N)8S8G#A12A1#l32k^#l Q1Af 2"tla) \ZkkM4B!jh0_&44,ap 50L]4J4i鬘==Bjڄ-] aX ppi33]k[/[OOO:C.rp—w qNȣ޽8lvޟuֻKŠVӿ_~Ww<2Q(6z6MNӺɟֶ;N_`%/-߿ֽcOkI]W=ӭmn1]_Juk_mId˫&9Yiz\'uc'7n>N,>׫;_M~_CODE1uUҗW!jrcFjk_vFO4:N({KؤF?#߶`=o?Mp xo?0/٦c'_'W*߫k j}T{k~kM5__atvڶa~/|/ڧ_a*PA4oDmanՠi $~}u0kǺac{ߵj&ح-X]};/4wL&64jT|i֝nK {]ӿ>k]_l%^_ +X6NijӶA= 4liluIGuLWjWeMՄ@tBi6QITSi0 (_Ai + ]S&V7MխM j/*)ݤ㤛M5 ^* h4M_Oe8!Jah2P 钅O_M~M0 tmu N馚w]ރN M{P0 *0""""""""""""""!""AVD40T ]4MRޚM^iaȣkڅa5  e 袓B""#-`_^ &N`X  ! !lDDRR! APB"",!,DDDXiqWKjI m\\mG +endstream +endobj +45 0 obj +<>/Width 2566/BitsPerComponent 1/Length 12>>stream + +endstream +endobj +20 0 obj +<>stream +x}rG廾BoK +5̜y4-kHjfk"P$jP.Hi>c?7#3mIt#Kfӄ٤1m龼w_͗>|/课wwջwM`&8h1Qtsy:5фqtήm֍#~ӫ~8,mڍQ-ڷa8CkƌD&vNe}d#<ϻ?'0 |m/7s0ߴ#.ih܀Ǣ&;A 8<}P}wxĶ#"M?fz4@}la>ǯo; 9+֏$ۍ׎쇓ƕvYU08,ӿ49ݸLi`I +NP!$oJ:=>c%<5%}} $چf[Fm(pqv?>n߯/s]K\2Y7Mp|b'~~~V7ao,ΧER4ihM q#(81m&${akŢkv|ss8=}\A}|HtV%dw;T3mr:k޺0.iwZ @%τ%Xq'xH$' +;ߕsƢIԦ `æ[FcWl' Wi ~w θr%٤`E"frH]N9ҨvRudPHt}\bHmnӬ~QXn9քYt+eÔ@A)UQ0XL8$JqZ SuӰV'vjwUjT1VB!=Jf 1(k̠}$/ц +ƕg1>ƲR^5E:q +=_=YF8:x%N864}mW>>쎕!4%Z&ѥ_LXo;?!NP$TQB )džPU!=ElШ!Ri!)! QBNSAد.u4AZKsA߸;7 Ay,_̂ * uxY:%$p (PB% Oւ%E^D ?vngTp Pu+@@fSmqʼHGgbn|<_B~u+Z^&<"ՁJP(dUqqo|%_ۡr(dI ]}NWI==Χ_;lmi~ U!mP>V:L6c]C@ޢ <"w ߠ|G| Jtg}8}^\-,qDo30{+ZRQDhR uhxA . +U&FPqLtEMW4@:8Jc0R{.u"hjR9U($:ZBMc5`NsnTW˘v;4ZVwHwGwh-$LlN`%!qRT~1*FA F ebi4U +3`n7\zh4(wP_ٍ1FXG1c,ѩTdHTC}?^2xHy`,hQiHɻ[rG3(61[&qaf0z`$8Jq }D ^H +G3m$qbt͎84rK,tDQ`]7nr}mtm/]U]aS(L J#Ii>`un_HgvUaj?,L7,&eB톜+4O*ʅ'X$.*u%^< +X0:@J! H蟟^s5 +ɼ06<07( ^, +NNf0 +,j}8 +m ,QN 6H.GcLrDRugK?ȴ5:f44"5J#opU-7(T:q TXRSv%CDj׫G5Q i%I(Fh+l7]1@tC 6[bUQweQֽ̱ Mzq[+oWw~B"q: VlXGWc]ͺ2EL+ҕ.!:-jDؙӌFtEqBI5 ֒#) +%ݕ7 nq`m߬Ȥ &.j>Y8axdqRNm } \4 J@ +B0^;Yْځ"B q,{wSg+X~ceEڂҩeU`'TaEIX*^ˊV P0S )l%+XXp>L,"Ue[nU.F+dbNTJDGPm/mUxC"[ c5/0C +@v5?PUJ*/W3cK[.X_; +o=$.x/) fL.iJ^,s}!U}U%j6M4t ` +F1H1H1УDj9k(+)8kk-$ XR,2˕P(֕I-1?1w +$Jpv43 R4ӋR)&*@"y%MI]ZF~9 +8B*53}'w*˅GfMer)W}5^"-='bPBXȃyZ(4[Zk)/adHJo`9}C&-B^h{W̥ejnmե<21׎uxw/%=bXwg_ac6oPq7Ooԑs xw|\=G%W8/#[xX4L_n_"h")y%U~˝xV,I"fQf{~_"ڇIu@45 kH]ls˫벶6?O \6f,_OnCjK"#tݜw>o"yOH}8W7a 8ԉ)vn[z;,U0*Px|&9㸵Gs<}Ú0eѦs{b%J@ZSV*,[f*fŁvӪ\1P꘰3R7xq .>$;X*иn☐g Nж M͚Un' +&)&@]G-l>:<40MOG*LoFH ߜWs~rEYڢsXn?y,&&j.'>O{K*Z|n7' lAqR[qLS+ +T%Ϩ|$a(z|+u+{D_a5Co>Ҿ߉Ϋlf}s4@S53f7s~ا]B$vHG!*NLH>3)bȏӃ< ~ޮ\t Wֶ + BQ ;[e MF1%Y2™+!Ht'z|1vW@OqrF;6>Х$&knk]urF5DP;\;9'f2۟! Efz,Zj w}WbŇt Zo7]#$H5Oy{#X$hr.'w_ 4,p™AZW ,A`ֻih2_Muyz|LNFD>f#~/>[F~jdEkY1vYMn/BfcWtp֧?/ew2?zbX2 v9 ]~t+QS9N5*3_'DfY)Bm^'Hx~w9ofi{P/vv=E\0 Y491Ŵ>Є;Ҽ^9=WR pJOk"VH~)H)&&8&26~*|~2Sb?t%DhHdjo<mڤ [/g +9Fy9%/5,ܻv]օ3L3v؀#gC||5M MIMIHTHnwd2:捅G<5Lh7N^IRh9?+']h͔(jM"N5oZ<)  F5t E#0E^xf"H6|), lL/{qc+U8r$"tפ5>l?vIG[fпoJjm u:׵$N " n,ZotHsZ |ϩXu#t DO*ݪ.[y Ti8ԑ!꿞EkrEh}G0z0r Q.Bo ) +49%'>uHj#eǚT|$m2=4@2H|8M`]XzH+FN??[ko,dΘV$3˕ 1gs#?hm7,*;XNi= !3]mQ !a iK"i +,$q2JrD'E=Y˭4`šM58`7=S)1$5mj"97<3Hɕw eiDL X +XuEY~t`$K[ d]q8q2y kNbK!qPo'N4T)OU&6} U% +BGNq>I"O})IVjgIt%e!a3^BT qHy`VRuvZz#bITIԋwekFfYZMʛ6o) ]>< m1Lx+M;S|EY%? +S&r mW.Ȕ[rٿ?}}ڝs tLӾJ%TF{,Gg+C Ų$f7N7؞$\u׃ +O7vXT_֝L7hV}Oחa9dA0vQAѢw,Zcܫ]otL;:{ +\rOb`:9>yvJ põ/@9n]w ގodyryBOa(jmڣ$Z'珻?jJ-Ok eRxܾ{}΅R2^ >STDu]oiL`;V? na^0  +8pUuY͘l?o6?qp,],$F&uOpt7|,A )qC"R\ sW}mI~fjz\yJpUJ|.烤9:hQ#JY:RS#an&VQOe,iHyiuDNJ,c$N8BJuʁ4&R'W]iȥ}bܓ/+C&T=ŀ )>##Nu9gcɋT +6MĬ"[?:v0lOŞ;b 1t=} bH$y@0"ɔg۔cqN?w }\)$1V]JD"oFz}z9sTƢ  +R{>tHqٕ$fM prGguMN-l~ h'#4a7g,y!oXףd7 9a*w<$izKOHZSܖWMnq2B;4*U9wڻCO$_ Oh><,NGb 4A owxH7(Cަ.B!@pP=[>B +CD ]nGJdxkyť1' }^*\Wtgz9XRjڨV +@(TyᰫhM>PItvh x?D`͵|i/,q];6HnD"$5z\q”${k^MqAH(`wFZɦ~?޽}ͻ݋g7^O߽Ͽ2=[}f4eՓp[z7Dsxs|=>.NItù[LI^=7 <;Fz]j̿6>Ώ{ 1[b/lkxF:מW99P瞶͡]D1O!mv +,:%8VJBN̏CRrrzH(z~Yu>9아-pJ Il,z: od-6N^*ħZ0 ]]P/ۛ,s8fcJ?2.4i@u + t +-x*~s}',_iC++?yΑ +"Eۣ]N)4M]h]pbH9_Op!1YD&⑁E1|7m;5g1; +X,ҙM?U/]I6|zv}3Fs'a,1}ʣ% yù+_u \ۓx~| $|MES7Xb|A}Lf,Qm.zjd7H]*\i5tT*9N,$_NGb1X.HX+yn * &&5e|DL<1DCm):w;"Q /!V?$%SC}N!.#872=@)`QU/U +ET${Gg-~c9@|b2>_8Jgqi%Đ˚P?GH.7)&@; + +0Y#J]-Z`DJvRؠr[/M}i}^$z)pNdIߖNt=O-L[ #4`w+g =!T':[< hqΕ$" ĹZ73#tgp-pjGW z.V\LnE yPye!#E0,NyO\,Ӝ8UY($2^1=-Rą>? Ofn-ĢlH3 &@YObWD)pX5sjPۯyF=b,8TVsϫE+yKɾ\䉑B>g0o{nWAR]cAK} '&;D@=}HMK5u 4nRkF.PrkIWąib,=f4kN\RhS6W\Á;1ѭLc ;Y~Q\6wZ 'M:ܠ(*oDz2Wޢ;/,kp\Ҳs} 2A[6Y˔P)#1H&B~W5.%HtbxL0]Nin7bTcmo> ASjó6ovhcw{*ErPÐHBi4*އ,'1n2N;ۛ߾^ PAeJMAߐ2+{(${L<&GQK*l˻$zia~~>;Q)888dB +3nMؐ Vs9qV8id`?AJt#ʛxUGUj3opOj^˩*=nt8dzyh'* +I=:$ItYlFOm18`y=<$;>{2T¦1۳MmڼIޠx&&_2u>7SKs h!U1}SH$BаMSG qhGRx|(Pi=". + Dye/d8t0UrC/z(ٺ,-:d*HRwg>Ǘ!Pn>/XObject<>>> +endobj +46 0 obj +<>/Width 2566/BitsPerComponent 1/Length 29563>>stream +/(dg&DՑXȔ# EqAL3 h4$ '-LP:&C!+jM6a2HmY7h zE"#ժ +V] 6xv9ؒ. p\'HiE'ץAuH&A~\~K*D lΠ̎dtGGU]-UWUJT2DYP(dCUѝWi}%Tffr>ςgm8zAKz ]jZWJm:j} & #ljM4U I z`O9֣J4*4<([T$uD~E_~h=}c xTD7.!<]$^#z 6F^Xoүת&ju^],:L0i^?GH33U(o "vPaPpBAC +qWgI4 h736G%S3Ay9 NǪ!z]{3?TL&a O P\&wh5_M0=v~55U?Pk 4OH'a50zI~馴W}t_tHz\7k~-Mu}5_NX=cazקz}vp{|oz.,$wT\QqwoEK O#};Rqm~r&o_oIq7HE,š\5q\typݓժ 7 䢶-' +Kڋ-Aնa%}S}&;*ݒ}i]cDXGDX'F?@?ˎI['7"/ktI߶}]_W¯_loԏO#/>o7.\ӫt[Ba0D }o9oK .~0mzaZvZ]_ K;^T +bba޿K{a~|M*[_bmױWUJEǪ} s֭iZ&B:}E/dqXz"M4 YZZ -Zuiݦ4Ra>a /*ծڪin ; _i馰…n4 qv i $OQhHpaR D!a0LwXf4* p7M a$ Ъ- b$N;L&mj8& GAbDDGDE'{'DDDDDEeT.*iApgԹDDDDDDDDDDE{V2(L!]Ⓤo=[ IMJ0vDbdFvZ9Ar쎈 `4G":0 e8ihE$<_7t_#5#0 ‘h d|Ѹ!f#=FD "<>38q8AH5x!ds B:GD|s3Fp ]`S K+19Qe8 dQaNLrvA;)[g r +C(d )$0!ABcv2)BU9 49sw!99 +9 91ur,sBag(#J#DDDDb#(9e- +Y@@DC%yXMc!҄< A5TDon:%mvIdI{ OuCMax5(a~e=ҿl4 XAj)>96)C<<}m4д0L NӮ1ޜl8U==BsdvIދ"-\hM<{}WO,y({nOụOq KnJccKǓ/ܳeNB u݇'7ݮ*~W dzg~E;lz_]?T-V_a Va~!,TWQ{[մb Ri馛A +h$mix)A궴W{MS^eaDm4iګL' X04'""""1LX"0Ѕ:7D r]̏##놕"X[H$ЭVҡIiӄդM)iI=[qliU_jvu/Xkk^a5]T& +; M0`h5A ,0 눈#jO(a>DG#y-)I3 )uTD:Iꩧz};I-" E +KDkDǰaA:/ +K}Ro鷓'={L};ևTlkN}.`p.xn$M!  =t![uܰÙT_M/f_뵷adS'տп_[]~K$Hʏ'$p⿮8? tuj&M{ux4:k*4**]I|VniA>WXO*k[[O5/zuUVFCB&҈aYpF  hl!DDDDDDF%u֭GRv%7S4љ̑2R2]I!C3#_ +A4 Jx& L K]l&a; UWi;LwvӔuM}]>?[(a5W_Qi:ǧKtd]PdE=wGiL03drS#4!34C3/~TMtM>zI{EE7}7ֵ +wJ1[“ע“ֿվyxڦ;'w{Ibꃡnÿt`gW/~^Q-__q>n6e gꈃO.̇I%_xpOAqB;Mp8U_?T5A!;_~l-nUm;OI݅k^X8z§C׏x3pk;ku˻jVA>.5{CֿWI:_k/J/V ׺K^=׵ɸ3[Ҟ[H+ZGJWb4Pޒl'iIU>8"^7񤭭 +I0 +CMSM4ӧnZj5^%zZ&ӵjUJ.\*KVa0 oTjFqjд Mmp( 2B"4""""""""""""!8BDDEqNGMD~ZI,h唹R2t*C22 VfGdvOAжY}.i;7=oZ[ھ'_wk?j!֖/Zo'WL[}W_ZOA}~ٚt^gEG^mwH2IuA^{^u.8Hy% Jj{=޵}:+&zKQsS( hfk}}QK /CMjTSa}TRj}4N)M⚷kIizb^KjViVmPk'h4;@jHaR &giO +<* +n #.DR*iUaC +D~ZbwlM"0lD섌RldfIe8҅ +4 iAaTs*jv 'M>XaBawWFiDޫ}9ܥr&vߤ]vIqoYFBҚ)O .3wIS׻ vc $[W[-%t7džqg6# +/FBr͂}zk{XU iZ ;L!VȒI Gw7ޟ ==jq; 1\mZz[[~ޙtַ'y(%Rq8ˋm~ Coo?4}=6 %Dƛ/KOm}6}{X';.W__^=[;~?C}3_?'~a;\,G_$_]Xoyp9S7xzo$PYדq__Om8k3_fWk/l]~¯a&ץZW>u/=R +ern#-*FA- oTبiuaAD$ +mmn$$ZU];Ota b5 ӻZjݵI$jkUL(U[^4PU vL! """)`D0QЃB")(ANŇI/Zk +?-3,o dזRd  +MʠA fSe9PRj +d\qdȓ;Yvf  ɰ$kiI5TȚɒK~-4 7usjXcyvi<3 ]}uVAB5ynl6^ZӦZ?ٜqF~'$"A3_ xkx &A8M4Za88gZ|=~_>TWKwwEXZ-]ZۦIE~)7hmI'iw_p|/Xh}e;l$Z̵~o;_tz|^}Z__! ?]#i;Oz>6IOֿf׿U{~]ka^hzGm;.#Fn2x$~S!V#%S*ihW1p~v'Qƅ|J{XPu'M֓&T*үITzatT^„¦\*mWN pVj: aPC `r5 z0 DDGHDDDDDDDDDDDC(LDDE#a +*B1jvc&ꈈfꌦΑPfSWE,#F#DMUAAjB3"zMs +0jkAR WwuEU;OMBI ̊7sY^t]EA,i{W џwhV'Eפu ZkQ|nN'jN:[ikڑjimz_M<}mO}q7Ubn>~wUvZuWv[YZŢq7_ޢS2]__ TaS?~יu֬/iRIROu:0m?^!I#MhO#_VGJ+>U^I)$]H:ki>w_x$(-*a8M466MMKwJ^S ki*aWץOaSL* i0YGX """,!0 `2 FYDDDDDF""X%]?W xRaP|Q"#PL0L(N3/2C*#* pDvv|Tu4& 4̄'& (*a;4zzk +Auiȗ$;\5\4\U4 +k/(NoIKPU[7gWOcӏ¡Nc ikC\^ raq8fLyP_} >a0NEbț[hӯzӭ<փi6wһZIIjjHvn_5Z{зt.Lp}iqmF?Kקo%T듍jzO|[Ti7tXu#.t[hx>~/5zut~ソzZg3ZIU׽uSS涬0V]IUM~/=UNW_"8R]qm+S rI _ nu1mXitڤk S TUU!^Tl&h54ªaa eaЈ +DD!a + ! D U L?DSTWYUL& +0A)L2 * )̕ 3̥<& 4;ANM$AzwUMS MSM8MB }]ݬz& ]մekZ 8V7N}: ٞp'W_Z]?|t;3dr3ёԈaTֽ8!L_;%GbyD޼3$^_U,# ٢P1Hd< eD ț" +v_\L4M00TPڬ-5[ZA&'In7nDE-F +黭W͙_eBt^?ȗ # A"񙙅8g4]^AN?OT0L!gvB ;Z; _aGwiv}~Kz_|wpkmv +ѣ__KNlޜ2qo7;'%y8׿/^칫.$6l-=v-/U~}_K\> h%v_Wqֿw{k4_^*kZ_W__{I-}Wm|#=&-VZu~+I[_L!Vq~rK_4ҰJQUo"b [kvjiQIQOtNI'XAtu B{4ҵZuZm:j~tAoki (UTI8a5N ,qarR SP~&DDFYauYYuDDDDDDDDDEQH]%ҠzikڴaMjo)+dTtC3R2;:d2!dIɱ aT + 3 rl ;%jBih0a4NUW[\UQ1UA/iȖMI SAv8iA::]?J{n1e_tA='%15w֗pKO;44'kό̰6f呆`m!~{__ӿj>OL+܉3>;Oji^v|Ew 'o .[چ}k_j]^NZ.[@ޠ=ZWut{K;ZuiKz_kcaonXeעHz?op?^w~ׂ*[kwֿ׬3a^KOKt%5C[±Y|VMÕ6%C9i_tH9l`mz=a턢Wt U -xM4ڶ&-lRM1b)>k>AkU\-T i|39a0LڅD4aAaBCB M58C AQQ b" *ژZAijy25؛:B2A::ovv|L*U A"\a`%"fB)6T0TL(L'PItT[4Lvc\SL,* v92^D}aIn`ʆ=pu kFEԈ[_!M]]b/} A3͙A&\$fbi_ۭ[ +'w[Ahϊcת!$Aktgֲ}Wki h=/yA[l-nVIa; wutVnvJ;˻kqol.?Ko:/i/KYfkM>wbﭧ~~kp Bݭ%EM,_\\S-)oI:ߙ?׿ank\io_o4Xa->J(Jrzȿ vX~z>% V@<ﶓzQM_w_m'QV)CqA05M*uv05u0A=ZkAփRT׵5ioMUS_PN'4#MhC ik Ј#P +N0FTDDqkH]%ׄD~ZȖ#E-D``-ɳaIqdtdɲPS*㵬̠SM0d* &' ɰ$0M5L.UA%u;;T[pZֺZE/"knI7H;OnoNOn']uu_׽VcdO|ƹvyo;KlK l 8d`fA0@ϊj}%!i߄4ߧO&[^MQ}n֝Zz_n|?ȣp- >ojMo޾2qwe;ho' m /j\=}/}íaǯ4_}uH[AH&~_>_#/tJæﵼh_c>da2ѮKٚs3__ٚO/گ帓3IVn1[ko?_/Za~¤Z?}}o߱WIiij4^v֩vi_ I⢾+=A>vk4 ֚nOZH4M 45_Sa>L/ڪii tiaSvADC)X!B""B#UAPhD!ahD0QDEFTDDF tdPzUZP|FI2#%hTS%fMK!BD3%B`T0k9OZ +Ta; ̔I„„in5ira%U"iȚNoUD̃_ۮ[W鴃n3/uOO_]tK\M˳5b5JgC\Hd~/_Aa8 ٦< q QZ[~V"k4{V_75z]<'kahpu"wC˄W-1_׾Žئ&qB_z^{|u\,;h$Ec?Kgjm:fKҥ~xZ7_]0ZWk寥5>_W]ɹ=$~O$`#9r}/}Tk %jT+a$ iᄞMCA6!iq\i*qH=6tzmi]4[IT 5U0!jkNi0mVA!D0B8S"6`Dhq7Kذ^* do;TL[bdM h +K5 +2ajH2\Nf@LRl +,*]uTTaPjaS$4LvjIA.E)wi}mQ7hz&;%ijMYRum=䇠pZA:6WӾmҺI=պh.ؽwZ[ZQD8.o)r=$~{=dCYhvժڏ_;J0A_5 'vN\ ;bU-=-{Uz3Kگ/k_]_oiSO/d\ZM䠓qjH{$OZ.,)7oڰ]O;߬(O ?}20šѽu꯬hh{Tvf34=jhFysA3Ց'2)Pklki/ M;Oa0BMh&a9JT2:Ϩm>jZB=/\XVXinUoarՄcwCdK˺&7j7뾿i׭]_[-Ɩ?K>:;7oBZ#Cc!U!࿗=ST&W_3_gg_kCKo_HzkI$ZGK=mklSSZ\=#Wr-IH ${ v7%WklTW,Յ.A馨:ouM-֞i^O *ՊتjZ5XaWMt ~Mmkk̍Pe&EFdX hDA"!8M0DA4-8K!tVxCխ#-Adf-ˢ#Q6wa2s:d3@f^R]$EBbC3 qSfQkjBA4;PSaBxPk4 UVw}Ț"qU)ި%ZT2O0aIW>?뺺T?W)7?$F>4_z{oǮOZ_!\ĥC#T}Fz$I#6zy<@>{}TbSࠃ,y3y(A p,ψ}JGZuB-jwB׿TNKFzBmjtM[jW753IThmIz `|l)!踰}׫]ήv[vN/vzI6M{֭~]%+tO]Zз_vv uTiz/ҿ^w%taI^C[KXu࿂%t_/Zt֒:/}guZJi/u_WT}kfO u\qG=S9ZKAU㋽xXKmm/b?}?bҰ0֜4zzwTڤN)6*6ӿMj5taObb%b &ZwW[֚vZi鵦+O]5W oӴPaVL&h; iAikp`G1눈ІDA""""""""1 (EjQ@3qJ-wF'][ a|-6Xɹ;2@;ZdH" ̀XY6,2Ac)S]T* +jM4jxPhˆ=5L&5U +;4=7"}Sﮩu刿O +HξY7Nh1;Z_ +Z + !lS9pړp`'tw}^60˼lq +Kpn׮]M0_uOZ3џxxz_xͧ冭'P.}'?ߪ5ラKI]~޸k}.Z/_3GO&+3K (EK^;N] ܩZ_bڿaca +-mU ڦoM4ӭ5M\/SU]}UtRj^zRwIiuMI*kx_ZaokT" !28M8h4 MzaPh4"-DDFZv*:^QDKbȃ"̌FJ"NMLP23L;%GX daXAdb"96,52 ) +v +HUM04, L(I~TJ 5U]w9N4B^ˆUKAWuW'I/]uqCF3}u}yϳ59GJ=dA!jMğm, qi tpv0Mv5aD٥>ַӽPU^g QoEnMa'&;h[P~Mm'N?$]tӵN,ܵ_ד}ZooK]u$9}LwJ!}^X^,?_7_|kuZ?JUZiiy[L3HP.n*a+V4BZ}_j]a:?☭6+XKӭjTZpM6k N:h mlR AV}8kMZk_ jO]z L#4*OPNᤁ8M4B",B",.ЈDDDDDb!rRzNZb2ĢZ%d3!"@S*3 #̈EMSA bR UhD0jl&B=B;]/UA-SKM"[9c /IA6a:H l73ijnt_6!"M#vKE q_ߤ^ayh3drAO͑!hG[׈ia0N_^BH&oZu/݂zÿp?K6P.wN 'wt6[I_$;D?;vO/J8zM'KwvuӶt[`$~]cyꓮZ_?U_kkI[޽/K&IOJ ޗ=IҞ$m m9}5&Oԋ}PCX0i!JkC6TzⓊխ4IbA֡4{q +h8NҫvMӯO]i~Ԍp^ka5q -VL&av !25A#C,hDDC"""""""" ƒ(sL 8"1!u]wӬ.QvH&MgTdDtFEH)f#RB` 52C [%M̐b5 +TA0B4jM% +W"iȚ[q7|ٵ\u.hyJyޝ4Nwp<&'9zߎU>5#T#43Lx3 Y'eX5K}zC6i6AńدW?PUN!$!hSі[L0_6M{WII}Imm[_i_/?lnk듊حﯾi;Skoç){_:^o}]/yKunKWto_}~}%[_mxEC?/Kһֿ龗^IW}>G^kio]|T~<-4BCKO9z'4 -#tQpu}5WLRi&IڡRI1 +)6*)ijZ|RlUu_IP4{U{4.]5m5׻X5#/zaU5 +a"9EL! a +0AQeeWRN?$i;Z (L]lgby-Os))2Tg)Gfh&(M0AA0.)#3^j +d\b4dpk&֗L*iTUMOMT. RTӭ=SN҄ۑ-1֫ߢkO]Om~LuA֛I.AIֹ>si^ ]Uǿj#3'+#>qs?3˙9dC!^6$./K q aC axFgHο=m?}ўx?EEû ~\;u ]zޝ&WTIF;Eé8ӴT/ Pum}:7Ik&1,.ikTnCtҪ}_,%k^*bKKl~ٚRT%$p%U/;]6[JH! =$޾VZr- $i!r_KOC6Z_QEJCV6ֻx^: ZtAKZ^k~U⓺aXjwU]mS]kTa2n +U &a0)h0NvfMUa+.DIė~^uQ}#Q; k&%92::2 #( +kfCY-#$tO-B h5A!ɱa ȀkP[P4*jNa<&.z}Yn̈'"h:4qki:øBya^egEAO龿OW XFv~!~|k;⺻*!x #gr@- cdQRAmW +B0;џ֌?&vUZէzV^彰z\0֋ZO_Z=;aI{um'~{m}SK}={l~uZyb1߯]'}:߻ [zBOBPi}ȡ:SJ⽿_m+Tٚ;?kO-\U߻X2"AK]/ ~ +a/ɹS-;qz*]˯&+쎫cnXAt)6״S+K`[Q~>*_[ukIW8XM:M8i4{M6OӭUaگMaOt=o]4BaNSPA aADDDDDD0B!DenVB?uQ;>1v6nM†S3@"2)ّ7&ő̵gkhgfH*MPjiM4A ai_TMBiRWw=t\RTMɏ1ڨAnDȚySOHh&֝ߪBmO<ꖍݴ0~}{߶+{k}K kWr"AХj/Aś#6Gj +~#<h8fc+u|O_tcEٝ[}SJ nzީ޷,)8 J]7'mT.Ctz[jR''ׯ_C]$&?xҭMOK(O߿wnqſkסo%2:__zISuH~floIjJ/ApR\;]z%\arntxҢS{ez?V, V.$i0C +qqQTƚzRU}bRqAtTN. wk XL*aa0NSA!8 ʬ*zIT0 `F!"#]F*J-&Z&Sj "LBA3[2a25["qLAgFK:MseCgiz aUWUMJvjHi2DA PBw&0IS %w~޴q4zB Mz&;\ VoEQ;DlaXJMחoArII^66'GW?>|zzGtCњldDAj폫z<&Nh8lsAŞ#Ańa?^(B +k;tL-zk!%?Bl}wcikӫMCO_T彅&=Go6բᰮq - ߿N ꃿM7Z_w^>]dA4PK$zwZ+/)_ZM_HpDtɎxd_t\_{ WG++[̦_{U޿L_)5_勞I^]Vk~ +}~_+%ni~G.q 6GW^ccujaR9*vi/& [mUmb>5M*7N&J׫(ФدxAH5M4^6MO6I >h+XOu_WXjaVA XMt([AMt&Mt,B"A#A0BRc !CA9XA; AP *""""""#H ;BKKJu{Pj%%-4&kLd&Hʄh̰MC̠ꩨ&MAPh2^2IC +SM;UL&l]B m=j܉{NDH-vit㫠~Wwl5>CK]}{Jҋ]: Hb(UjPa5᭪A +kNAYZ"2Ƃ]M9:DD0DC +vb""""#_!Z#uuڈFJ(R4`-M0@ jda:d$RlZL@k9NԗUUBiXMBaB a< a5 +&UDݦip ;M%wSwr([ᠾEVA!AhO?{gϣd:O +mմkћ9Y +?-wutIim%xMGkK\ƹUdbr"O6ꡏj?Z띙!#ox0Іp|Y63qA0@ b_Qa>W+Khٕ:zz{V׽vmo> a7׫j{.:\ho'dAҵ ]^6ڧ_v4UW_Koptz,?uJh[J?$دׯ޿fߴ^fU]:Up]j>UyV Wa봴X-u=A-s#䕺J}#ٻ^l8?~; ȳAVk`MvwɱEǧkiiv[֚ºN6+CM]*A֚xL'i &TUI&_Kkj_4O&0a08auV>ЃDDDG DAB&DC 3M""1-vP#rGDtQAHvIM)8p2 ̨DMFdM2)SBaWA3VT +T&5 +Ypªi:j%2 8h" $>hz&}dt`gҷIz]t_W7]t|/7tq!U.5#'F\(Eb%e00A6F8q`ZbIuVUzZ4IMUx=_ak}=9cֿ_ \Y'qOׯj K='.fI~^7W_?iz"K/uCp,?&yaX}j_~)u~_ֻ^>k_Tw /[Y-+V#Ϣe$v HD_:fHd8^%ME[0 0U l)N`M0%AZ !|52 9.25kL&AjA +U?Nn4IUPJ*h;r(-mh7.5H|%_t`g=yiS[[>-'I^c@b=%˳0%;31h|u~ +q!Aqv!`!i!͞hCA.u"l^!in~moEKտދu]rݵa@Kº%;vIE'{#IKaIӭ;Wӽk.U}t/O;kO7|r1񤗴F?m6KI Kmׯ:L' 4FUזCNᤢ=vWq_ӯg:~5ufk_ O^gM%Z>vakߪꗜ GQ*Ck٤|-0K%Va{ޣRI=IYA[C76(Mؽ}EuojR %0-+IڠӧNcN86t鰚tu@  /p>& +ڪժMBTUv0ikzxM-kMpAZ Sa0Bʑa hD8눈DkFP>c;8q֜&/DG:"Hd&hdȈ &n-PR …&)A gkL `"ʑ b$ +dpd(_N5P 4TL*i*kamMSE4MSN.Ñ$Zry8nN)ӯ,ȍ{Z]6|>h4Q9hh(xz.uNz Zx:wǺcvf}DuP}4ai3qCNQ$VK\Z?JpCAŦ͂]M8<%,}~zXir.OO?M6/i~i6: Z}; +N7^Rqnȣޛdcqiz.8:iYXsa0oTu_݄idͻkzW>]oZ=/AWhZo{_Bz{]7|\q^pk_WZkk'f5?>zXUV׭ }R޷_ku]OҮޑsg? ;Wa-x4i)-&6$-3m.4k&GڃT+J9;WXҸBi'VnotIQNAIIA&V_kNmumWl&SH&{[MSMUWT.a{T"B M0*a8L+ ,""""""""""1)jj3q t:jan1k=eزDB"ْ2B#-.d5h̐fC +*a!vKZ gkP `L*M(AH0PA0:a45P%A'L E]"{dMpH$}[1s:t5=ҭ$ %pu_Zn%Of}+O׿;3{3Ly-̢:]u[iXPCNkX =(?5յkP~-Ƿvv֞*:Ao--.2O~7dRoCN|>oT_u|]_ -ދwO,5oޘKOOT]{Wk$]+?}!Z^i޶d+I ,ZSlWG/l/kk4j) +ꝫj&m&ȰX)=zjv*=}btݤڤ5pO=xkkLSzU}>m4;\&h0T'eMbMTB!""" !(D0L& B"""""#ZQ +endstream +endobj +47 0 obj +<>/Width 2566/BitsPerComponent 1/Length 34759>>stream +ԣ<ޱFl2ґ:2\̒ |Fvdddk 4M0P0Pb0j5T¦L+?'Ma}mZ;PȞ 4˺ZoqOHfV5ы}I]̊o%%Mh:oAƯ̳hGš]=a0gA'2)@oؿ'0a_k (M Aݠw+/Qzڧ==m}mju.(|m_ݰ[m+T 4 Jilw˾%nIj]uWd8.{O/\ų*i7﮶u?nKut!?k+1_Mρ=[n[oc.|} kWB"C?MW_nk]z/jT^%7azW_HH;SM}*Z._ߵ'kkbOIH5IA3'KrA>9uX˪u#Ka%CWK@ +T*M5akIZ L-+AEakUZ ӊbOuj46,'WMUVV)7 TUҵTz]05kPPAږ놃)a3$!a(M iHqGMyYhURDGbe+,,e;:2Ւ gkQ F#&'##aBA MB 4N0 455h*i¦i&aPa]kIUu1-h[v^v&F.hܽ ۦjROߋVPA'a_kűj.A׋{괹N^O^Ag`75džf6BqvO6g$9?A~Z +;OM5k]_}خzi{OzUi݂ a=hl.hᰘRAa5[UVޔ>N;޼6֪݇_޽7uQ囧뺬i*{}xb_n7kikMtZKEEn[޹aX}tSQOz~Ioz}{K]cm׮ֽ#ii?${Hqzҿ&LS#T3wihhi~G?OPQp]|W )M $4J%jɱFqL5;6ӷJ*j*CJ0uqO-M]$] 5l% 4{&ja; ; CUL-450nI5(0>Y0A`DDDDDDDDF ""#DIQ%BU?)EeB)#"E-1XTS%Kt0%vK fA @جeQ䁝iM0 &Pa:a*ijUNL%;MT.Dӻ4ˆh-4]'EIwޓ6Sf{kp=]VWPAðBA҄пZq|ux{?k/'ӑjFgMU^C8f y,Y6h0Aj)<%zVخO,z}: +ocPt֞~݄'kFV~I +\~;֖Rw6龜 {ݭCu,; ;ֶu_],:AaF{ޗ~_jXK~__!xy3]V_}VUZ]O==s[O~9d$yPK3d׺'ՃkJc4b +MmU(M5x/bե5ZbXV)itMU?MUSZIՅᦷi 4L1hD00Baa䜜8a2""!PB"")KBZXMD~ZbPXGFBqFDcq<)ƈ g!dv2DAɰVQVGkp ̍uMuUA *aU0j&骪 +zYN.?H=}P]Qor'"}N8ma +l:m*p:﮺zNy;V뮟}}yLK˘GTu~uZZ6G-8qh0x qhkǬla~c]MI{ +nMՒZz8^&ݦ[]j2cqi7j/ߧ鴸q&_uG]7VL(znOۮ _COb}~i,/ѡzN]Z]-קo_i}U~䖖䤸uu,J!H)Ş 挐RlTiNǗKkZ`Я̄A$Y6nQpm|qZ>)cV +%vMu~mi鰾5OدAwiM=jӵMva;Pa &a4L! C`a4!BJqDDDDDDF!"*KBqMXLGfSR)q-dʄH;JGFH2 \D`̕.J2|&M40PA*h0AɰVd4GiX@W0 +5DL.֚iɎw65\UȚwr&&[נ{}tl:4oý?eo}z]t<'[ק>ǯa25g<Ϭן#B^8!)Ч,ص:} 5M004A~6g__׏XoꝻ3cv~.zoaZ. =U/8]moO'ou't0ɺ8j/k~ޟ^C]-I/iޟGnJz}z_yqC׶OkͧI:I+X봗>uٚ3^^I_iVg:>륧 _h)n{H(v# maMK:҆#%4a$ЊB$WXkm.uaSW]ibMWb bi'qӵI?ONNIu 6pUU +k[vO"ihl޿d81>Ii֛Kz'WH>KzO|O;#UNcn]W}[>ֽ/KZwWogc}ftKoz]#5{Bo"CRC}/0ݿQpr›*}'ɰ!&rX쎾/?EAqZv[)i4O.>-Ca &}Rj*{ImUmkL+OM}(4 O ڭaW5Th0BP3PU"VA%ښUZDaTe!B#׬Dh)ذ$IkjDGd,DFB*##&z?6RL"-dd;$ddA ) R![UPBpaS0N9 _ ;ӿia_Ț M5UE ~MdOu{h4Cy>5m|G_Tzzt4w^vf!Veb\i"uk׿ +?p͚ jh8<"kDꪯZ[a-B8wkz1wX +ֵ<+[Z 'IvnuJ̇ WVݧ~d;/kT}lU޽{ ItO8pIU}isiX}פ!EEI$_J_]]_ZGo_kvH*G#$6뵱ǖKa(ihhjhPB]+}J.Z +Ш[T☥]״UBZ)5O_Bbnצ֩mSTT i6 )! Va{ +XL"2USDC)' 3/ań""4p4(J}r]Ou_{]Pcٖ|#{ X'ds85>YhOŢkWkK:}U_׭~NECU3}VH{4Vؑ)AH&ooS 9j~-?[Z $ ;K!4ҵ.E86}Ii[Ma 鵦' iVp};tOL/ l*j4a2c¦ U0ksa:@0DDDTDDEDDDDb"# IjՄ1r-4AQd#s5Ă5P5qT0LPPUTT|e2 ;3 *TJ0 A^z$;A*&ﯪ.M"iaT˷INi'HzOؐk]xA)6ixum(Azp]:tHWq4vQiW[@Nz= ͙Ǒ'FHuXv9hZiw`[*EZ+T'K'au{ Ep~̎ /.Jm?Ԙm?p̜6u\6{>d7O~ ޿_O=]>bk&9Vӭrօ,rB?B:~zU?zoi{3___P{?osu,ImVoIm&k o]5YuZ]ukԛi+T\^RlSllW_i Zzu]4Nmmt5MS_bh&OiiMA8i P[[,t4ɸMtiB ""#`V%8jըc\ 6[ْH#FB#$U\dABa=B )$tzd6&Y6 +έ;ZgfrWP*aB{ˆ9=ȚtXT^A"4Agiw*p}{O}ozEh)zү~.JfFffzB03dr\'#tw[W`oahx86(7t]o;%I;o]2QJ?ZwRc I/lhm{}{,:pjJ~B]޿kH].^;VO]?8/ZPGA}>X_^YחC?"uW^{[fi3ZouH#{׭莵k0GO^g ]۷IŦk߱V]{MJ[[P0KХ7jNҴ҆_WQJ ڄiCXMbN4ޓk :STNSlRT-U5{[ ݭ5 ([B!NL& Ј ! !hA"#,Ћ1DDDDb |5+#j8iDDG-#yɺF 'Fv5S(&0h3V0 +(A9633O4\*a=mS0h4-=B ypꨘfT$Dj~wiaZoW]}iw(t]Ul>_n}t?ڥZYS߯;!}]DYi9}{W0BjN-;pa dEyWإӿ-{z}߽ރ]>EauE{x>U]R]\Y8]KuK_{^Ko?h~1$z}uIt~0.u- &GVd}?ͧ" *|4[_TUZ3_k$kgwM5H O8Gёt\akUsJ'߳SoGd?_loVO%i}n}KM{ AIIU4)=>=zjv4ӺNMZ^][PMjmZi;|5[[ +[M5^* 4%Ni"B" B"2"""*"""""1/;.Ӫp ( dj; Ķ&ՊAC3)dv3Y+2]ɱ2aS +*Lb@ 0``IGfWa4*ziT + +UJ7zhkiiWT\UHw܉Z.X˶ᄉ JyJSbyY]8~úionN8_uQʉt?Px ~[O#gv|œ#j +~/ ߿}W4u?JrGdK&łӿ߼yk]O 6Y hhJUiAk턣jx5PMX Z} 4N)8ⓎiiWM=Z^6( MZjjڅXaS^¦5 S +5MWMBh5[Κ$0^eDD3 m=Ht!"8+.0B48DDDWR,ia?_^էL +"""#6c#QQDj?w̍I d6H##vEHb)d0)Vt|@S BAv!ɪMr2h4٤C M0O aT'5L&.mvwLw.ޒæivNLIs4P'i'X\=o{nN^}֞o@<ïؾ_ۧͤA]I@Cٞ\͙9!py |9e>\͙AxYh83~+־: 8qL!i}ޚڂ Ӌ5w^ժҪu_l-of_ .>{Vwipmo&h“^N읓7Rqגw䠔cjN&=>IںߡO\*u{oYPٱ{ޟ]}úx},-:[h-~ߧuj( ; ôߋk_W_ֽCwunKt2_fkEzM%W_V_K<_5Kaa%TO^Z'`CJ=/:l/wzVTr,W⬺aJA뻫Cm.[b6ӊ;Zmq\PIN('IvM:pt P馚oIm: :MUtM'I}Ut $VvOkiO_ +څ-j jOL& OfÄC kpeCM4@T!e(p"""! +&aЋ"4"""#DEhJ,A qNŇUUZ0C *G-C\Db;DKd8lk()v8d,QA0CPP(UTMh@;3_UL%Za:iL.k%KARnjBӑ4󗺺R#KWIH]]w]g뫤6$tOtׇWWJ־_^ _O١\˙dsA3"3囍F4#֮ 4AW$3z}wijmӵ^;i텢cn,KdD={ֻړ==]IËw/a(aشC;ux}Ֆn[KדЇӾC_UNuO,4,r?Pt$ֻֽvJ]w׭_[NHzHH?_]~_}- rs]9tG.TV]5dn,CЫbuI ?Xj5ZN8ZM|'BjXmh4Sou-UmW(Tn꽧MxiM5xBAC MU ZӈjJM0)MP)"#,d5KK!ӫ +ڋC)dY"hD_#"|be[% +k2!vKB,gkPBB$\2\ +kDH3!Pj UL/A4iiu +MAwߥ).'_ݧN`ӑ4DR['gUEQxO>pt}Zyz/Mn5qĹH#VH=`qu!3ml<נ P? g %3YJ8|?o֟_}MSM0ڮ ݦjh%;jVm;_5淣Cv[cܛаnT8zMqCdu\i]WZIoZ~돧Copn~4jb@~$:a"==~uz^X__o߽Z2.,v3_j_ki'ԐgS֒M]Z_5ɲZTi:kRWK4iWHiI{k#쎽JҊN+SB׊b-(^*.بӏOTNMתNuUA47իal&궺~Ikil 0a MiMP0LTgB 5aBe0Dt"""""""0"""*"#,D:KZVGKJu D|7 $ "VL\v433Aa5APbC hd: a5M4UM0t4OK &;OT駦|MtDeߗIv&29N>zڶ'N믿תM׭ uWA_z OMI4Dta#ZL|'hvݯ㯄6fq aL0w[aMnџwgNx86]/W'Ѳhn 5ݸ6_k^vf _N_ZI l z?^65֟OӺ{P_Ћd) G2>Z߫uU}[^N  *믯?կk[:W m?7aH Ҥg_fyɵzTJ.Vɰf{J$[.ɱB!mk~9cX + &{_@Hi+ %Ӹ8i8]mCN}n5 +{iU_TZia4*k֨ i:ikj^M0i"""0DC +M4 `,2!ib"Zjp4D~Zb虣$Adx.C20rzV + jSH4aMAh96,FeX3M¦&L& PA[ $w|kiwr&xzH WpE܉'IϐHh}&Gw.c/ʳK~_Vz}6~'kKSKtrT';j˭t;:&Jq6|}KM~*M>㋍5jla6*& {T$~T_I:itPSV^) + kUNU`;CNM4%Maa5 ީa27"""""""#a4O`DFL,%`DF'T""  KArzծjT1 $[KPM@;2[GFH#3B%;$b2Itd'-UP(MB(M0M0MagL M=SL*UNpKi-i*.U4'rÇ&[yEEh]]\5ycWZza  kuui?]֯@Uzt2UZ2zkk0}# .gsٜyO3NH9 İ# gw[„q}Z?N\ aJџ~$,'j-Kn]&h k&-ە :dPu2Em/ݒP$Mt+|n:t6LtalQ/_4o .6>^7ߡ}w}t6?o}oK^qo_]c Kdce{jXE/wpz?}`^k4}v_tIi]#~YH=4_o£; /\Qh>zI3K'4AVmKI0[}._V*TucCAɰIikpzujۦZRI%u$ZIGh>)ӻ Kniֶt5ikWpMzjU_ժah0hL&00BӵYDi4iauXa0MpA4 "|hXL e6+` !DDTDDDqGޑغ T*4+ZU + +#4;+fEHfdE"ڔK`F"fLh4) kDH=SL(UP$ h0ڪrlV)8gfMWUMnӥpE馚whA:'U'IhOv,nONy6J+6/^'cM^Tk+X]rZcÆ:\xfc3L^fa|)A#n @ϋ =[@V?^Bw|5&A 'VTN[MzӰx[ݭ}{֑q.ۢC݅֋:.4 ߥd6޿oMӲpl]6-oKI5;ot]_:_]08x_5u}ڧuxz.d/oo_mU:H?n{_t7o~̵$b~ug?5I~uA?ӷ*ޗ,=7Z{RҺ=?/oalT[yB ;UaUI$OK`yu߻k|VoAq ئ*Рƃ׊c*Mڞ$)N8j5bi^6pھj!A%AM4M [L-iNa +K4_m0ڭ^0B!" +4q>&m@K `03B"": ") D%*P\'VWZ3"hܷS ֲ23"\ְL aeՅ#Q؛ +PL& aU4NMũ 3#TIyS_P4iiATa4 ? h< ZrKzu;8w*IȚyzw&;I E'Hjۻy][t' / =:5x[KO,t>[u]޿Aeb)גlA\3e9ds ECL- P3yV׎0ȆPA4!B4=0BKD/] v?D? +m]>zեE? _zwwPF\^MܔeŅ$K$ꋆԜwqoO[8UqipIt6[q* NXkTFa8lRI鯡VK $ӴANkAWAjڽ1@LRiN/M/[[ !  ({A04v AIiO0DtaU&AGMPeP&&aDDDGDeDDDDb"#A-eV3!ǐZ&4DGj/"21aM"2!jvDKd3TP`40 !,㵶tjBj*i4Y6, 3IUuOESU} /ˆh>T^> 9cȥ8l'"[3ktܡhϟ-{H7 =tׂ*uZ|תּk]7:RzUM4vMuk .;5W 'Q ASN*e8  D4"!"0DDDDDE!C N煡it֪j#"TA2lLCddGkN.fJȈ)iJ +y&w(&0vJ4‚  ɱill0UBiPZt4 ɮIc)pRM=n4vD$N Iմ=ӧ.&>qԉ,>9th2:/it/?Um7]u*~26ύ-:k\~>?ޛ\DEĈ/CO\4da3B8Ey@"q ވ]k;_?i~m}JtNՅiX==ޙaꋈa[Z-!hh&] [MfF\;^kWk vH}D߿;JlZ !i]L;L-^ џƟt5[wAio}i[ao[hOZ. +q̉KwPoKXkݓ7[jM''OZR&<6>JQ}\4};i~詧vq.}^aS[f{u%EݧЇOv8_U,r$5 __+_oaGIjm6AMzI_,!8`jK%[U'„9=+Cpz}R"X}iq4 + hR|{i M^k{oqM-Qkm' },U %i}45:kjT„XH[IӪ}t[ ȣ !;[MDL tR +jTӻL&a4]Bi A)ЈBeDD!\\DDDDFLDDRZ+XYj,ʃT.֡ua4Gg) tdvP)Gk()2]PR?4’ƘA;%L'YSiQіdªPUSUY6 +fa;4^_SU]nN4AOz}f.T)äM=U_*iܥ4ZC6y%ko=o]~kZ~ mm +qtw׽ þ]wE_,15wi_Xd C72AZ LF̜88GhX g3黾/} (!OOЋ /mmjw:Rᄐ 2q~hl-t[Z&;ao蛶 U8o lí&K>9(kP߭Q' %nMROt{MO?B)64^_{Q\7SKt/ܤ+_&E0N5kzI~Wj۫`{u_*o_Z_i7yaמMT_ ukʙUt#i$q2R_R@5___ h0x@׊VHK;Kaeho"jA*N:Xt~$6 +)_ZӶn5=VZm,'kk [H$IZi ӤM5>a5 +a4„jIӭJi^N"""B!^2M2(pM"-0CB!`2r"""""8"*14H(CKU\jMDG r"ё--p,e '#Fe֠fDNZfqgkPRjK&0]4 営vd2ԗ6Kj5T^M4 'B_D&mw.P]_iȚr& Ä6Nꓤc2 "6PUt6mF~&Ϻo>ZqHKe=y>jD5D- PeyC<)"-jAM  !i0Yj׿SU_"OZ'IU=jh/:,-Vl\C {Ou.}mu'L{mדk0^_^ޟwtPCqKWKف}z]7/?{Nk\ӿ]_wثsK+o}?>P:zPgWrKU7kao%S# ²Ki_T0if Wl%_ڧm{a/I/X#m"*덋~ +J)p |vI MM5M4W=k}uzu^k + $k TOt:Zz vi"V( Z_vi-4AD""""""6A jADž2D0@”C@І""""0B"""8DxhT;\zIVuZA#+2h3[)r;Zj2SXgDIde,dF"V 050L$ɰTO'0(##]0WN +IB$ ̍d wW.T¦c+NN$=s"7rK#cҷ_PO [rcmZ!.J8H4].a4 !8p48@q3]#? _K; ?iP6BW ~]^25 |?’ ֋ Et QL7/Ci>]d N_]=}]/޾,t.\?,]YIu6[__K)w3_[__fkgHS _oI'¯_5ߵs],ҵ2N_?}puɺ֫̕kjK vE'{^ bմDX}hV 'mPkU7iji6\.+ ^}m&[JփWNUᦚj +MAv4֗AkL/aPU#M!UhЈDDh3%ڰD|2FCYKP$WUdj?K^ ̑dЌ6SvKA 垴u0(U[ +0 +i&L2C @ ԗ6?WA&Z@N 4Lp{RI5NS"?R!tnDʹ$mi[Wh%[}thu^VI-Ү}nvv]SҮH=/u^znwO_ͪ˳Dyr"::^FU!8vh.g3L]#@Ђ!33m` XA AIXZ_h8iCAvwa56Wp?WO$;O߯BmZ&A'5~+  8-RN޹8n.—z?'4]~ԛM:CzN v6\humۦީ0}Z ۯeuWE EC* ͏ }*28;K[[WڬWU^mWߤk5{_kϮ~Y$~>K~No9ڜ]3IR~(Y: -kv /^u9.O8Kl%{t}lz^i=Ǘ^lppm,vG20ҴЦ>)DZ +CZ{O8am +j4j4j(&i8b6]nI-UM7*ӤMN6V ; M0a aXlUh6L i +iA 0DDDDo[]a  0Ah4""4"""""6M5'M4""""*/ KFE;qZT +ЋMa0# z"-AiʦMLF)*"#2%mf2I-1X)LXa0za +L* *r!22OSIVI0i =VM;40 zX@PL&a_U""*uҚ5%k<~J?O@Erc>IiS t:R/GߪKӋvNʹlϳ=2g43r\$B5_. ޗ?0PA *`a ' v™IUzگ_inO!(XZuo[jol.}*d80A_$ע./QzNzICA]y8km/_\'tW_ۭf-tNiWK׭ק}/ꃧop~qd׷0:dzGEN_kB:ZнtaIiwK{]}I/\7f}3K/ZyTE";2Eݧ:T2p~Uۣ_[ z^RO&ZkǭZ˲wCy8_ZN7'ׯa BdžZw3?K^_xm}|t[9N),;_I/k~_/OIz]-ӥM$UIG={#G9_AE_~?w[}7vާ]ka;#<7&§ nQ_.U#ax&[EIQqUN+ؤ߯7T44v8Mi: ӤZJUM[T*SivMzxkh5PNd8gaTT? \Ti&!MЈL!p$"HVJu *h"!KaQmQ/ѡP̉s;[A2A&9i.;d 0LPPL.0NYFgiq }뮚U XA,ѝA0;3 +z4A*WPPWܭnD[re>PSޒ +k=W!^6= .\;Mu[W5 _H'W]'p|ľLG#b3YG2vial,$]^pJD +I/f٠Pń , z XL!pL?U}5~wzikI}W-(Evli/2D.Hv_pړ[%NBN)m_Ct)i}2w^u6[rWhduT1C 'tJ?K[$:E\S]/q}t%_/N!ihI~VV߿__ߴK]afk3__/־錄uj{jrog9-I/K}C ~ zqd3pI]+[I4)B]=O.Xy}V>8at>('LW L\~֛\&+4B6 փNKZ 6T0Ah0qIIaT޻Mu ^kv0B""!M+]aLpJ 8L e:NBM4'Cb"8B""2}r%WZզL"c2PDC&}eLd;YELȈ#h3SMSL4 +&Q:3KTa0nZa0-N,&iaDӠKR{Y=dž&KRc +J ;>&ә>5t)=~]_;3k#23;4˚g 9:s4aUֽ3f0 ӵ a[ .I/WJ;֭5mwe*eE됚8-[նW40qpbuu:_NN7rwi6M:X8o[KV]n k+CZߠІ;KH>dB0Ӭ _cuɑ{wz_#ޗ~ko+}ҵM%g"Ui)v4TI/WEza*qi[iW %rI+yv hwa/_J +xEz !ZQ^[CCWTV*)wVOUk^^%J$7MbMZMmTBBՊn mX0B,M;B C.GaB"#r]*~UY3#)ٕZk_A>%~bSdg6gD4)r?ؤBVk5ABh0Ai PچZ]U?Om,+[VנEEOl-tHڥ{N1qi덩xаɎ'O=Z_MB(t׸t}!--MKou\԰}QB#i}.?~?3^N_Tz;?ٚ# ZMZաu^I|1ݯ/jIR}=&.Mo^_}_mr珞]z_Ʒ_Z]'^fI>fioI/UT%Ix"ߪ^TflYH(G{#5Gz_n$h&CyBoިUZ}-S׷ッ;K V=t)SJ+IRtuKCCuՆ %i~ZiW'4+tKI;بM;j߼4;Z0 &,(XIK zM'iS38B'\CGiHDDF,5; 1h0T8BA !iMmIB#."3!tJY{S?N']X\-4"1@E + y<ț# fDv Me+!aTM5LT&! (GVvEvi*邨Tpa4kJOE7j͕tꚦʒpM:S3ѯN릚j1tT?t&]?.Rra^?zF䓆ѯ;åkK4UҴu!q#:g54E34pyH<(fV|Trǯ_Di0B 'q OI_]WA{ % k4 ' gl.XNȯU&ۧ8rQOjNNn'首Nv_ݦt9f/NӯT-!ק_aXn廳)^w\O_t\/ҵ[,?I׻u/\~u^f%O߷"9VR[Wᅿm+&ԙ-NiwZګa'J})N]zYJ*=l~'[CCQF׭-tA64{OV+TjWH8ITN0L' AAq&XAU TiҚ`T ,S XB;2B"2!QTcw^5L(@Ȗd%ps ȘrGjyK72:}9,fU (d(UU\* +ܛ(FQ davi/&EèL&i%_\7EMTMZ;D*<ܴޯU7-kShhWQ-oO4Ji51Rt^fFdg@rLy( g͑ǂC4#8Ccwl ,&L&`ϧKSꝧw߮KI鰭`=/ך(z.;O[㰟ѡhn %ZquK};qqa_pdu l=w֯z֟5bӵǵKN /XwL>~IUR%,].PZK_뭯3_A?9SK_i_GIvmWK /J{{](+)w5PRD'Ocu| դkx j lRAi6e%""":M75MnaU>a0iDD~j C,DDDEuYVGuN Dy!2'̉B<D("qrAD +vI&PPNbL22L-A&I(GC;Y" U5PhQwUaAOf5Na]Jr&u,suUW̊7뫣+ !w_ƨop}ڠZ7u$) wIWkz'̟?$LDo8e \xv ;AB hC0}4wO :45{ 7Xt[nka,m-z}Z}QIړi{.ۍkXC97@0uNOItӡiZ/^%1j-/oE $JF_uaI,?_?I I}~WٚZI~_h _gWoVjO}'W[ ^5 va|9N<V{nyn$VP׆8OP׃nZq8خ( UPHkoJT4ئ u kMuc?;Mviji0qЋB":i_]=ma jE8!L&E&PDB""""#ЈDDDDRIeT3!&C0ЌyD2H͢菑ԦDH!tG":/GG0l5DvGGGFlʖvQ#A #|Gdpm.#G`$ +p<6xkpt"#A\rArcVrrCjЫ* +I suY`h29NTUsAPsC91HAXii C`CPܧ(EYXg,,r)J2@r9 ;8SlPAhP9Q(dR(DDDDDDDDDDDDD@[Ji̓99M-ߐAP0A:MƑa3Lƶv'hw-tS 2&V ,.@ j踢>'h0W UOMV[1 +܋UUAL+Pft|4a">{<{B>;"ި;!{M8w;V}IiJF%I ־0_o]o\3"(4 @ f"\]UO*II;# 8h30AӰ+ +tR%k HFaZ},Hg@Q4ANY{(8M4w! HPY!($l I($ 3x#2@ȃ3IP)!3ifS6` Pa ATOP D_׵T5ON +$N\dSe'I .G0A 00@ B g¦,&0L'/B-Oj&qV ;[aZ; +IM &N,&XA,&0a;MBkM=4/T{ta{M=uTWˍv>]hz v,>y<;$:iOM NOUi=DHq7h}Doh98he8W`8AXmZT>kC5TH~;t\Q8v'jN.ܻ;. Hm"vGvݢwߓ'zi/uӽ"#w7_5_G󢴻(zԌ{a~{'KL?Z߰J fiuo?DzDw_|sNft=amڿ^ ]1Pa[$E#<_u/o_V0vkֻ o7oP}oeױUtZmX_o^Kk[mzG &[ UNҲ?a" úT5NتNm'kAn wna_ -i^mva4B;Kb؇ 0J8q|{aŰJ6;Ӷ_ح5z0J֛TV+.`p_; SkA_]vnƚi[iwxj*7vMMvDŽҦh4᭭ A`v|Uֱ6?◦*4Ӎ8ijm:i & 4>];jݦP0Ta-v4i[Iޞ:6M4 4kK m&jL &aT=4 d!i B"""""6M&TL*5N=0_#u8[PA`p Aл#&(4„ g0AL[L/ika~ 4 Ha`. o0ʬڠ Ô5!a0#i铵L&":B eVՅ0 aB"hkۗr;sk] 0r^ӵy0;DJ0ȯӈH#CfCa7vv}N,!er8F&g@X0ݠ+5o3I3&PA 0M0!i!vZݯ7_UԓFH3)" 0> , 0B ~h0@1 a M;M`S !ܸNmTh2 flqd`L4x Nf *v .[imzaU==& <&M=4n`vޝ D28U[%Wwd&Th0BӸXM=U}4T=tDH9z$;DD&NwjF=zvҽշ]~m5^[1GwW;r;vN/:/)vwuA; R=i'H;"D۲7ӡ%oïZ޿֯4Z~vK {;]bؤN5b ӦOM6 4LpApGGL ѣt߿9)һiS wwz4u-qtiק{M^iGM5A} –8FI]Nm&Zv 5レwZaZh4iVaMS|5_ݪ‘7a4qH4imajlmt +- ZZҾ[L-ڨ[2+ /j A  򍆺ANm/_"h5 &Dt¦ipNڄ(!a23+7B(,L +Dth00A)_i޼5L*aV(M5@ G@_ a4"B"""""""""";&hDDDDDE8,' ӄ! +")\DDDDDb_VixM ( &fҠՆE P,Al*LDQLnM库)m0& +{Rܡ͒v([ +njy!Ҧ胇K[ +'~+~:aڮeȮv3ƯӕjevOh׸rV"k X}U swhdi`  &Ӷ=;! ).d.ANh;.h2 83f`X<!hWUu;t($'C„ińлڄ궤m4n%!HDs5s*fFD6z="4, 0Ap,L =Hg#"!"N &PD4m(e@u#N.L +~4a +~ႻwNIމa5MɻV\XU7,'=ZU>Z/W$;j"CN;n?g"i;#{xDp +w]dqKjJ\_Mzpz7[?-RQICR+HR'#Nᒲ;ޓ?{plvGWt!Ԟ}%xӯN5A}xc?\O֕l'Cd/xm?׼pn ޾}ކL'맯߭Z_Y4~_^rh_kv?cRe] +_Ju!? }-m/o8k%ޫBiw!/_'OtӬQ &iɑ_r|3*5_J?vhߵ]`W=EWoݷdE٧%^߽i-ocEut]-WN]I٢ߓ߮K}~i:ӯгLWuB*8"^g~^^_Qu +E;?߿k +?_Fx[uPjߥ_/=>w-VV*:P_ZJ׵aa9ok m?|vL0V!m0"KM6ꛠNO })qWV{kbk_A"QC +CIm~z]AH;{au[{Ȑ*Dkk bՋvt+M=4خO-ZR|U1mm ڧiSWjL ׵#' & >*j߿մnmqڦh8NӠw„⓭;Mӷv[j;L/([F8PpiӰ;9PBjB#j)PiikA Svt'Um; kM>{a'{XiWՅ +vA&N f e'T4Ta]0U wOO eh": -m5#pݦ0dnVa4AP0ANp4Eqa2P@ah2,O{T'!5 *aB' +k: AC4APZ`DDDDF"""""'j%QAWC'A>iZDF?@ +endstream +endobj +48 0 obj +<>/Width 2566/BitsPerComponent 1/Length 12>>stream + +endstream +endobj +22 0 obj +<>stream +x]]o帑}_1 0Ff M3`^mwfvv#GEITDc .؃ê"{ӝStN0Mߛs7/f8o~x}3_o&XƤKdaJrX"=݇kafٝ oޫ%щh\<'Ǐ>(3. w9 ]& gx^LhM7™vV }l 2Krpfg0N7`G8LD٧20|ɇ7aǏZ,} 7ZEoy 1g z1o!(5 @?ܼ[3n^+SQ|H&L.CyC%_3}zPU<//ϫviE4>z|u<(MԘ~yl&/{Y.7/wk@}l39c.Cs`uYލJY uC enәa:f[O+y;-M>'MLB0_^>v講?}tvà./(r^)lLˢφ(+%SM2,bt7JP}VUN3KMuY"hw}]2S+W~U8We3kVWfXDR1?.PHD3CK +D3+hmmlrkBѥX ߯!"zSÈAjT{7/d+>\c'~xBxdvnhl,q8qW'N+{2eř?6ܽ|k8[ODq NN5]&)K'9sQ"N,|jXOϦJ|! evfmάrN&S]1oceJvY"GFxɏP)c1<s[L>^喂Q"Z?w>==~P1UhiUmuDtӑ +qPP o*:-x*h?/VŰ8JOk^>13 C5&Q"᱁WVKE~qH`)ͻHM5`b R%|>'Hݲ8MeC +eQ簿U!)7lAD9'ܞ8qR\i +zSWD;ؿ/Ϗ-\[<^g].uaU3IkO[ P[lc0B +)}7crBt=2 ۄ:6u3W\mBDYjeiAÆtbf9쐹=$KG}amW1jsosYzNfŦu2肁t޼Av_ȮlblW]c5,&Kē.Ujz+xX_N>UJe-f'dYGQ{e8cYL7-e@ V2jL\\>:Qk>`Ce;fe9Q=8"u{%@Q]Z'@oqn5Iߙc}SwN Ya)"ΔP2:k$ cx#R``*eč5R[4*9>6+ Qb0+Gq6*/TQ4QCazj]l| ]BB`5B`1-;Lʰ Y\_{{l9a +YB.LAq%nZz +(dIt{_kWlM.x3B`٫ +^s/\cG B N0R`'g eB@6v+JڕM@埈3_ҷð10^ʦKH6%rF@Ł (i:lʆ= La|@C-۷EYZ+zcм !+d 0VV:0=w J!0'8T>mm9B1%BN.]k *E{"֞n/#cVAQPrE *2Ό'bxl,b͂t/'P2T Ga,,ǶҜAAF`uG tq%+emˇY%X%,ߎ{܋rұnXs;(M?:"&m[ Ŷ}ncaH@o0TM'`Œi',oJ#IJB,z^Eu6SڔG6W|r0w,-b` EvD΢lR8,Q+F|i7%[[؉(B{vub/܉A*t2V12:bDbFd  +Jg)TkTia wF̑5,I8eDb `o86-Bq0~qM-͟N; kX&&p\' 1G0~Y0ۄ0w6a(u[H`,ǘkmFP0m౐á?=G,>7;al<=Epز)ZBdXlNvȂ`6TT0Ȕa[X^P-mgQ\ Ճ=0*)L5g+dlz FٕBL!XЫw=[$ ׍e ^߷Quиy#,vǽR W",渂qHMM/L!YtӢņn\vk]'Ě&]H,ї-iy2Eĩ6u2NU#sP#l;/Pq8$mBȸ}4Dl"@02%Yfx`"D/1V7'Zͦ*7LnN|!FuڐJ$VvS !钁D/6!Q2ud3d1b؈/Xl''bɈ +ma0==VH/5BR%h'+ 5 ծ8\X)$fțݣdfE6`,:P TyL±h4*0v[:m&MZpu! &ϕ VN"' c ~1D˜7vy0+%h(c`Vkڊ3ivD3d1)♄}3t)2pՏWQ|NfCAR6e,27a Zt5[XDk˵C b}bLbc_Xj<ϰ,cmZ!Fv@]N;\Ω7MYصfG/%ias}%l!}5ui ,HeuPT`Q4UrKlԵ^. E&G䂅͊cD`;Ym0X9\P +N$>kNN:Mz~5 C2R̈́H*` /4lD]' 3$=1A[\Pgp5Q7gUrZzC#azT'"ja8_l4z`(]oa~`A {ݡâ]1bX}\qWM&DX,׷A1E̖%Rs*б5Lf}&Y ̑>,l]t6]0lǸXREcm2%zqX3z(q Μ0 +9r? EӷnF>,UN_ҕd8`IF 2%Ɓ34 V͵b~ԣȑ8ό[/d! )Ygsaåҙ0!3|QH\RPb!tR^Dt3 n|Ϙ@裦c N1,l~Uх֬SA6\neoz;6* atVEjmyXrG#e쀬 GCRrtt8/^N/Tbmm60j$ 8,\xhq:ks|ǥ*8-8BrN'ttJ:"e%0%DrⱪOjG +dЦC&>ss 6Um wǔAwm8$i can@i>GDǹa0W,$&ѥ R2FXڑ bB!ToB#[0GCR:C9:#w1D?yڰj22KΔkCn +6ȓ9EcAs$M$. li;Fv1S`:Sq_qRF2/6xHK)}SPVy+G#P( g1,Q +"uNn8LMs0 ` +MbZicS=޴刴\Xbwbwp!3BVHs/(h'g +jӰr,2XpulfK.2PE}Au k)#)Z36,*T29(ԣ$ +=̌W}?eҦ%~B6 ~I5J:]fKWA&` .K]"oZ_.lj0V15bl^nw%Pk%XO$PBC 6`+ aPwS @$0ɠ翼j't^REc;?1S+8 I:tj;aN$N:]f<Í"w I<@%f=r|[LH6X=cY H% CB>F3q0Vh)CP-o!5mvL<ՀLA:U+Õi0bMDzi%ŪH"Z_*6L>ǽ +ijI8F2&oh!NWDdg0LGP4L1*#yXҙ"~|(ۧw`BeNNYXTs?S~WMXf=^+uXh0A)~XXy_xF1Tr׹<4I:)y,)B=(AnvLR_ƎIv Xǁw +ƒ~LSoBO3Mpۮ0P;1uƂ'QǵX#_g+r]*WW]va1" }{]ڒhT}+=9 +8F[Ƙ 300CNHS0υA8w˛(^q|`>lj\oΚJv}B4U R65b'1CmGIwO.Vw"N' '}Uf)PscAzwAV$8Яw+4hLQ +xw뉚X )i%5{rsyx^Q.2nPwAmO3;䝦prXp mr>ܟ>| eQDIg'Ej+oOFOQ2"%.>]WN( ҥd}+r1DRTѸ-$݈6[ ]bQ]=ID3H,OW,֫mK>XLo.h umK4<_ּغ ;u2}KYcbj"NQ078%8QB?zN]djV໿k]llcVjt痛w!Յ)k|r x"Joy?/eyKUe-tyۉF}*<`~zzTơ*Ζv;g]-~7㾎-.T˂#qE/]N,qw(E|xoZ/)2!E8\y{uþ~Y)ˁ}|Y{G |РR(hRVfǁ^jjykgoֺ牓8=}ORqV 7f[%ߕPɫ]~>Tޖ*rVۈwO+>v>*e/%/Ǵ}hI㊭qЕ.ٲ=Y)o2~(M^89^iMy8)5lh[C"ΏP6DC:"#bdVDoqHqIheo,s2B5ދ6:"C-Q ,83MyHP&O:w~z!ɻ޿=N܅=L?] +endstream +endobj +23 0 obj +<>/XObject<>>> +endobj +49 0 obj +<>/Width 2566/BitsPerComponent 1/Length 34247>>stream + ,Ue 4 k5<"@AnvDl΄DdU 0Ar$@G>"L8A +iaRʍ4_U )Ӣ8{U2q ' + SAA{|NY8['ƿȮDXiUtKoVOnç}'{oIoq]ƹ}Z_$ִJxvcN4?kw}} %]uUiRWI~mTץi?ֺI-i^_^WKkRARx߯߷l?mWʽgwxJ8aӥUkU-U֩Kt]Mx~+Eѝ|a^ +Ή%I*ZZg23>"?h$qaN uOk_ת)"5$ H5Zpji' U~~m_TΟZ/T<εҮ](auN/hWڰZa$;*7_/_ׇ׳[az~cZUWڠU[W?l_u]Iݨjia*X5Ul^WUO[U\*꾚Kbᅮw&ip[R_]]&>?aU{ iL&" +_,rzo9lUSIuR5UUM0`M4CCAKSM ۾7}_zZI7{o +گݪp iahDDGHj ׹>zlvzU{Kmk* %]]Aئ[{4 [m&¦ i(n0B"2rՊ_{VJ-$xv4۽5( (,Ra0h6 4 ,XL&DDXB) +}WWqT݂mvVm&դnpaշU$a 7T[B5a4jSAk 4!,* 0 +fDba'pi==4,`"! c ahB"""""0""""""""#Ղ32fJ٫"QEGG|) aV„,d?@4_a4TYGdL2ՒA+qPDdv50DYPMp>WU a\!"aJFqʘ" A˓Pȁ 3vUu[mhw 4_Z.[AdӼuftuxOĈGjB|mw_u]/[İA|e8B8Gt 4mfd|`4<͈g_MP*U.NAgF36O#Nfgq3PӃ&AڅӴa]0W*woK #gl6N!3n=g " ߞ\",J㒡 7%9 ] 0a P4CT5'i^]A| 3]ENӱ[0(=4xN tt-i,*S i~޵nIQoDݺ&'AڠKӽUiPSUO zatKڦsz~TӵbDowDߢ—v 6ү~F>N:WI5_ONo,~&>UwoMtô\-a|{|ww7}Xo&ݓ\d +zQn[Dl5 a:%Mo +uzIwdMKN?IXj'jky8.kO83oݥy/Dy'GN}[~~?:䞷^rs/61WN,7v1; OI:{_8c5N?>}k׃UL?{.K6_~?rdR{ _)>a>_Яn߅{Cu&wWߓUt7}I~R_8owboE]hLm+x_3Z$COo_~փE-SDwߦON=P0O(-׿[]}{T}>п&_柿Gz|ˏhXwBn{պlUU[c; kvj]Dz#W}7# (}WkۍvꚄG;#OȺ_wz}Up«Wdu^~[A,\\C_8[qqi{ſ o;kߧ݆ǯni cK 0°èN)j:ӿzTNHzW_I"b'_\%vISV;NO +TTRa7M5iii}馕_}o +ƽ{ŤƜzznakMՊOثOիAujiJBӰ˄ ' -aeAA}nMZ 4l 5NF㥅MvMݦkjkuUװ ¦]0p.a+8*qgIʐ7Ni?C_AtwM4 &iu m2p ,0 +@'B&h0NHDh4Rb"&taD~4Ba5M0J 8Fa pg8! ! HDDkDDk$u '80㴗Eq]҅  ]:VO +m&ЎXal+B! 0B1"a!u]k, aA 9g3#v vkoVNi PçL}=5>Z^tԮ~zF?si?/EkvT&?XwMbm/qmIփM_4Kr! v0v"#,tZÊv.0Gh3 qaH"90 +8"8D9G"]":.0Ֆ.#Mfld|\Sh#:#He<\5DtGFi:e;#KT u@ [ɎS?5)Vud(s9;LXuB0MuYmJ)d5 ;R@ x4Ls0rV@Ü9[VSXT0ʰ#:+fG""""""#6fdRqg ԉd*AUg.v™L/WzPXPOi}dD}i}}[ M,̐5ooxAGSaN0O dHZ5n6fAf=BiӰW` 8: +G'L&4\akmUkn߶}MMI[J>8;D[NkGp{V<Ȓ"IF8B8$":6Gqr>{#pR s<)-B9*ʂ p9G2irq0aNqІ[G7eG#rVdajGP沐POeB&VN99B9CBU + ;rc3 +9:9q9CaBd: + T⠁GA(!9ng(r8(ZC αΥ#L`L .2@fdd1Lˌ)LR" +YgjMBiTPPNMs$ATiI$ ǾH%M'idO;LIV;tR 8AG}a"$aO}m4R7K!dy"4>*֡O,T˳q渹A\% 3(@t?D$MAp/\!w~ЃE_8z,|_Ҏk[twKVj׵m[Um&;6J }W )޶IݡoKO[_|+^oJvyQTJӡ ;tow5]hKMLɷOpVw}][~Gvf)۫zy_ rtLݜ[w {V]\z~ 6Ga[KtWZzwqݧm|Tq1QtDZ.0WZ{iӧM4ޚު kjVnWzB5Th4M5ڧMl&5l&M§!a( aa0A""Aa3@Xqb$hSQuia yk圡KL#Qؓ!Le D$CgH)f2@`9̋9 +(X  j + ;NMڦ0SM=XMBiJ*jS ;{4NRp;O7zemYsFd'E.F>ynM_}^xbPzm:8{ck,$i35?#9f#{3 +f}z~]o;R B„V7ҏi_izW]uDmr-z^ ۿ_n[E7oix? I퓲wCul]u|oK/w{NݷN}_]W_%V׆!֒V,?K}/kߙ/KU{koT- ROu k ,%H'3IkTO)(KIKUۯkn tvIjqI +SmR[ 2^c#q]MnM0at+B(%JuDS4znb5vLRUT^Ai6)vk𶪓iӻw&j&W֖mBd*a0"> ! 0 +PC  P^AaAYc@B"""""""""""""#`DDEqn5XB GL?&lu"c(fPd6APgB#/ F&BBdرuf aeYYgji iTNMڜOmmBiijO jDpHz$=Unݤ;E AAK}WD'tZ7,av.;W<1x}:OӋo=yڨ;?S4=5xc]}#BNB<. z +5 TӻOUD({J*_+&6XNSA ޓԓޞ=Kxi" TC׷ں6~֟\=ڭ륯{_(}øwh66Lr/K~djIx5.<[k}f j=K=tץG9gHklyISf$5uS*a Bq}l_dutITR! /iPauwowKzjރPUS1 +JMZuin&iª~liMUBiM50iL*-6T&Lp3@A`$S)l"""""""2lD +RXQc!9i,jieuΤN̜fFFPD"2 ,i M R a0L Ta0 ɲdDvڤM4?xP]91ڤɎzkU ڵߖ厷tNJNMzפ\JW,\xυ63mMqs6d惈gc0fA0?[MS]v8tPX!ia뺽X;M;Ojm[KE]=?n׫ .'}58Pu|u޻t]úrQin$/5;'muM&z{^oz>?7Mop8Ow^[떺w[-ܷ{*nZˊ.?7:"wf]zm~_tVkGk oyS7}?bGVI3A+[V'̫Z|muV*xյmc0L+ .m.⢢;t;WpE1P) Я֛M=Mt ӧZi{M4L'k_ڽUWAah4 +@ 4AUN5 %aAB9{""""""C"""""! +."")D|)بu_`VYk +ZbqڬB1q F:̠y ȮT,)]ma0MMvjaL S*eALgjy gjSL$MBaPz4h0 {U\*} OǾ.(Kq9wz.3NM =K^yo;zI [wa$uX0Bt%4vӏO|T/kό3Lp)q3P@Tkh<|&a4&0BM}aUO*BlȅUNN?چ[?WwNݢooD踿N(P_x[m-zI./ҁp~w{i^NSputrw~6{?{j~}Cv^z{[]'tXۧC=߮X~}>f]V~Ҝ_ˎ"?/c>~ׄSKKΘ OuR5''^-Xzo~qui>3.G]¿|__v}qM{ 0ɰSS(Zu"*+X[[i5bqL}_X):M5jZoM'Za4ݯH4N5>INj__څ 5ATMUmVuAUDDdɎ;BBЃDC0DDD0 Za(pDDR+DKqdHKOiկAGIiDwDFu,fWc("ttA& + +MKp  D38 "=@aE,ڢ!ڮ^ SM44Y6%4h0ֺa=5MS +5Ț}\V :D$ZLwnvSE;6 oKm_lzލ5Jmg꾟ZU_ c^.g#8d^3gF?4bZ{ƗP~-l-4!ӻ*!+?д +;Xi^֗dI{zWݥ}Hz} 0/;|0 vnNtMa}v]vNxw=D'|?ZZ^oocIPooKwJz_ߨtu[Kmk/ɷ/J ~=߭--/תT_=}uJ 6*#ʗyOUH__%'#5K +oyH9A3}]}#Jׯkqݠ[U6hVUBBKC_R,oNxIb +b +V+TMu\zI;[TiW) +AmST:ijiTª4OkL2A!A 20І aBf"""""""""""""0`DF%SQuZVQ-d"fͣ^YΥFR0L0 )]O ́hGjy KȺ!vIT5 +d0i#  ɰXs.JAL& &M=BaS5~XUZO%{K0n]ZwW]zZ$yhV̽Ç>r1{$ >nC8S>v 7kZ,ZޯZ?ԠY6fL#BAŜ#5 +`͞8`DP'jaTk}{S߯WI^/k[ˊ&wa7[a[5\7Ԡk@a> 'rPJqnޞ>*m׾ opzuMKWO߿WlwIۥ^ү?^N?WqK/a/PHGPU- vKz/a']B[ֺPſյX jU2-N68iZiI EIOT ӦM5wM{N+h4PjM~A_Mia~ u ia4T'}v~l e %:h4ae !e.0B‹ND3a-zU'L"h6e8D8AT!串N0L*i@Ȃ0 +k ڞtiv `96S#$ڢ!ڤ 4M0MSL(TMa0(A4v aBnV1&t}t>;[;t)cMhtN=&xm{a6.6su֛~5k]UY<'#@xyNF3٠C3oJVu &iL(NF OM4aҵj_ZnahZ^}pvީe\}& ?{7ևzI䡷hiܜmoiJ;aSv/uvl;}y]wu \? .?Ըn_$L~ޓT𗙯ٚIݯu{޻R{<_^\N5'tMZy&뫿o]:.SFL鷧ڞL|xuw^NIn[OWmu*?)"([~=׸;#6g P dG#qA#o@AڋC]Su<Zw~)?~Ou{TkM+_t޹qa:'PZa靚%ڒO%cڒ{ >v ڃzZڮ>xmu_ݥ'} Iv7ףS=M>;N~ow دd~+o[tʅˌ;uAeZU;}Sǯ=ޑts~s_j} -oL槴Ok9Gm>{N.)VҴNp;^֑4CSMMӎ5c4V5V*RAONZin{M+TҴ ڮJk 0a4T~a2cGB!28J&SFB0f U! 'aDX5|USEc5eL2!Qթi2a0r55 D OM0@ԤΑ0@Uk3;SBjTMtiɰ +P55M}5OTӅL(UWp^'oh-s $ǿ,tmn$N>tNߗ F֨כu4_z_㋦5U띬ƈγ\G2&yG#l陣@:Ak^;R +'8@C3PhZxT ڏI_uzK\! 440UcLvv/ҿ^n&;am>'?tN({uow.8VC 'CxaR֬?aK_tNӯ?Kw_v_~mB4!Ї[n-*_]D[K?-}uǯ`WIw-&G'[\gG\3D\οj?]&?[XI#ǩN4 +.ڦoomwźtШ)>)[ ia.Voj~'}ǦnxK_ꓪ6*4kmhnJNi_MS[]WOiG ׵]4iІMXM5N +\4vabˬ"t  QP!aɰ `DDDWHDb"Mօ$_mDGZbF"I#3ڪ)F3)P)g PaPd@Ƞii\ ԴL2^aTj̵ԤԯVTxMS &B +T/jUTXP Dӑ-c7}֔=W ]whhh,nSEX~j'V|'xpszUeXh:J[KL=&p<$A3C0g3l!u^.A4;O?oQcҿկwT}Z!6ozl-y7 +VֿKK .M-I>ޞ[SAkUON~ׯz_M\WӺB'vzÆw!>Co~nV[u}]-|?K/7Zk|}~j*[ /©IJf$a#u;4~OӷXlRn8Sm#&תN=2Մ] (cH=O8wn:MMZN7L-[PKI=itqwժ鮚wjikP{M4tªa4 i"a 0X&]ڡ DDWtVMD|EhG` +a2eB59Fhgj#/̫d&ʹteڦ S 0; +jza\ 3za=<&0U0¦U]z&;4Ӻ.$NA4_-\fזM |kA|\qZu64lVL)uՠANC=^>3Nlͽ3B/{zkq]A0-0ޟ}TX{TNª_>}^{7nqi8텠oz_}> 8}OOZokꞗwd[tֻ^J#p w!?B/ o} >_mRuwV\___ץO}/ΛZU + $g;e t[kZ5{م8֬I[^m/mWk¿ %QTwiZlTTW cA^C :iiu +i]'vӭ_M~ ;A^;]}:2$i-0[ !L a"!X6)2눈DDZcikb>ZKH2fYja3!M4Ԯ.D:G\9c3ڞt0"M 鐑5bDe^vxJMuj TL&i a4M Aj?a4=5TjU5L$WEӵUT'kiޟUZþvcJE845yg&ð͚l<[tCX*=־.; +.veEuF.gvtFi333Fa {/; `0B :[qӇk:ײY_IkNRMYk y8gk0z |)ޕp}%^1uipO +OL*I_~=}uN_TWHK]?>BmS^V?4Q8ۻMW- io꾼=/ooMﰛtN҃i~ڄZz^˿rwzZ[]ץ}xc_w _]>w6DiD>|m_-ޝ/n_//fkoKm}uuRz(]~eXGG_յ;Z~i$7ߧ4{C4 A5>+[쎝;xa644&`L-K +czTqQqu^ƛ&('^4{m/M4{KUpZO~}i}4KT;T0[T~Aa5U24[m4# 0Y 9DɄaEDDDGڜŏKZj#TDqж夰0PL +WD! ÚfvY=:&L &eVeڧj a4jiMB &„ɰGX_¦ T¦ + +P?ӻ_?BJTvr,t'48Ǫ'^ :&771 7l;=$\Vǵ\k}(O̲:(Q#5a3,?FO{ZjL!a<352 XL'`͞6‚ץ_0vh5TK׿!dENk~U%𕯪'g~kߢc݄·ﰞ] &zK?zAF= ]l8VnNOku-{k~޻߯ߵpGMZ?T6=/7^Hs_w{Ҿ c2?z{~_ K^o&;_o%_;_(H zuIZXLkuJY:PwmR5?V+_jߴV)׊KBWٛ };u_OUiT=;MMA(+>~RmSi״~vHz{5T ZkzLRP]]mU{MmB5 ZkaSMS]ia&A ,3֚d,3&4;eT]"B$`DA"""#vh2!e!DDDDDDDF""9Yذzv|‘Gb3ʒ(fM+2qnG&D&&&iL"ADHgjL h0;RffB0/jyO~z걦0馚?OaHa0a}=\*vti… *2_5ND>v&;ӗLwUI|c^$H?5~g@K]?_GzYՇI͔AB:b^[.{:i"t}'NBGCO#9ys=ԝ򜍞>޵[葉v 84Ch4`T׫[i_.~^'ޖ +EE"KMQ^׾鯖=¢]&ZPw|xao]IZ't\TPopm,z'dRq~N E?۷z~]~}U=M7ï{]\?CQ(֑wO}_ýz:!*տJZ:tح/a?b]55_f勵]?T?zku/_=խׯ{\jO* G #/5?߷XўkLݜi]fRy^0V6WvR,=mAL\o$օE68Kb*I駾jSA'p=&tumtOUm05m,/m1IMHjQ״j~]BiL&QB & .]Pa FJ (p)ah +B &^(!2!3B 0B DDDDqG7Y;q~.UiD~Zi2&F3y-FAHEq٣:d% a02\(Agal ``4Aɰ(dDv&_Ch445T*ja8TB꿿ڦOMStOISW"iȚEt7kҤ4 OK[VwZ&=&忛rgN{tѡ_GNAA+m b]ǟu'_({OPt]{o]^%fh# <>g,3l3!^q h0[;L(A_KJ녿t ,.TrǻZ +=R [݄a[A KP=ׯPK Y[to+o/O__-9;*?zKUꏮ2u\KoB/BoiJ_5}oabSrfqsC !vmEtQk|^iE_F'\RqA5Uz}o龩;nױTNNꞩRxA֚4UK[T*itPa0K 5k 4L'0Z&0L*4N3qan3 ZתGXmfZ*)i딶Kr7f#- vhd1M U ʈI02NAɲ[GjU !j[aAva4xML ӓaT3 ڔ*SMW\*TӸk …&;DNӵDǭBIWr'j[ƃ"pDA͘_2'FBmV4eƹoE( uuOޟuz ?:k ﭨO.3l;)P 3)kH?Kx~X޴N-SU?☥[do?oKc/zվo\wޟ~ o_թRH7oXIZONxk`gk _}2?$D_?Ӡ^o~]un1ڇw&C d}׿ Sﯤ$B E/k_gNMS_okU}[BK^ =nkHK;]rXb%XAB|$4kMץ={i;J)('MtIqTNMM;}<$V&kt O MmMzWTkz4oUv [[PpO Ћ B""v . 0DDqHDDDDDDDDDDF""Yi +wA}jv +#:+)5(L;Td) 2\lGfafC̎AFڢ! 2NDAI[aBh0OMSTih4iS3" JPMui45AM0U_ߖ=SOMWNHzziT_} \4IܸHGE.us{sguw\9|ѽi|'Vz{뮝<- Ak +Jn!iy}[}?k}=;];]pS !g l<f u8u +a0P%@_ToҤ-蛶N\aroOB_['w~'Dޗ^T!%}/ޛa;'m./}&I޿ amJK'j]JݧWmʼ?Uo /Ԝ'$^j?m֗O$IuxOOTFru{H8=đ|5_O[U9mRӣҺ&nL]+[5={[ =6 +PWijh}[bط^60ƃcMWK&t;BkRU4aU'UZ_0PAֻTzip[U?Xfa04RZɸM8h0AMDvAE@XBXX4Ɏs`uB"""#,,DDDDDDDDDDDDDF">CA/=~ +">Zah#\qdp&;聲a3!dA8SC;35dvGjy D)ɰ:fUGjH.4hj =L&k P'k UPa4TL'i ک^O޵A_þR~h3Dpv~qAk8znhTv{̋|yܨtj::,]:m<(s4FDNQ{ȁ q׸]|$AgX! `3dlPP9 dx\B`~J־N4_ZkP]zjc:OvOkT_ְUW [o\w\wPL7oL(_}~8Pm8%tړ{}?];.];MN~ao _w]_}?lp믄__mowOɐ+_X~4[i߽mV{}_^-iQD]Q˥~}׾m\斪OB>kH{kեR-/8B]a$*U]Ф; +ҾqI{zۧ] Xb}h( &®Oauڭ5TBM4ݤi-U=}CAUL+l'xTӰ\&i[[L&p…h4 +FaJ ̅ hȞ! ! YKA"""#ԄDDDE!7Zv,:$U +"">Zm)H+9i,2dgxda4R!fd2 v" N '2a6d!ڢ)\ SL'i(L*XA40}§M4 +]0iI_UYw]Y7;ܱˆiv'z㠴륿!äܴ2mzwJnTD>X_XOxB_'k#HYϣR _xt!Nⴗx! ,n g S2Ǐa4?д>U_B_C'_ڱ D޹oakH?]zq 4A0Ӽ-a0QL}d&D&&?k_W =u]onL{Z NKp';o}=%ll/nrOHwkWI}; []U'zҭ?_ӷzHKO^m/nqzM/m޿_}R{o kuT_]jk]UM Z֯_ɵr7-# /_nZaP0zj$>m[zS./kUa&VQ\kWUCau{ؠQNL wKb&n6֪$mUu^5ᮚ}4]V05Z ULpvaPh0jaPh0L&TSVІVL,dքDDDU" `DDDDDDF$"""+҈IJ @^iTZ"?-%.;Nf#WY 2 +FFP3*3!1>T„0DaFړ av(U0Y6"2apL)ꪾaBT¦ Bw}{M%zzkiIMu-"kwT i7z*wb wI; t' .#ϔ-.|;w"D._AZZq],O>F3ms4E>yg#fd:PNQ&.X!z;UM돺BD&;iz}-,|_{zw{{Z&o|6pyw +m"ȣvt蛴PÃt]]_;o6K}O/_?/յ鿇w_a.!o}_a-u%|oׯb߿-zw?ouNm}_a0߯>.o9i=f=uAo>]tՆpi&nSo$[msFJwT3z:aT\⡭\:_t5oahTSaSVKN8jj)M+b:V*IM4kIZ֚]SIkviU]joM=mS_iݦ &M ki S^A"!`( 2N" B"!aaDDDDJЍ(x/uAկ}{QykEbڜBL*24̜<2xʙ@rguBA"pɼ6[ OUoaYpy+*i&Y'oR J}txk ]\}:GЬg fq4#L;mg l}':::Zi;[S ZiM=4„wv됛R4Oc:FFݧ}Dމ߄S]pwa=oAdӽ⾛{?(?X=}=VrwնnvƗmz5׷u[/~K/B|=(ȫ.-vd oTbuAS_G=׆/+w Woz^_W~ +#u$rSʵF{=r.y|PuvGݾ[uQݩBVfڠan +KJI6ҡ׶qPҊ=n*;)ҋXҊШ;zثx*q?acj 5MIo@4{]S 'ӵU_M~{U4S +魤j0L&M4,4m0pAaBaa5 M5La4ժh3B"2 """""""""""""",DIHutէ¦0^vgiN@a2`.!Le!"1T2]NfP(AefP3"܃rl$΃2jhgjR *4а0$ 0ڔ0[5Aa5 +駂at/ +{kqOMtLxO鯠'򗻴D&厞87'I7z֨~uqߵޚ}(?,2QoP\93t:NM֯?=xN?Y*]Zr /.dt@jkPBנ_Nm=?KS_?/Tvmz]?#/vKm/Dyd~=9owk_ZtI_]v_֑?;ޯ}}S>Ҥ}u']vaS7v'IkjNKLEqȿ[BalHIbMaQ!fZV JҺM4ڴzj\qH: lRhBS*h8n5tMwM7j]S]%NZUWᦫk *aBk 5 MSA# AiXpMPhLi"i!pXAi 0P""""#d;ZjUi婦v'4NfY] +Mn[)LA-s!\dA3ڞC$Gj'ZȦՂjfP. ꇄ i_Z`BUMST04 yM?ֺ.骥vK?."piI-muGF2aƺNQ`˕el)M]rӎ{;3G8ntN,`i^ ?pjma !J*y?\1}oҴ?}XvzP{o_KhZu-Pur{{[~__i_J]1KR?GzYj{_vxJ]zl,R )PWYV7IkD6wK8m(J.طCV +k!LRqLRW0[ZA N6Kح*tb znO+UIiMtL&-aLuL ,AL i TL'0B) 눈aDDD%|N5">ZْBrөړ!L qxԎAQ)ASF#"H2Xgar^aH* i[P3tSPU]m5UTӧPMn^KDݦꩪ蛴ӿ,{'ӦIqyqc4Qhz}>tnA}?i= OӭkzH&* +*!>:6vz/\:LyIAKkk\Rt +ǃt :;3l<&y3Ax963oA ui6ץZ]^MmV f޶aBț3"jW ={o_ڧh:[,zm[ׇOM.z&qaro_ +J7v>68]:jLtvKn}ޟKpy'݃$7lz?NӦ6Ӧ/o_LJ~Cۺk+ok+xz@opkAl"/7T׿]#z%KH] 紪r׿N_۫IO8[I3mN5m{͚ٶ4jM*J!m/q:qŭm.I +m(*)Mb)U a6)7}AXV_L&SUT.x%_MV{M~ a;TڦiւT' +Zi8A P%' 20h4h0 0AC PB""#눈E/!ZbZNֵh;L(Hhh=2 +M"WٓFhgj0 Ȝ)́MfS&gjM T aTh0 JAth00ij  + *\,}ȚwEaST[ +rjtEA??pPꔜ7IE8z'p5å}\o^iޝwI[Wi7TLƙs5'A}[WC{\)!3m`f j1|Tw݅ZoiqnT_KuU/ҿ^Z[\۰\w ;w^{Wy8M?m_}\6޽/q^_OO=wݷnڤLvEc2wJ8~ _/zpip wվ;>$wm^R=h-_ӍNFp봽54wY< *.lCb vC Y aNuJ0ګ80ƠSllV%bbX6)MTݮt*OZH:OKM:L&[a5MSMaVj^ Ў 2&D3j4h*ш`E !a !`馘(aB"""*"""""""""""11Z-U-#H"T3ѓg)q3 YGL&RM +dٙ vC3<: #DS@ʈB$ܛ ڮgjw (L&Tm4&5 L Mm4jIVK>@1ܸozjR_==m;3hR_ThJQo#zt2.J%"W:+޽](띩>dhZpʹ6Sm3)WIׯ޿Pơ8T&U _߇׊ +.JџrB&DN׿o__Ao^rCE~蛺T~~n7]ƿql{{n]4N鶻c[M~ޞW_[MW7Ufå>O)TWKׯTM}N֯G.Eiu^\00 xI$y[M%kMM^c*.7bm[I$*)\4(T*648a7ix@Rj}8&iMWuݤpM>aVa5i&m0a5MSMB SM4ija0DDDDhJt """"""#lb""#]|+Qi,D5W)q te2Wd#'fDe|!, +#22;$JABa4-B @΄daAA0 4̵2 dkM$T~ i +[tT=5TUӦ.ND,uv +\5TM˺$=uY1ݥzfݢqoI: w-oX{_Dx]7|߸y`ӿOU%-^[Xo-Ro_?f޽/[~z:a'z^תﮖW~] Rzu_O:wJXv&b +}}ob}_?Nmx~D l4J˹f fS=v>IGV;O*iꪃ޿ޯuBJRwU?ok3,u]h}}wN=+7z|&w;o=ze0Igk`|?wW}Kt`_k&?iibTi>J;iPxc^M]̍L?)w[K}]cq-$k(uo *G}[Rx9 o\_|T\v6Y$Mi![w&M& 6q馛Ш4ؤc|RlPMꫠ{Z }Um&_{kka5AMBi}[ aPga2 vP78hZ6 & B a2hF4B"""")D ըc ȑK9\) aKpq*` )dQ<FC )62̰gjAjUP@=PAA&OAL*``0SZi&Țp跺j.zj״:Dˎ' '~>#]6yBwvr[KhOƇIڪ}O|\VG54Fk)z)B=6,8f",ٛ4iͰ鯭wMV/T/jT'?ÊwWok}_W҅wO#~qEƿBki~w˶Z] oߎA~!m]:_uA/v/J~;֐?q*[zhޟ}u꾯Y65K_kAjj򄧻$/^齮[I#ϿH' 47й6iqpmw"bB-,J;I?ץUMhh0 -i{& hU1Z]j*)ӪztL+ק髮IӺVU]? +5ikaWaNA;YRn f$A GAT[b M"1DD4g6H"""""""""""""#-1a +endstream +endobj +50 0 obj +<>/Width 2566/BitsPerComponent 1/Length 47674>>stream +-1R;CQԫ),*hGX"D\іi`& \- x dAڜ k3TSB a&djfX3Y;S TjM +4a:aSL*ڦ-5 *iL$D"i[۴'蛵 +TLv$]w]xM*'N'~.: Av4PT#- +å?հMH=>uuo,^Iۨ_ZJ|ħhyvx3qeShV$5V^".6h;\&A5MA#lh?[>kw?uv]?JBKV50W}Pu\}O_EO\kD]4ޠzkթݵ߽Mz^.;{!>:rc6o^.kߠ% _|"%/1=zN-K_DhXp__}oݢzxo׿/vh[PfG<+׿﷿$}KZlTo޿%o]tkkGﵙFz^y/^W~($7K $ħ{;UM'TRl-0EJ*!o_v*mm붕$XWq[*M7iv)OQ⽊N+LV&ޖijӷv_mVA[[MBM M~a{M5ivTa &P!`2D"fg&I A",#! DDDGDDDDDFZfC;SֽU?-%5$PX!C̬΄dN"IQfVGd((P0M2ll̐dA38&5ڞd8&eQ4CڬUcR 4 S  L-Ӫ + i& Ul*jOm\'&[T$;EۺDߢ&hO˶'ߤ8$tH|y}DwI+=h[a'1z3ߵ,^A8ײ9DsSza"vx55<h? xkń!h4!N-=L*[X~uXӿ0~{ KZ]mzwN踿_{u {[\7nO['oEŅK'Dޠ>i?}j z,w,,?ۏk]kW~A [P[;ο5S5ٚ7fku/._"I{ֻ- Za֒>oOWd׺Yt߿XvNg5=$넌JikFIA6jqP:MW>aCtoZI +$+)PV[azw 6qNM 1LPKLa^ A=wNi8ڭ}=]0Z[ jI=VHa~L/M0Mj jPhX[P4 ! )`QB" Du;k*\4ˆ٢([#P&wF vtqTBѫ;42QFPgAڤF D'&FPFT3B(#]B#KV +v +`B J02C0A>P 4  … +OL-4; OiڦӴJji^m'2uwMA ]Iw&=W_TNі>Mc\f~V{|O6=<&mӧba7]'˵ȏL}TxA.CA ٛ|3l?-kVB@MW_}ub?}=oRaZhmoU{l& D·xn“Cv\u?]&vT /Zk? -m>WI|'^MnNMvoޖ c]_dfi~Ut)+-ҭꓥ[]7yTiQtt}qZVk TsoPKG-AMǵԞWTc^҃twqHiV՛i ҵ)6CMZ$I:T4ؠ%[]*V)6;i4զ_7j4AWZiUKkiڧa~kia4Ӱh5]Er6]CkuJZ A]AM< ͵?bx AªD$_U@~7ZW~[w UvM˻ qEP[ ׿m?NIútzn>0_ׯO]~T][ER/Q};~t`i~xTҴMAҿXcm_T/?o*ꮗjgҿ_]6{]zJa;v_H*{ [ޢT#&Sji^%O󑸐rlH$%߆_]C.+M/AV͘J %jjVHkXIlU֚z!W4}T+RlW*q[Kmin?Un& [jZ +޷ 5]0ii4W ڭ& +M8B8a4!C$4 hg0B"DDC210@a4;ծ# +ZFvf#YVіGFd_(gjGjM +e)F/:2  JAvHʦK( Za kiT 0a4Ba>TPiiMSM5L*~Nx|'-n7iD? "'uߩ8=(Ui'zt\fhaPv6,a={usA׼:NxL ٞX3ҺP[@_c B4[(P!uUMw֌?Dﰹ7~77JӼ'M/`Z}ABu]^VNot_$y~w~ֿӤ{п{|_I_#u%?aPZ߿Iw_oK}'{%X|M]*ZI#ʏ{~(?mkA^%?knaҏ_¨StH~圕 $S5jڵX>{a EC [iiE]V3l/*t4N)M; h4LRa ƃ Wq] Iukګ0&M*mS38-0_2cU]5N¨MS +=SUB""#,""""LB"" aaDGHDDDyYuNGL2E +;TeLyڦjfW:ah Ƞ$ +Bԛ("!AgX2@ #!Fk*ASM005M40 AOA_w45TMSM?TvZ原TW˶ >.a!7=.IKtAuyϗk 8pb͙ןύ)_[KFOӸ5Zzq x)υ@c0FA _.=/] aVj_ǿX}kU?I}m~Ekz拾aB^ҪJK#MuۿtӿLu u^ҧk5%I-~Kt ǡUKIaI$CŭZ[JD{6ÿˇ dtҤխ$_H]_%IaI]OuG]ݪ__GW}IҞH#|0}T''TixH=)-~h{Ǭ^4MK霳CCtt7v UU)*4m?BBUjWkzktbN~a40R[1Z]4뭥aPPj~!xAAp-4aS[ Ӱa4j~"""#&dDDDDDDDDDDDDM:ZiFQGZMёvI 5j[)b!#6FD#\fc;[aviT LJ a$IgM02NAa4h0aSL*jL. PijNܱӦS^U4TӪz&Oi_Iӧzia7-.!G=w,|:,B,eց=;6-MW67JlM{j 342ta2t\ds3Z h%>/{ j===FN3&!!h3qڂ _LvJj[<'~>g*umm/]Eo'r-+_Z߷I(޻] _( ڝ^GX~7^w_1]Rom/Ka셰޶wp[NI/-*|?o}}2I{5aK_QR)oa?Wt}-Tl~zok]?_^^, +- +Hs_4z6M#={`_8Ju7X(!i!!$SBJiG^qk)4+XAIWZz$A;i mRuajBkkUm.L/p0&*& 3: )аAq$">BTR7 Ф"""""""""""""""" hcNVc失XgbGe⤊Id;T2A$„ʈ(L(L!a3J g\gAYNxR#dD|to4a?_O +K +h0P2Da> AaU*jaBIU5=ԙܭ{]$]S'76ftˆ' ttw^{6mw]oGt|=hO5 [< !3`!Kﯫtձ^~wT_\|Q"wds?8gH8y2){ȅS4}?uoM0a4v qi!ax* &0|3l( \}W=u?X-?M0ޡU=oJ.֗cwi߯OMnӺjwVۿn܌{.ܸ+.. ;(o׺pַxM.v֙v8Z}w :Uۤߥg\:_ztJXp반Ac;~_׋Z{%On%z_,?[}ツ%_׵_WRޭ]CL'_HCPI/au=Zmuw[*⿽z65nZ .u^JIҾaB4})[Ks2ZG?HZUhސ?<]}Ӿ.q]sI7A CM]#;9jR]WxOiw]kMz ( I6ҵOlRM0Tjj:a4OOb[VUkޗ_5[[UItkڪ ]p aVe- /ikikjAO`DDDDDq` !i hF$hgi҈ +#,RXAXr8a<4FᜎG +GΌ)|##200G͊GEG Ta/DxGB"""""""""""""""""""""@Y쓜sXṼ3!NSC1qT(0>eP( 9cŒ9c27!)9+R" \9(sAlG"bv6Qe1)DDDDDD +EF#!)rjIHIa2S;f\N[ s,h(,;\(PXp M]?pӭ_uÆD]d]w;d8ov44W"h;FEmb7Q[WW VUUrosqE;b:22>c DDH;Lg hPdCDg"B\ ds!G#3B$#0g36ilP@r3Le`0D Xa k08XAP^@ a!h0B0BA Au ;6Z`@A ͂ L`0@a2d`(ap # OYgHeQd "!aB + O[N]oAh>a5Bӻ ӰC +a5  !aa 4!&B h4!i.=WOiMY?[꽡kv[UXzkjZxL&OD=NhH<˻މa<NݱM}}YqvՄƑ8h'˶I' 8v?Dwz&D]tI& >M?'&GWӿ#M%oFN] l0ꣶkڧ $?ӽ;KMdoD ޜ2(w`D%nK ]__v C=7=uQPOzok!a,vW/㒷쓯$:y+um|7A]~}o-Soߧ okzjօk^6M_V6AuZ뭠% Ai_t cw ixcXא`pn_!H$ y-CK-؅^ B Q ]v/\'Ra ~?~{{a[WU7 =D+Yc?m ~_om[puk%~?+NO?4DVFl"7#z 'H~c]{_zu_"Wz_ //O~EPO٧٧ocx ꒯=v{t^o־uy=H/׿¼_뾂Z=koy1ۧ[w킰a$Mn}ῷ zKװE/k_^Ai5mz/v&K|luv}k?AZz^݆TOZ_jmq[^/بjtn?M5^T)aXX}qvi'tե {XЃ׊.խ} }H4ؤL:qWzh0j&m8AM[ 4h6k"AqTibMƱVE:nIޝSi_lZqLh[I&յu~M=4omM5/55AӦ&t tꚪONki?M4iz{[P B SXam55L馟Da;߰}W"k BUzuU_&ia40[ Y' S* &aP0&\$bHB, 8! &`X FNVa 8A7`h0i"?2v&ڠiaB ; A5UL(&J#ApBxA""""2hDDDDTFDDDDDGIȦ""2{K0B"" %D`$A +ZKji׫a1 &eq">MsX)D܈6e +v,L hEs^ +NT0a25 +MB';Y^v:s& y BD֋{wMvU9i6a+8imvUI})㤺`;v)W__UW2) sq5s5e a|O4 .NDm2v\xՂ2!s'd$i2f#AeܮgR("A"tki(#^ˢ:5d:g@LkF1Zd4Fy DRAń qa>h &  +a :a E +` (!a0,&\0L0A@A20 4f a qh0@a0ك8Z`<)fyC33# ea|A{am4-4L*vPkL*aL&U[¦h;M4C4Z WӏTA-0-_PnM{Mm=? NWZMk[ i]=4t{O[ hvM9vjH~~˾+oroDRoJ|ZwmDm.ԝYqD7NoOk0\PM d)N(0XxMidQMۮqvE~NJ:Av; +#'։N$NMa$6tR"v#Xd7pn}J=B݄lګd?餞+տN]'Jlί;O!Q;KuT6?MMSu=~8¾_~zӯ_[N]~}nIBj@t-5Ac[k}wK'!q~_kW&A2ֻ&c&O2~]Y->W_'Wn۽y::GDm?ӏw; ߿y^[0G#_Oi}}TڭZ_ֻ[װ^{m kmWku{'կ~ _a/%կcOa[,'n~a'װM/K0cGatc׾մq^Wlq!o_?_Y~)[J鶨~gt }\Z1q+L4acnQIi_}*qCҸ}{i! u^+km1]AoUI M&j?4 M wQ]48bݼ~i=6)0 ]itzڶn骵z{i45]TKQtnikچNڴSA okjh4a5Ai#uL/aU]k_[QmGNi־M~/MS0LM4Ap LM39A A,"FhA"uaALi ' &L馜2vA4@a0R# &NA ; &[Ta;O1!"#МDDDoKJB ZIch*pj>5a D|Q*M[ad@nyKqiVQiN5XLjXiOyoD 4TIP<2+H64i]8|m*7{׺IM`,2@rFAdA^ ȍH4g4dmA-A=4͑0B0LلD/F d @<0@ a|SB!ٲ _opÿᎫa| 'MGBh'OJ⿵_b//^N: NDcKT3;D֓i逸ȃ@]?4t޾7{T.Я}1c}ajE[`U i놯{q} 'Wa[\4IeKUz'M`1knش./V*/l%Qaa-Vi4a44ӫAuӄMk}M7MMi*w qTHkQM5ӻJkBv4"*{_S^azidcڪvji{\T2nE{NAG # a00dGaUE 0Dt0 &G ԋU"9u ͒GKl3$2+"=𥸨D1d%CŐф ' /CA|fCGABe[kvN *"!0P]T Aӓ4GvM8l6*aq ajd`z"dom +"à䇆kݒǽ< nJT/ 7P""#o7o}:=={^}o U|w{_]uwOkZWy]b3d<'"1 ړBAfLF"MILTՑj̡P#kΉUjXGNp4J}O `@0L3SAA L__}u~կ/{&# F nOU9@__A?A}A|a/%m"hDDY\VuȆ">L?o7释{$N%a-?'` _ DDG>^/:Xj5_/&GۦNF?DctRuLPJ+$iS}N(iG¿Ba ~_U _Oկ\0_}kBߋ}?wncE;c\·n+w?Dݯ^dvZ5OCXmEJDC, q}TAlVOrx GC­:Ӎ0quNB==&ꚵv6߽һi7ymzm4 & 4ti?H L(\&馘^5.!mڻޓ RZKW S$a6T'i)a28L&NI2P% d"L&SMSMS27 7M4P"""!""#'D"""PDDD0CB"-fߔWqeRzNMl+ + +"?-Ȉ83HȲ2DvBwaAB`=USw_tL~'sw;=p2ӺWAak=Ou$pKe!e̞:bedVԠ&4GbÄ̅'ju<:wwyo2pU_{*R]qol0ˑ/L%r]zr=&;>fyi2d6D%L#:R^wz\|o¢,A4a@fl@Ȇy6` x@ :'"D]eCD4fqrA("x ˑAM5 ! 0P ;O 3 B +Z} A8zU|"TH+:# JCWkӆjU5[Mm?:jt WRAȠSHfcf Aa<Lf͈0@՘#3fd2p#0DUiiwI&v;;Dc}mUZ^dP@.h 0A !`MA!h4 p0B k4A?'“I`H4.'H;D`wD˻ D8 i^MviMBkjiNM7OOk%t.ޟvJnW;{zO%vG㿡WJjJuS] iN6[wtN{ߧ}d}~Oo޿Ow$DN'"%˺'d6m'nC=H=m'^4J'v}^k~&iz]tN#v;p"V .O PނnO_Nضd6( 28#ZMM^pX4 }kaE7z[#_ײvdW% +}/Iu8_#'&9Gb-P\%t)uz۪}}}ha }u-//]vz?Wz!OcCW~ ?^_:u{K߮޿|5_!}_ =o'q٦'_Woߐnz܊>Iտ~_ڿa|?_Ԟ{_O kkֽ^]o]t^oK_uxkI<|/c>ǷV~]Sӊ}߱YOy.__kkqkïO[MEh|?_⮤K}߯]L6/z_Z bpƚji-4l{IƫƝIxko]vW{ⓦqk z~jJNҴ'M;M4AZa:M4a=զNA"G)&{Ja b]d#}h=0GV5 +kiڽ0]iڅ_Ŷ?5ڎ[ -ՋdqM'q\i'lv[N鱿 !"  'h4NL&hL d*dWMuzdna4*vm1V#*86ZpNtL'A:Z~a2)s@:MߦNiڍ]5մ ; v"")Z S[Xi]m5M}4ӰAjF &IvF¿ ;aSM>iNDArnaF201NDDB"""! !Naa0"",!4g"""1:|0MDG-G~2Jcg `iU}K8DZѐN0NywDqa"w /aWO.n;#{ J t'n''WӾ"q'oKW2P㤛 28#VޭW޿adQvӲ8۶m=Qkn6Gd%\kۧ^H@M=7O䴅q_dZ^zI<=:h]=vKu?ֿ֓_ozWK߽-I({ީVCOd(W?# ێI]x--^Oֿ^Ұ[]^kszOmXZnu0`a/X7DoklIDo=_i}F_u?MծQa޺A/_ >m-~"%_i!ǿ?~+k_amz_]ib6oz'K_m}9i}Zw߷_u_kM ia}6 ķi_}J*|4U6Wa_6KVA0ڋ/ikO\z\[lRiWWvliUa Ӵ  +L*d4dN iN8QNw駵UUiMtӏi5h&am&DDDDDDDDDD\DDDDDFMn;TUOZkմl/kkރT5(vkvF>amiv 0-ӰN-Ŧ+MSB,"0 !(AA%D",BB!DDDDEnT.u&8cǔҔdV^#HGu#ӶkzoO++o}zv^?.Y锁fPdW"#R>R$# yZ)Ѷ}e Spq334ƃ9#d#?3 ja2| @9 9 2F\r4CA +C t;t…5M8 (!a0L&iP`pN!&CTv]! 0A鮚ڪiꞚz꿾jncӯ]=Q!tU>ᶉC 䞚'·:'"CJqɏaro8ܕ(mQ E@AtDԔ~op]_l27".mIE 'dWȯIF-ݩ+Adot_].7^_?uiia:]&15:W_7uKw?}_ֽuҵU{װup{! vԄr>"p`0ɨܚ<~2voWn߯OoOT;4y(\"glOGw ?u}zׯ__ok}sj}k Wm} oSUdi}cz\|W}~U{_r] R*>ظbtJR{ ]4حݭ4;M0q}6ƚiӺN*-oMiML 4ڊ4GM! 4Ѝ:tM4ږZii}&ūIZuLjGtzM;_ +QO.?a21K¬5P44дԄ7  {7M55VB ;R+>L0M0i8@ӴE D}(3XAQDDD!a%qVaB!"L a"""""""""""""#+ჱ$jE@!@*t4)"6 +DDDpa0Tׄi4H Pm +M6ȓM5Mm5Nڪ40&"{Jz'8i"PhZNu4Ժ>TouZOzcVZȈ/5v/o!]muA^=a.oS_M-RrxAf`hgkYyHt_}vwlic-}|N؈؈//kW6^c!Boo_V&|&ɭ^Xoo !i7U! /Uֻ $Vidm>GD#xo4M%_}kZij*X"vz^o~o BkTӥkk}]Wiu8_&?Lva^a{턷t?om>݊b"?لM;?|5쏯^9;8ڰJ/q .I S\]WOkxӊctk4vV)4ӊ0߮=VviiiZIO5oM?M=OVkv0iG" JMSN"a + 2V0dciӵLO"0A4QL`ah4 ! &S ! DDDD!`DA""""""""""""""""""""#-hB:RΩF"Ddȍ3(rУ:KД a͚H3 A MY.D:AP@AYNᦘM5M[M 4&auUU[MmTK +Rp-p 4N% .NI] @rᮓki6=:6ޒDX-:_u6U/ZjO={ui[=Gj&G`>v63$DTu^WJ| 2ԙHAC##$!ww@c\;L([PڅL-\ u聈C¥?Ud1 k]?O Ԗ]׿ 0ߒj]weN>?SuQ{J&u wK?]?WGV~Qw o S[@!g믈?B" } ׼-o>BvW;vkٯ{C D.AP8h5sy$C*NfI! =@|a8aPAfl83KOKO#4 4˳ hA= Al"a !M| |0paa5o-~/¿_ń!j (!a4}5M5O STOO}o^NW'AV8O3_꾝kޚ[5OZ~Ii~hy}gGY|OH/ݵmw&=eڗ;DǯQ(a6vq0']9+=. B{jw D~] "p; +8y8{w`N?QᡭSQ [Ч% XKV5&վuUjF=ڷ~0W7CC<%7 ~a&==~J)*XN{I?L4_NIzZn;}4}&&՗֒ dVOy1_ |>p ׷:o;TشUUj§*׾خ+5~FGïJHu 4L)ՄȰYJp _Ւ2:KO9=mzUPg~|8|DD[lDFT~]-!޿m _&B ״f:{^NW{aA3>G{i/ҿ?[__0#s;xk_Ň?ڵmk_kT]}JݮLO8,{nn¿a{׵ 6mp]7$ӿ\5[|wG>}N?2=}~D{U8a|Zm{V_Nǽ_õB>0K/[K]ib:+:uu tN7i4+pA7mO۵}&DDpN4&zWڠW}֛ ڨM=W]v„;M{T҆#u* %)T aHA}M;]aviUi'TH0Aaa#DE!^L@! "BA"""""""""""#b"[K;[I6JF$B$Vդ+MCU \4:d2(9lfDޱ 0L*(&/$ȭy4N naڷ}^_R}uԅ""5%HN0Ι y"ĉ.DMⰈKƼEh2s0dFB0i;#AfaUglf@  B P0@|fP@ Ba0A-a0! a 4B]>ӽMS]5Š'P*޺ pM4[Oi{ +mZ6U=u[jN.}:'98}tI_Nm=KWD`ARpIթ'8D.aaZ'}'cvaIwV -'B(>[;I:~u]tY4;^_Oᮟ}t t^j1_ ?% Bx[xžAϑ_aƵۓ&+O_Cbv"[`wNDoIGEy'_K~go ~M Ҵhf%T<ӿ]{dnoڵ~Xk{Wב;a[_/~]? +w{ +G~a4Zkm1Hi7Ww*!&)LzVG)3;/N!qK8}0?j[]}N ?ݨt^BpMNvi jjiUOt׾Ml&4k AdQjEuh;OM4j6Mt5h80' 83 2Pa*90 d&HpaH PFs @icDɛHF !mij•AvŔLRek&0Lh%[E6)aL)H a0A d \(L'ka<-0Am5M7h7=P%]B*I %M$Nݿf;åf7dȼuTv4㠒~ܮO$W,U㎿V*{m((&dpnL H0R@͑sfy8fCHF2@_"9 0qГ4fj8jWvziL&XO *YL` ajAye~O4$M|&ka4WO?V"'!4_t~25Nܘ_$MS蓴N(7DL(n'蛹wN zD^/uU#|]]SǾNC=ҵLdoIHp-v8i8h;:7' 'h7CNE%b:j$=o0h [𗼂㺠+md08uN +J>Ef&#F#NsRfN)vHFdN0 +D0zh' x;~X^֧aFA! .y9l0"lP˳Ѡ@h@4 S!i 80!aoC_ua]È[ "W}d+O fB P@0BL `za +A a45 +ؠz55?Z|"'M5PMS +OMVTPzV}ooMSU^ӿ~ipDἸxL0IˋH%D4֤N{?4)?7&>Hwkp'v'rwD]v)8D¯z.ԏC ~ծ٧N§ztN&wt4iJ76Ikl!o^_S~{ҼUokKjp]uN'LM5{^IPޏi&zHSuLAiN&;Ek~ a+]9J~_ h/}6C=_TT .샎&8#Q _ZVց_pҏbo¼?A_kzm'Ibw5wUxv _ocQЩ=\OGɑp4ڦ?6tzmqTOZo?wkjM]4L*i݄7o[~?u]zuwzvuZDQթ=L;M0 4j4Ӵ5&5TU׵??wF}~}^ !`0i$`&"E@qʪjB C0 ! J40*<'_dQp^5?uCr(^׆ߴ=WqqDDEOkhDDm.k}Sj^m~a+S-ޞW~PT]-ﯶcbM"EiؿNv-_!]]7ӶWivq^im|ZtI%[vCOkN;ޢ5McM:Otzi6= M'vӽ4O;NMW4vvix״m5ۭ}5^[M5N]j 5L'VӆN: 'h4NLh ќ" &SA foj6Jj.2PA`4 В"Sb `DDDDDDDDDDDDqWB;nPqM5&DU )Ly 3 tAD 40.mSPM0ִ®ji#Lz'VD'DҾnN߫%JW{4*+:'?'nw}t2D%au[P'ec2%ؓ"BȔ +dLAtW5*\$ߵZ_em0L4& 2xg nf*<\0DOf"(ktḞ2@r]j/P XMBx&`ia )NDsJsޯڂ "k$Lu z4w&>=M5]:"\[Ӧ@|SvNDߢZ Uz]W-R{:NI;~?O/„DO}Z[RqnJ>֭BM%㮣Wh<_#ӵNnݍ(K*n'v k|U^MN8 ?_^HGaRK "z1Co42QbRCRA8 q}_v21 &G":KO_V >GM!2 fE$354\y 3L sAt!< a4 30w Uw!NF -X7.fvfD"#<цrEЂ 36Gg,4pD@h8 4Bia4ONiDaߴrc ڧZL(&`  BaaaBpƓaSӵtO[]:T0~ WS hii޿z髧ODctKI?m'Aߪz}Rc!ޚ%N0wdoya|tM~5ᅴU/ᅿ?/g#)&%_}>W !:ՊnJd/֝]m]FG ⟮?\¶X-S_A|}礂'mZ4>^UmU^-½8_|:z]vwޚaPD%¿@ uû40?}WLRjq[ka v>-x&Ҿ)?&~X:W8Azd}޿jNiNI.][wVLd]_0uKHWM/L5ڴ}mh*M魮Mz~N):$J= &kdniM5M^.RSMa=m5I[ȣݥjM5 kkE{A"D[OUmo"{"kQ&I~dpa8a5{L*k[Aml>iTL&Dtk a0 )$"B!ɔi(Nᓰ  @aa`DDG\DDDDhDF7Kaږ\[L"ӫPL찎1 <*da'%2)MpAX`vN5*O0! +?i _DžMZh5څMw5YvۖT~o%.NA;u^3frnq >ڇi{kW @fR3[2i&Mmo㋮a<((Mm` +Sǣ(m4˙.2B6d#|H,Kګd ȠaDN L=&|0 P}&a0Ӵ 0>~g a3X@, ς)!U⭵STUX݅T`LTHv8vߦ'0jN႒wODo~(f7OODȣiN2۹7hX rq~N$;A="Oi}ݑ]]^>k ]6lVH[l=䢅{ߵdޓn­cZZ궿}}ߺ7A_ZY#ucwOr}j *_ +]n&˜xa?:cUNV'u1Ui\/biUW~a%j @]TNһ#۱._ 'oX^!}o}t?mߠƲd.48;XXmEpZq1W}:L%jvp_uuՓTv5~޶ pڇw S@8h ئ)n5{no'QK]ozki]GZRo|* .ij㾵o>|wHVFa5[UHAӆVl/iii^']C}tHH~_h0 5,&a ˙NaiO"? Pڦ^0@F%aC +qaA(rqӺzV]Yͷ_Uvа+]_ނ;[DDDDDDDDDDDDa8.F/aoi/^D4^:/.U⡂m a{]woO X@Vzwa";]DÏui{J%w[PխN6*j}~)%aqƷLa=;izOޓkN N;ձK}4vMM m}4?OU4V7vޫV6k ST5a4UM:%Ethn a[_WAaGLޙ(Aaa4LaCtAA !AT|5A E aXD29F8"""""#!hR[ZHPVR +43y{T&Ay/c#DTSI1f@y)ƪ  L i.װM4 *T n_h!ia#+rgɼ I/iM4^B.. cji눮 +MoQu W +)|DDd+]r#e vyH325PP0fS!N]2`L(M0aa$\3 #T}`@t/kO%̗F"Pƙ/#Hl՚ 2莉;'5'D!HPnaM>!a0kރƈ%L٠ A"038c< a4cz+i{`M=t…L&(Pj^a4 +U-~8;##~C׷*zja<'Zvؖaޙkᯠۓ8a"cNa'vwyw0Z'N; ݥ?wwrCxk]E}MYq􃆨=Z?ڴE)yM'tŊ})x4>8uM$JCۆ d\uvMdQMQ]|GSd.FE&s D4Gwq^JTЭUCt]Ay9V29uӚf<6820F03CAmK.xTk<1'陌">4˙A p ٛ3x~!41B!kwani/_ ^ =ń(Ai &?M;¦NT4-zom~z4 M4_T'iMuv#q_}i=ta"OiN<~1܆{;W'f/}_Do'^'Z#No{jM7x`I ߢymy~Z#7luzd_W뾂_7fr ^>k*$ OuG}]T{#5gKw o^/T +a~NCЋNwiG"Cu_ޜ/wZ ]Ӻj9}z "nazmha}- >]ХZ/";VJ0I+COT +m//{ݿ vK__1 A;wmwD5N=v/MXƬ0}?z߯}t^ m&8k=a4 miۦ{A4M6m8k&&mydɓ[K[M{I5᧷ktM5զWDU~G)As߯'{L&E ׵Mm=0݅ _5[ Vװ½'^OWff^oQnEL g A0DAha!I0DO a2V, 4 !i2vhT#Wh7ok|-EDDDDDDDDDDR""""""""""""""""?v_ޝm_._>i[Ɵa]x;oҦO9 +?~ߋ 8 ׊&= ;m-$MMUW =8WV)Si8jݫ 6M AiaӏMH6t.P~մ,I֛L[[M?Iӵ;!ȏdSL*54M{MGZhL! fxV 9334A˰ d0A,A(B#8DD!+xy]U 7̀L;aB aY'*i ]Sti>?UԳ@7v_ԳuI >f3"A5.DA̐FC0C(d(:1H&H3^fEk  A   3@ + ~`MT&B {Ow_M5ӵ6ɎW'tǢqDɽzQ +m$F>L{" +IN%:OA݅Mw[}<^}|CX}έ:'{ӯzy9ɟmT'k_ q޿c٢/괕e\/| rz})}-'_`٢[o'_QӦ~EF)ֿ}Wmվ7P[[.080K^i_n.{IlqQ# &^~G_tB@wj7wUb}m( ӧ5N+N+*Sڨڦ:i*SM5h5u4h0BLv27MA0M;PaS DDDDDDDDDDFLP!Q_4AM}ZuMZA5DDE!*ɴ# qIKqDSSKT% %&Kb^%1;[Gd0P*(TBU/i݆pzܘA IUwjK7hu 4L|wuqW}zv6fdf2ad)'D2jtK5003ga3<h<0ːD* ffcA! 9 9G"  dFc$߅M> 5Pz_M0[N-8MB ti @A릟.MOMk[ MhDD7rq==4Fz4J.k0[}kDIǧ)8wzpa]N'p:'oQ&?7vJ)8&: -_%wIpӲ8k~U_u|7B? 1PK^._ z/W%_\MߺA-^" _K_ BG =|ˣm?nhiMZMkDo?oҵΓO W]y7l+/{ -|=]'Ok=xź ww~] 5 m/8wjk0qmdq.aA[_!/ǯbHq8ӰNB ☇Mn0v)6}?AtM8xb/ Eqj^izxti4/k`~tӷM7ԆTL&©~ *}apMm0a0ka_׵uX eR J*MFGA<@.Nh4 iA2Ώ0 I2Va8jDDDjDDDDDDDDDDDDDhDDDDCB"#JJ+_+ 0a/[)3v + l&y +ge$DEU0Vӵ BdAtԷB +ÆYL# 0v`dA%gzc"0ʲ5 +H)"iǾvBASVe\uȲMBh5:iAwiȀwIY"vܤò8 4aS +L$i馚XMvmS8i7^6 R +v$ִzjZOq_p~Ӓv;AI#ǻTN-FD0rYK=pMA$:\ 6{ۓMԮ?3h<= h3'F#C'F@"Dg d 0duIJDD!#< +@wO-ғuꗭ5o)l'IAZZj vzz[A,`q`a `0Al,ggA @ a ё&|x@^"-;!vI[umоõ 5_]R +'a4ӴӴa  XTBt .o}ֽ\?umM5tӥOB^MSOWU\/؃ֿRoԘN.%'`$IƆE=Zv!aD8^J(?D{6cp᪯[!ޟiDAA1"D")Y*oKm'Ļ;;(kޮw:z  [9o+'EOC+t{Dl [L!vK [wߐ!^N +M~.wA7ޞڧuX+ҧ]4moԜGM4 ?b{ֵ$]^]ť5Uy;4D">G ߰j_aCj [䜊8z]KMRhBd-!p*W{a} ӡɐ^[&=GKWapﺭ7^>`կZW߽ oR~v:qK״ |=oECi:ԝ_/?'WtJ?#Oy!FXo& |8|XB7!÷}v{^EiU3I C5YPO {nmxk酶5%ߵ?T/z_"LpQ &; K;ᮽ. ZwM///(ʹ߱"/vCOƉc, C׊@Aķ ' +_uNiVG*/!*Z{{iսMuTI7_wqC!kqIJrGiUy.I%zi34Ik18fZR,7xMm&5ӻIKtL IvB&ӧXH I״kv0^&@ԭM$ ] qAڭC}M4OM5woiȮڤi*p鶓t^CKH$ tⰔn 4 Ȱ{ |0@UAA_ 4#"|2C|4¦F馘P)P H (_* ( !`C" aɈ e8B !0B""XL ehA@!ӂHtm%Ul*4PSwj[׍ЈniI'…KM0VT¯ AV L*i(I"pD\DEG""!qtM!nU3i~sV[uׇh&T{nIoACkH{MDDG&ѝ(T(52.E (M}}ow`*wwwwLwH'SnWUЎ㵛Kn23.$C #c6EȃfpA|x rn,&MS,(!z/MuO }=8vMnޟнNܞ~;$}+%tՑvG G@[ w>v][ d0?WQto[Vֿ]J?柨7[doֿ}]k٧oMcƵ .}tb+]QmSh0{H7 z;ZAuTׯ5QZ "  A@ʙI, a4A^""""""""""#-I]Vi[J^Ȣ  GJUBaAxO]SQ۝JN);;o+UMу!2C#+#":E: M<®vMjJ}` d!g6A0̐Dvf@B c's#iO8 fb̍'QDA44¨Nia300/B M;Ac0zwiMtªkNjokxM=WizyÐq݅ `MdɻwANkAMK]6L'UwtƪWUū SuPUh0M'UQmoݫOitڧi;M;MaMl&ںka5T׵!`" . 0 ȰxMF00< AAal* + 21j UDDDDDDDDDDDDDDDG4"""#-#4 + ]&4 DGq%+ړ;+vvuFv,Z"*aS +d"2<$ȧ (O@*atԗA[-5SM}uUMiti#-Ngh;I= v ͙A25l<&Jd% w[4J4wMBCP h]8` .+,r2WNzTzz4"%H0E>_N];鯎j$ +2|`OfS@zxdS E!aO"ttuէA$E]7wӓwP &XABp:&6h3(@ < 063q@"/ 2DG_nֶ]r$QH:}&xMW4֯/i['zi ARTivǓ|MUSN}Wv޿OӴ__zꖼ'Atv;Do({ڢQMM_Iމ}5iMKع߄p7"; N oO’{ROIN'}' ` `8S.4|  Qtdf) a4 ٛ#|yf0FWS '풊wI7z]SvOm=qyPdZ~_OݦL!ay/A !iia>L!j'?j<]{7]{OMS-j~/{z_^'ՇKnCw[i~rO_MiQkzO"ڿTWoK4~DGwD˼0j]'tI'tI-vRjk ߾Bմ90괛%.-xovJP!-GnGQ{tgw+ פ?o&O_% L=޿ut-7Ј~)ވmm'EZ oւWAn;.Aw{!uUBӽKLvoާB^꯵3KYWy"U}8q_퐮cGT}W7{bLwv_i7) +ݯ 0a+RI~a(/6HDG$PIpq_'W I:id%ؓwqvlqֆm5ii6 +u4RutM?ԡz[V1tj7X~j8{)U Wn+_iރ M:v0:AiUm MLiT. xH/7jKHL?h5_~ M?]^NiׇdutӵMw}SMkVPvM?>r* +zRLܑE +&;㾬.oqi 0ii'iaH +dcM5Xh5SU80?״>)~=\i=X4I5T""2rV^""! `2v0F0@XA"F eDE@˩w9p!OK@\vaNCOZk^DDDDDDDDDE Z +Oj*6tOI1ݽi^_mV\-VkM5}&Mh-ޒ;&> iN[5Mizi{i4@&'4N( +LL' A04AhXE0 (t!CBQ 'l$DDDDDDDDED\DDDq=*xk_d](JQZ׮#zQ4aBgi2,ɳ #P3%@i F?TkO^_Kz:w6R2 C;Fr)I!1Nb_]/Wiªa5CAL Ώ7/s|P]03iO d%"rǶKh}$ӂd aaaN˰ g Z( d4le9yF#Fh)N:>;1d:H@w`p4A0PaZiك0h8X q q h3`f0@ +(~j5_NMU0MtL}iM4…MoM0B®AMŵzzk?뷯w]mzío'w wDߓ$]D.'wDim½4]J-qէwNS!b^9̅0Ti}_j:]vo4i@Hڒqn6DN.)9ZX7o$[0ե׆vtӥP(+pw0CU=,1z CcOKM} 7^QkڥOaÆa7C k 7_z[__b? nԘ?s_&> ߯C!>M&ǒV_aio mԄӬ uhu *pFI6G͢?%lVDodho8G8N/`߯͆~oїDQjԝ{bD=_ (p^0-/Eo1(MOY<ۿۯk00JY%UkVW7׿9L0ſx@86/M۪i=nމ`ջ#[⯐qݫ -~M|ظaX']~DQk?T}dqEN⢬'h;t>qWqhG;]5n".}{zi4ڵT*Up[I4ma7`qM55j":iu% Ma0r M׵ S¦dcjdBii}Ga$?8h4-h4"2a"0H0vA$L& M*vB/Le8[ p+L: 5 }׭0V|C^[_&x؈0 !WW ۄAAk j7iQa{ ,!$ 0D02Ch8ؚ;ZR*20"dD"/gt"gIgS A|d(!p +kg0q,ʣA v.aM6T¦0L(P…M4·M4B[A;yo|n(WOz'^Oz _Wķu[B^?Z}/] ᠿ-%O'y-5UK$__ruWo"j$F%z-/Tg^ifG(6i*4zG}} ^3R?m5TYM{kU~ץ5šVG~6 --n¦څb~oK~Qq@k)bN6ZiM6Mit4 iI~uڥ }hj+VOkttӭM<&4ֶF NTi[]{L/j߯O DDDDHA (pLia4m0AM2PvFvNE!DDDDDDGxUڡ + ZJTe2bMFWrL);lC&!2]%,װȀiA`i% D҃ +&[qjU# +0iIB &K$n $WXpUPK]Ƿ#KނZ]۴_R)22Q)"-xzuK+v ^|;tӴ„?ɷ%Oå\ݺt%_UUUU0S>qUAJm<;Tk\?t۷0oU.B|8VMwB i|C>:}4ki}7 m[1h5 a0I4TNUһ%yM+GiIM4zZa$v(jWҿ[9'ro*$I,$i~NçD%䝽$q^kWߤtIk^N'UxO:Omm-'I']uKfFzAA- vkd2!6iM7W_O /M,q_v5V +qa=uSd@|( I!3]yH"`'E٠5}{@3LWz&cRc~.ȣWI#ZG̐D\Ix[k_{ vJ?~_';~~==Uk_m W~?;::4/oIk]5a/7T(k^^p/D.>?bW׮k 鵿tOBݰHJՃƉg}Ӥ ];UI5O  AQH4/J+NI?].D7/CT .Rj4MkڍZݦ56mi֘AlRiwJۦSv1% 7^kqkjD{'j21kªa4[M'wM5kH4UkOA +k W d4]5lDDDAlb eXAC4AzM5>~״_ZOTNL;j Bqڅo؈ a C V0vM6-4 `"J -n\DFCz7ƭڎ6LU[]JI([WWN z=(;DF"? +endstream +endobj +51 0 obj +<>/Width 2566/BitsPerComponent 1/Length 12>>stream + +endstream +endobj +24 0 obj +<>stream +x}nd7}=EmՎ}ONhvc;ttυEUʁNIUc 0/ye!u'O܆9 I~_Jm!3.m~(շ^çW?7nvw^˫e4PT({xzz|: EQTUz>242m%HOwdCԴh ml[>Aqx\~%zwl?^mfM*P>B}d1y<ugeQi:3"PDeFy UG=9?~_tQ%pﶷWO8]ӃIWm4囬&.ߒ-6jQpJ~`4U/J2ci[uެ|=٪ DFR=ҽm !mdD_7dM[,&LJgRݱM^,Ӱ{_?mo* exiM[rJGWeM ?/?O9AN_>`ʺAU?_qzxzw䦭Lsc QsXbR,b7{nh'X#[w?ΠT%H*VM%mLƹ47oNd+6T*n{Pu s_ܛƃ 3i8f(ۇFb)źQ41B P304*?`Z@뇥[6@+|9zцr@KtdBz'bzh&qU<"ymf*8/mqa;?8ñ(FQE{AU Vp8lx-14RU& jSȌŘw `6ֽk]y~(|+PJM>;bJUS!w%Cʟ n0 + @&;i]mĜa"m"nz|ֈ ٭W1.s%7Aij!r**@C$l\"o)v:S0׶59Aʶ$B˟xTV,ML)y,בH:+[oK٫$bgYhC]d}X +|0Ppٮp>%NRE竕bQt> A-r⨡$S2zΜQTIo YVU^ͺ8c6D db:LWe*qJ`%CBh@TQeP HPuB*X #U/ghǎK+oi' (A%T f1*"t0Gbsq/IMKC.IPqtXgL\`/p$Ixfzhپ,Ge :5 R&PgD@+6ިK +4{I4}A9dyC||z zV))'|.u)D5U.@-+_!`؇d6p50! T-;Z=/꨷\ī:cb(3R.&"5^Z"I i +5 +E?G9ʄ )"_Idebl_eXiAe4X*D<ݬl@2 f8I׉8mqZʪuB;MRH\`my5 ĩ-L2j&!8N8.m)JVɭ'&@2R0 3l[2󚻧^ xw`QY,T34 Q94 hP +[ ~I)"K ll~*;m..<.ׯ@Khang-LD]F\g0%񏈅}1mR`< |amCu7٨mX)S0zaC2LC =>UmCc&Z7GƜq^aɽQT丂+LN0ڊd?b!.Wh7rNqJ:-"]btt<%]-t +txKvk0K,]HŠ~%$5ylk/ۚ]yb\?B8ngdC9Qα3ĸl}3đspjzh\w NL*; $f|nẄ́,u5) - kQFV½RSɈ(-W"5oqQ7)X ),| m.Wf[*᷃ztމp\f|1?Y;S0*!$#JObA$cChwN,tmL ŷSÚzP+v8TY:+} @{6Wd'.rOX24[ ĈES[we:b`@j&繇S48]Fq b!4ZRbmůF VSBu%J]Q威X%(&b׃ +Kc~P!(D@BFDl[ Na^BKbG,vLҾu(<J|Y0o'0|>#zy +.<&Նb,yn+ U m2Ute~mk.^Fu_8#<3V K}̽/gC캮8 9^cq0(JUs8xX¿;_uQ6 Xx"% 2 ƤF6 `^xi]b->[+o@ħkOHd<ɠVT9u^oOfOvBEJ!.X+N%loȒY +Ʈ/ .:bF@G|]5tx|/kKb,ӑ02Ӱ@TpGxip~J`}|:@,rMi>?Q̡Oz[(h #o.#9vb0`ǟ>lѵFx>"5l@ϙ]iPt\GM =:g1] CW4N*i&PˌcƙE79+|9IY{ؐ N-*%p0rvz(:jzz2 j{q>o"dߗ9vODC)*dDy[thEN;GRMU^A2ǯ݁_=j-T XQ-<#vU$tgǟw:"zђQ[y$SkJ :i[1އV4 uF?qN 2=yG#3W ]j8c3Uce S=i{̨_nyY@n?v݁^Apꢾ~f*;U+h64d׶NM Nv?dSdWT@֚}?#:" *-@:~|؝x_ƀ$Aci Ϊ˷7!j[ն85Eq2݄.K[[f(H2;۞X`z<|čOs2cqĸJ|i}sܿ`}\%aHa^~u!E}?wdi)K|E>c-iU) :[Ԟ6P]¹!$EPQS'hF_+ƨ4)`y;RWYn4i LlLf8ҹ +Q@4daCp E_nV>|oYhv,!&oW/x(xuk~39#]$CgI +pEϟ} ˖0hv4; +v5Kf:wP l~G'okDNqL`yY)ai=L:2!*ZqwZ2{^rᑐGhqT١/iۗmoK%crɴ,{R8T}?x}>6Bb +f bK)^+/ +zf[DmٳSl|N]u,?4j đ{#o~ϊj`/\;L6x܊\q 4dM4&a>U- ǜHg19⚀F"SSɳ%'jMmw Sy9~%¶AiPM j~FdooUusjXeOԯsUQTucpo +5AH7/*;Mۖ PK:8U+8>b`S"ٺ(Yً*`}Ѱw4F쉢h=J1}q1b [Fv@l&3ijHZ8/@~(B ÑTe%HY~Tv&1}5+ οc|sSJaq ԟHʷI+ϜI3^KPLcT"̊$hVO%Y9c/>BKhA e%C# Fכ=ɍm XNFT[~N-&nعQ$eQZCíű&?Oڒ B@Gn[&]HnXKmu\!ʗ=_=>Ŗ"RYApG=4| ,5'Ot E`A킭Ua(F]C$_1Mk'hq6Y-: ,R'-y#U+PQ 2ɐJ-|+xw$bb + ȏxGhGJ˓!5YVy-sH8XgQ2дA[E$U,:3<7jE bݟv+ya|B&֣YhnĘ0x.YE3YI&X.L66Cю]<{dϊwJf:%J_\Et۞&K%07#6;^W0֕o"c;OX_ _:IvUhy$xSE+?v::y(Z󯝃V1]u%D{. ڄ1n%̖M 3њVG,'q-c8tnuu6;ݺa.텞u3ny Z[yaGv}r͓w"]?oQ@}/j/gbZˑlة.2Tq0qwq&:6/Z$MD=fr_F< Î6-"ևD?6z-\N-AAQ1'%Tڀ.z~+`h/<8!phsUՀhhP}6ŒWpu_lK|-*{zA{ ֥qi|eHSіK-mrDtSz<A?C:j?\3"d lHV[Pcfc>)7^{e@DevF >|nTsLO plOuE`1sj=m?+̶HQm5WnzzVn\ގ4X53y],| +@j?VM$cdm>O -]K}OToMA_rl2{Y+gXptZt'8q=,FX7[ay͵L>up%Pp񕐓:xבfV.`8j C/cv#MdN27HcĉaJBN `e>~gpzjm6_nF'Q.wMTErracB4p?x>9E[U2t=~>#9eBZ(g{!! ‰ ECNtZm˅hn`w;צl(|+3<Q"DT.ϰOlt CF!=?S 葎fMt& l.^þ tY!NYro߿͖.;Qqa6^ZeAC3N3 8:C$98rٵ kohL"gaԡk帼V6PX]UiR㵍ul<ܴ?kx$~a4jlva9H&1 ZoϕҘoQt!ܒŴr }|$gPKowFSWv.Q'φ +4EIb ׎MS3xvuos`@YM,C $^?+{k [l q,5t=h;yμXYgQ)`tARkToI ۿh`Vx Ȍ *LK7Q/~!#vbU5A78քM,FU.j)Fv3B[lJ 3a +:;=oU*?gy_] +endstream +endobj +25 0 obj +<>/XObject<>>> +endobj +52 0 obj +<>/Width 2566/BitsPerComponent 1/Length 50708>>stream +-|uLPihRDȂ;|R*aS-A;"`<7ADAbZ83M1pUL&iaSS@΂UVZ[Q+Y8h4MkOAz=tUH'EbI&]4%J\t'KJ~oU-]:ZO/NN&AE'Gҥ տb=ޕ%QRPG?`M5A">{4GS4v&yC^*iN*hXM3Ok_鮱®OPkFz4>RޕZ'ƻah-_pooJI.>I7~ /mR]-A/ndnDȣ龾8R,2?AnJUkU"ưMSiik"8I*i~]%봝ZRUW%*Mn$&M~֗Jt0uҤ- K\*KKZJ׿U+wj{%zK/h:*Z/RA$**V$RKK-BHkI4<kϤ=*PҴK]V{ˣIL2#5G:ҥHbv/ÿU/T5T8ӴcNA$5i}BfU_`$ua¯V0^ qAtuU _I) +ZEwkUMw5D(UM${«JӆL a0hZ I4 T,,&DD;AO𚈈"-I5qeV!e_mtcɴ]+#]ʤ@ڲ;ЊH&ItAd! BbSDPP4h2 P3TɹY2)(C0\A L-τRCc)pL&4TT->N ~RCDc,0 $Ea4N ڻl/{& X'D݇2W;PA64dcxd l4xGxI>z A(Mi[zmxBAkA\ӹUM^ ,UmE4AzM^l%~^u~Omń 'j!a.)8T* Pi&k?ijvzDf{W;qWzD9wD[ ZwA*\Wn\QpOThwt]߻%}iaäWV}+muMWC~?J•a; A];oO_GM+߯_{rYOӎ ncZ{}j߷; -ߺ4}+^aޅ_N}uWBwqk !oKo~/ay14Mڇ  ,?䝫MVnM@*{Mx?4F#MPo5Nx_^iTֶii_p~UZEߵE꽿R %UU^o[_xi?__}H_4" 3Y7յߤ0i~7zq % + I;TTNL Oh0OWQ?~ح`Ua+ `][]XA[VƇii\Aj& civIVN|V +cV{*4S +4UI4avB @p &~imZmW4ֻ%^NvӿMWNvڨ[#݅&'iBk Մ,Xd*XBɎ]TBMBdm4 P eX@5i8@FNq " :$B"""""""20hCD0`B" qqDG*^iRօ%O]G,\ ɲ(&l"܎[ Dɣ$DO t AJ UfA-pL'v aaiȐg)p! [xT_tӓwwM4G;&&MB։CmT%r_zTw$]-~'iX]?˝O[~:N{ +Z]?i}D⿝X\%(#4E!B8#1Dqd@7_\r4!+SM@#L@8A 408`ZA0WV0;u$ӪAup 'j +WUA4[` p&/h4MU; iP8"T ""!"""# *`DDDDEE"":I$YR$GUP帰!9S?}:^Gt\sOA%ECes ̒@Ttّhr +9ԋ/S7T)`ܐ +_a$ tOȃ&@O]DNf  +T tqn(2ä .Ѧ`Q\" EXMMUW ~3@a`͆!6 <&&cװ7z.qw+ O_wۗv.6]G =6˻Ӱ[vE}}qAߥ[h'a$vG Jj[%}%MPat邏$N5dQkdN&}qIJlnNC ~ xcM%^=R +{{[{WZV؂78i 4~omz_dz[JAkon-ӿon'W_CA⺭د'p|>M_C Nܝw,'_k?vvZ}/%__ڜ_]c.m=T&pak/c=kt`=ӿ?==MjmwW .pu^a( o4MTصk~5p0v^'TPA aOHaz ivRiIim m?SՑ5MV +N:ki4!V#(P 0(R2K@&d e8B +I}4T +('j &tSP"@"m0LO0!b""""?a4hIayf#J-fI"̙Rv;!Ln%U4NH`R +0a4(L'l 9LЈ"}wIʪw H.Lnw7_i;k؏}5–M+RWn%l8:3p>*e(FH74$#2$#c'y&ÖfA| 5dpUB+6!~Kakey9}4'@F`3q`EN ! a0B | f]4{i_ /'BS@@M& ; ނn]yr#koI;%dqwi:/i"yzCb^7}  ;#+ګvJm21ײxK! 'Op/U ^7ֽ7ۯk ao0KkwJ::Iadp;';5WcN. ^KZJ}.m { %~;OBI҄+t.WR߸X/ p? Uir&v+ȘZ|4Dګ,P;/ 5ڈ|C!EAեZmŪiIOע8c}!/v_*-|'~XAG}h6m &A?M4A6kwu5o"1 Wiޔ4KVmU5m5idGOzMiOo6&ſ_Duit&2n#)'4M0v hM A04 Vީ~#- A h0 ^!DʘB DDDDDDDDDDDDDDDDE_u٧] {޿5_֫]W-kuݭS޿[uKK:vp߆;V-85zI]Uտ0!'`ޞUiAtt*}SM)0qӦƛVM0L M;ݪM4{ՊM7ЮbAm tUi[VӲ75(]m Mkml 0\* %'iCq="01`DDep. &0nUfB" -A(L!wQDWxե T[Kyؒ*U&M' ([5x)Pa0PM 𩦪ꪶ/avBګ t#ph0|Do4\gah8itnP57눫\k W޴߱Uﯮ8zd&Ӗy@3[R$ ˖P}2͑`8h,i4 aSbӋTa;XL & 4B}NozziڄiwM_OՄ'p{D[z}y8{"wzˊ$NoD˻OO-wWI]<7$ I;vNO dW;{#g_O)W]5iON 5cۯ?kh}zT;iw4uc﾿0UxBw YZ5!2+"SH ]r&GU|-}[lG^v"]L5_WO 4P(PDOf_xy_T74 'OG4?WuOmW/5߯k˶X$Hw'nڭvn׿_^[պ/anշm]ڄ5]pn>$?)K];wcviӵ};T +d\Weؿ]Kilm!?V4uk.qZvCxV[xkZlmCSwccwM=Li[^j){NTD<@ va4ڧiMij >st:koVIߵ~U„ݮki0k~X|/GaTi*aa4 a]M`E&a0\ d4Ԙ":aJ2B" h|O"4"""""?/_Eׯ [بS +)OڮCb*4ᯭ&IOV 5  &'iMck~[ez":+dnS,FLha=i(Ph5KOa̖SvQ&w^#kwo^a﮿]~[ֿNKDd:dDgQ g ̝d SZ!' !gCϋ28'eC0Av\aF xLSYa0  @f@ 5A4 + ``qwP! a?P!aAkat5]5O47q&?L&Dqꪮz&Z8ߢpIɾkˇˇ.ႴMݢ8`̜dwip蓴];.ދ.5.ۆN[°Z uvGd%Y,ڻ]%m=7}}WI _V +I[GKvI';Mt:;=mdnuub5/aoŋ_ou* _OZc??v4 F rNwB8&8kru\5ߒ(~?xOOtydKVӾLۗ뽿B_I/\7AtNvݿuxoo4O?}ViwJ٧"ia|ׂ*}dt}x}֗K[Ż?^k wVUܱv^0q]{څbۊ~_?vlvu޶d @KW5xcֻkuV0v4j֝C㈻qZMX}4ڍM8OtiQM&b*4ӷOOitvi=Zjj5mNj?kiC ȣ0pװ5L/ A +j0OGV"=TT e(B aE !DDDDDDDDDbD0B. Y8Jhp GqQ{uoo7p^r}K%8o9hί :v7|:׸y6UDb*d39DMq5#N7-ƃ`M0D+ 02@T" PD82\o}z +o_}y?uSW[K 6[kPE=7={j"ݒ#=uֻ_/#2}  s{]-a-n7m/KI'_}] aaK{Jam_i/]~݅`xja([WG n#_l&i0a0p;vu4 žaDFis&GѐiH:M OVᮡ|A<)aD_B0*` a uӿBq6 аrh]qka 0O~Rm,I꺽?Zi'_"=QDǢcXaXtM'~*Km&jJ2VGt+DM`Ko]uOiߡtD}]Эw +8"בcša}~K~LrBƴuS.}~>zMWk~Y>(__)o/O{}zj_v_jamKWG}Hc56;wl{i0{^qnz u^☵j= mi@6]6i궕USk[kխ}t^4Aa <03(,g)9˃؈Sstm+u G- "2,9̆-$dp|ΤUNy XEA)(0:6A_SfO 0AMMRNȮ04PAmBijH ma0N*Zmڤo pTmM0ߪi/*ݠAjj\2W;rph.^:o}mtӤ޼%oYM˿>8zS]RWMպppۿm+~*p z_ޝ-m憎} }=;~,kK_U~jnw~Z0k3o֯!ƒYKok_Wqn":% +wc ![K]kF8]mS %_IبF K8ɁN5X~}BxJ~]4piXMu]- ;׶7M{M5A"|cSkiH P/M&{kl ɻ 4 A=0ImP=, _kqiT]Bdw_VI`@}KmvM>5^O"RŻ ݼ?EyzW%AOR}%HMB_߆ҰwbmR*ߚ;750gY$kE4!fdfR'Cξ!_ +4W a{}.mZ~^ϔ/~N(&NZ^.wKI<ʵONi5oFf4E?־P ^8uಀQO~޺3]qޛ=uK#L=zZ#r1-#5j}ԑM|Ow=b֞CJgk~kO |ln]$פP "y/tZwf K^EVOkxv7roOP UuK]uZ|._]%^*PuJZIPa-T={ֿcAo]i +JzJJT|{VWzLW}tp,K +$$cv)_L,ZڥNܘA[[Rm~UanK}cH-0iv aR-ᦘUc5O~fqyªM4,$JG"­ᔨL/D߄IѦ*+AwN%mqqKq^EߙasOz}?tJ֕;u *mj笢9'[mۦح<*v|CWaMix IHv0}ZWOBA[KUuVm%v]Q|\SoOb4i-/ j ia4-[InӤ+OMޚk^&˄ӻ!F0BЃ"a"#n zNi~ `馜0C !ЈhDDEDDE(xN"#KTfe &kEDEDDE+|DE0KJ5VꆄDjڈDr*],rʼ)HȠْ/M;NN- m4AKۥvd4M4 +Dsh;MDy}+[Q #xR.Uヤtۥ5mw=|ꈼQ +D(Ψ٢3d#l4}*mo{A=˚u +3pCp*,&:0~w+g&Z0Ajz@Bm +zh鯢hF4[t[M>跠E]a=;hn{Rq{ZmN˶{Qt˷{l4_c\~JcuOK x8?UIڵ=>!v ۿfUޅwtIP+4%b{om֊Y JoүCע""՞ǥF_3aZ$Ҥqzl5WoVqt g$3H~QQk|; C k>:bMBA-4)^+w{jOM0G_ ]鄂 .ӪӺjM5ijiO$:aBݯi2c馩 5 ٔPuZ + & nDDQ^a"""7uR.KiKZTu{ $ƅ§BYږX2dbf\G\ tպ-["N΃vAa0[jd"|@5څȖLxT1[[h%aDwa0xHZTK:*.:ʻIܷ$'n T?E%m)>@A^]{]*]tnfMvzTSJh^hYj +rGA~)g zP fb wx2323oO3ЧꟅ-Ba4a6iZ 0_Qcb{6QoHz^thA Fz ?Z׍^Gap݄V+kzI.II$ֵA{~[ ZZUkUMkUp:uaևPUoUWׅZ0k^"u!AoIzJ +Zi_۫3V~AiU&KT|(ZR?/[ejYt鵨voUIVqK=Zw]#Γ 9S۠ lKcI; IS_rivۯ[TbӇjI 4خXPAޗua`4+Ob: xM5ib)nحWp]tiA{_m-& MO&!׋ &M;!ІBk1k݄ %BRADDDDDDD AaB""-UI$D~46Da҈jl  L&`+O3%Ie;Meun +2h!9ꈃZ BhAt骠?T]4L_]-oOD4] vo˲L3zaZӴa0B0H*jiOB_tڭUꉾ'^D]=yk$;jIA 'm'n]6No} ;H"85]o[[m~vUCMAZOD6!s7N_pŽOZ[]]-pp!21ΓWJUK %?ޗPJt6*KV $/a;{#/Z]֝W y1ֿn L'~U%_ppR$J>PZD7L'[|~> lUti0׬_Kko_aR3Z[~l%ߺ^y%hGU_cڤ$Db3yCȶ{ o0 /ՅդV~ӍSAkv ^1"]حKI$4 8!qƅhVEESZ^oQZm}t^kkMi頝/1 -P4ꪗkt/jը]>Ӥk§&hc\vhG*'j27[_N§G&ઘ^E0L&B׸PMA9]o%9"4 "2L2T@1H*C +k &'CD\0D"q"2{3N"".dB'F +&t몺MV""""""".#( ǧAm&YyyTN-i%;YIBI}>֓/-Dǭ* KCI*V7칤m7]'KI*fvmzJ  ЊB*kZ"84d]E#KSS4!ѡ#āH1T40L MAݪv38!mU' + ͈h0CSzꩄzj}4aK0xOTڦwTX{iU_к~\QoѢǺ37a4Kҧ K!+hR.oPnN)=[M޺I%q0Id{u=S7'nzZH(Tt*Ѡ_Jv='>?Ǻi%]hz9e|~]-WVF'pwbV@S:-^hE^KKO&ӈ2@ *\! /~zף}-I*U0 }o_/itYB__G,PiW„F=?߾_k*Ɏf#=/^ZKeA:#߄D/=r9}WjO|'֝/V{ɽ %&ׯ[MtTS-5kNXӏVU5b*ئ&M}>nKiT 1I{viޜoii<'駻n5[i~nZ_U=Zpr4j0!: `=j,-wvM5Q1i ӴDEXL'D=F:h;^4`Hx0q8+k;kXAAy +}8R]nX&ª~I-$?A_M}Iph}֋7KT#WZ#H-*X=>##Itz*=}+J;zwBHt]~ԉ^uI'eU4A(j/ҪAm;kIvI+,_k_mI%ZLH{l)rCA}46ҽ?zKA{w}d+bvݬ[^/PL1AAazMMݫjbU;0TM;KJX bV B"""#RDqTҪ_uiU~ݥuֺU_G#wOއبL'ð.,!QJY/LML(DLϑ8 2`d< rD"vԓ 0L(=Uu$v-]+Tuһ|7M4,ZNI[iA?Y.U㪷7W*]R! +x-oAVV(yyHC 3AZ0Y1k/ͻSUѡ p@A0P {T_&H)6F1*0L $ ~XOL/iW%s2BrR.GRADSAIZ!@ f:FiWh;}s=RjgzUAji0 'X&wMчC[~iaAҶڧz{iMU^M[u\r}֪$ow:Zma$;UKTVw[ZmO/Ozi{^붿$ UionN4-hdPu/MU/EKm-abT%K_{.ܱ]|Ju̼ufN꿈-|1 _R_OgCK!+tfpl:[˦b_Uֽ$]֭Pl^6}{CE;>\oIuDN'ɬD#2:6ˤt_y ӽv WO֙{]uAѿ{7"$bޣ};׵\҆SWf[9wI(4鵳!KUMmz?]Jb-}01 +֚at0Wk/DpB?KjP K[M\!&Ǯ[oD7<*X64mzAUMUSL/kC 4U@ __`7NT׺m+A8^>4`4\D87}+l7E /2d MBvZk`DD4" ʑEOƺV{z8`qq$8DlokkþX6&{HzPAUaa" jkȇoZJ`~;x듦ŸT#]:U"~]awz/Ү$v#"9*KO3A/'A^Zy60DT~|Zi%Sk\%y,6J#+a2J3X B^w8%i&zT@NI&<YP &Y + +CGBb +UdxVcahI/CAUKI C@©7nA+R Y25z/\qOV Gx$?%~_W $Oi= A l$jdxG-%`‡(Cҭ&-?amBTk]dBрtMu 0DvBXMAAȤўUNI] &L*` $D3U /@KniP*:BÇJx"#Hmrc4TXv!2|&r4db'>3N; ۥ޺7o}*UqlC!i]][(']zH6.$c֫ a imW]RKqQT- ]U說[[ʴanvdVO[S>z7T'oMV,In7v}ѧߣf}z_f^mq~UG-Zy#zp^895fxz3WH7Z$M~i/kzoTھ)f+_n\kq4Kگ>G_KbXVҒ,UUTRQtu@VvUT^v~-~_wuN):Mu:TyN.YDȨaHf dDU@ԔV!0CҚz ӽjku5 M4h XMa4,!  #TTL&xAMm4E,]徭} 5O@M`0B"""""""""."8i &ݺiZjR 6 #Cej)"""""""""*A%KazD;m U)Q;Ӡ%vקAh&i-$Iҧm&yA:I[k__WH>w OzIjtK^WyH/II%N׆!s>ЭWߠqSԇ[eUwjԜ %MZy8 ?@dڵZ_ ) M;w_' ~aU ,w%D֒_uAuY+O5~_׺zנIfΑ1}iE% #>oI˿z}8~fH6Zj"!i?OzrPu{}u__A3q_Z_Mϊ38%W][zU?ۿ@g#oz"0M}v{z'_kzJLO6in:Inz[4O a {?tVݗ?om[{tuv>0o]pᄢl$ǧ7N 7yox%۵0VCW TA$Bb.M[Mb4[]?X[_MnN&4aaPЈ,#5 4°עkIz#C4))Y#Wu7gSAZG9k;v  F-MBa&~:V nMSI6ni`0}xEpeCB-qЈKDj#{ +%N; r@YSFJL j…O{hm=gRC]޴z~[:bTzHτGm*|R!fqif:DxSt 33#8dF51Y'E +>Lj.^o1$IX$D҆a 4S'F Bax9D0A &6&0Bw#xeA/*>!mh&j$vaTzvjASCӴ_Ya0"ոHmi4@oh>4gv-v&p۰ԊxN,~z OCt]$KWKWy'hi;N S2cWpnECM n듎v:}[.+mjil[}>nW]W?_е_z7 ]vj_b0_ح+"Qa[ ]_T7}߶,/*Og~wmդ=/81~OsDN,"]k ::xO6ǯ_5*/>SuݮSa-u_YB{)uC -=DôҊm(ab!kr#1R:~VZ]}}]amwE!EqqXM5kT4_]nK!|cb5t R&^&i~IIiki*iiKInutTVo״a&Ma4jiB7 U ڭ &U0T8Јgk5/2&BA3C !AؤB`"""""#jɸ!]J Q$Vgue@JLF0hdjV邮wUOaAjO98"k꩙gOBYGcvAܩLv߾zg-:;'Kb$T t8z:uԛtz&dDz;dtvLƁizK]" *8"jM5&`fy3 9D7iMnA{D髠a:Xޟ ݦzjL a,~ziX[-Bj'?U O~:AQw5UO-UI]5M4ƻNnV=Wu4Lz$OKmm;֖&wtN2ԛ ӧ4Z9jf S>3W0ͳA3ᰚ;˷A;ݑ'K\(tv &x/LgA3|op*!;a0>PۯޝK$?[ t45zz֚aA=5QM5SOuX~}nݦޫ~=;1a]x}}>ܫ_?>ѝUOOMizk[Ѣ݆4g I4W꯯t;?i}"S~q4f..H掐mz~m4.;O[t ix8?a_I huwO_xo/# B%a0¬%/{K_=;u\1[]!]BV__z5}~?_ t,_ؠ'~(N?'6_B!y +m7{o>%t \]/k?"<=ԅ>am~PK}~A^Ժt~u: +k踻.)a~ǙlZ.[^?BH=Y ӣoڎFvz ҆O&3l"\'{SoK0m~Nf !߬0 XM=*z~=*vk{I>;,t—A^HHu]EYikK~v5Ы7[KIU錄(E8ﰭ}apk7Ta(ڴOn5%O_T>8ւ~i I=!%|5NB_qQZmSt A0MOj+ ҸOtoZl*vj4bi5iS[A=+[MV_MMSNWULz +AOOa݄tPvUkwݦ.0, N"#5LivMhE"""!q`| a0BCO[.M;P@0@¦\" R"""""D0LpDDDDDEE.#/fiÓ 0LJ4$#Ij""5a%Jk#ҤSB Rjjb");ˆY(9m0!t 03r~qHFu3TU };+yxAL 4U5IM].A&UctI' ܻ}KxN֓j|}aޯM],g_ʶKDd9W}ac5taa P3۱^c:߯KI7'=.4'^N޾W}醶;I^}^"#^8NNO\EwK ZAOD'4 ZԷ|[_ޗB-8 U:/۵_CmwIPi[X/KnF}6NFhڰ=}vҵ 'gP$_I,$I{Wb;V&MBvڪݢ&Ó +_MB (O i -7 +i,dW>g~)VA)0dMB"CД#tIAH= *z AG,՘K#@mEtO!A o$A^J,蛵&INuTokkJj^Wj $eaU֪% +ƐIUׄ<}`=PZ*x/UI_6KCthd׮fDhfVyKa30HN$T[M[EOUjohƝGoJ.8aǪ\mi|}ˇ&օ$웴zm/K륒r7MT_OޫUCHiyf#"vk_늪jAneqޱ).`0;(e\xKJi]d2j(R +*L*j -]կ I/]UQ}Wzkkɏ)i,*TE%[[u묄*'_KKޒDϦ״UJ7ɍv13nu+7JIオA/DwWi%:[Bpֻl-qj[V)S qV턛XvÈz{KuWqLBҭb uW.ꞯ M}}4,MI;Al'iꩠªa0BA(8`FR"'d$DHgC!a<2PD4 <]F2tds'INYv CB"""" Ҏ3p;gL @ a0DDqa64&CXOA0!i4&}DEj qaBiOi0T ijj+IemWUO_D˶蛷8z'M։;ot^4Nܻn°=:'tշǧ i8n蝽 (CW Mnȯ'O%zl5%w~JN\տO.~:o~q_~]5޸uﶿҪ > T\,1믯׈_a垙J2$جt [_ ?=a}^NBH!v .4Aۨ,Uǿ'_ +xR29│&t TվWۊ-Q?NAaj(~.k%>'\/Na^ah+tݤr17v4o_]/'u[Lw}z|Wtoxna.^ou[Em5At}WZp_o %pҴ+vW iSZNy3ԂTh&:9$zs}X;Ȗ%_k{Rw"Dr՟34a#;4,3lħ HeΆBL9A>|؁4 nXj Zuդ.&qW+34ͼ Q XL&j0D0,w[V+M4M8)+46 4On+6}Z_D?]=4.~MBMiM4uh0׮kڶKmac₦/묱ݦ۷E,'yUN$\6I=UoIu5׭#M4ia4N@­d0i[$ථѣs 4R;һ';ˏ f?խ׆&>ӴL20AT 5*0A"#6Qt[k_C헣Kk~5uDDDDDDDDDDUR߷Cd]^^ߨ^B ɾN}O_==m ~K $MɵbAq w_{jKx};?_kNA?w)?WZt^zQ m~K@&׿I/KN_cKOa m/<=]- 3\z7ۿ_OM=]m1LCA`kiݱ"N ﻆ~5NM;i[N)m4bZ7Ӷ)m&M8mBo۶ :AMJt6j.[.eg9mPa6uMm/vӴ +&a A0M$"!""""#B"""")۵}p &NkhDDDDDDDDDDDqJZ;0fL `B%iTLDWE"[a4Ȩ(5B""4$A0La5*RU[T®Zh0]w}~B=2[T.FMNȟ?h>5uuu㏖fdMWUtc)GPKߓa(D CdP2)Ȯ309nj[Xd4GDc>ΑJH5%Ƥ8#2ѓmGA#dq/`0. +l0AE5<ЊDxJ5 +0A @4-͌A0@d0!84BY>h(AX@wIa0BBа]00! 8=?mª=B!a4&?;A " t}SOP 4¦zw߶~k +iaU4?TL{Ӯ%;n;aI}utnD։DoܸhHZ.vw|0TK۽7N]6yew߶  +INl'I~{oMZ:V'U~A=!X_uӡ ;u㓝K_>B;yՓāJ^> Wm۠3l-;'5]5ֶ1ua1kii|;:a . ŸqZ & AY { i ?Qaw}pkBZa>"aU4=7UNݺMDǧG|\/_WB/G?Y2yzwO/׮>XV\ucѡJݢpjv/ɨx^/]'4U\~'IhlrQxZZoW`+l*Rpa}u_>7^?OEywiu&]~;jC\}?pmqxDOQ4#uR]t[7ګU}h49(f"i"u# i޺&?AWt &8L6Dh}}x]A_m~аT][3y7WhxCmEjkKC]}W "C7~A1ZavJ[ s__zY,oWqeVױh;kW[u?8a.=uIHz׳=C$mG0ԉ(M;(4.ڈ:k^֟I}T;={{N mwyc֗y_  quxL5&ӵTT@ 7kn}v[ܭE>zWv^{[oMW&TuMu0 5ᮻcX_h8>j~)>0KcT?{^W(M28k )uB'k a2 j  ᭇ>oIiw im&oM*k#tNd T.`d!ha0A"A (DDCj)M;AOjU[O~'%DDDDDDDDDGz0V +j[R  'ҥ]D\XB"!""""""#\`b""""-ִ(LmJ2cHLL7v7SlCͲ}r6a3 &`'unW7oOjfID00P0i'zxjvOW]"DgO٭t kZDǵ,w0[_]}WM{ -EDǪ􋷺--'N;tߠz/.D [(JU^+h\/N>TUohֺ޽+BNuB(d2$O̐jHaA NNi%.0vG A #<ai#APnG"#9wFH+ߪZy' rp k'P ̈́634! &h03a!A 5-MbL!-T M4!acZ3֒HzX-V$W}U[T]*:^KA0MS Ӱ>L&t 1<:D.=V%/ZU ҥׄ+JV];N1ˆ#tvv;qMމ?.. SU?=/ItW_THVi Dhnm`I +tȯ'aHݤOӰAmGӴ;D.|}_. +zK]*k]~zPַӆFjF:ZA+#.'CAj|~_K>ZR_KKXҷ O7 _ONCWK)o+Pz?IR#ih;8z l]i\:k]{o}ڵp/ou6,*+8a4}a|p$uv +X_ \AW߯`M-t; +]xc`Q\T}EiWU[إNLW_ےۿ/\ՊZwqWA6 kئ+[UMSrnk݅MUWh!pүiU÷CU]vp ձUL)8UTkia4UMSGQa4Ma i{']'N(p vih3a D0DDRKq(?_ q*?]`L&]P2n dA} D߯KuV%i3L!qlkV3{IwKЈ %o $ /?oS -?1nI꿷_ M\5k0Vj[-a*T?kQ /k4ҽ}wǦtILv]XN7M7Mn& 4M= n ;i Mi$!m&qktTMi&4jk RjBkh{M}m{TMxa"h4v%i˄L& 0| pBEJF ! ` @D0B"""""""""""""""""$ T)\u3q왌XȁDL"#B""""%%L5 +(j&&L-Uh6Nph4֩ &b;D;ޝf KIin=uNN{{Ӿ޾t^,|(Fqw>vhFݤPFcj4A4'efR%AgS/0)<3a +i,Y4A~) +Fb|T0X[)U4 ޺}鿱S +N¦MST륧0DwU>}/8I;)[FAѯNƃտQ nH}?D߻8[פ\[wx.}Z4/HvGvm[ ܴ +gqle9<*;R/v~VAPccL8&b]ϳ +0[ "1u}X]lpk(uSuoUp]V}&B9ze]?_:UIw,0|MHW׿-jo}h6m7U_}m;:pN֡_'o?SA~WR>_ZmvnWyZr ѿU3jW+0{}vzqO_K+_}[Zcث{xbvҽRIŭzm֯^q`؇}O;mSjƚwMEW]|uy+2c0gIh:C n:4b3F:[R5xQMiv{iE5'ҴC &WYDK"q0e!`g]l@IAxϲ8`f䁔`S`f(A̓XLafm4 z륨 ޺jamV5L]N¡ д""# 6l a;a T.`PC‚ƘXi!iZ&骦pAɺ P1HD0DDDDTDG}pO=k꜍է|ZwM0]mtm<;Oo]'~Ƌ&wh] xHK )-滇a8h'0cGȯdoH6ӿ#}^6MVE.7M}%^m$:Iz'J^Bzݓz}㍨Om _v :ۧ}.mǏ_U6O]{>zav/[P%/C2wR?}3uտ߿ n+Oxiom\gfDuES&yӻ׿=|"1ǯ:NWד(+.(Sv@4AHa} iOȮo'ZikzW"d;BAx| + M47]y/-]^vhUTN CE}kk Qn߮KšH6'nK&]E"t߷K u%mO[Q_AUꋲwDǢZ_sޝ/A"V^)3rE6V]\A˻ +O׾hX{pl.CJVu=M4ۊ Ri 8 )in z)*~ӏ㨤{4ttiwTM> ;?iӤӭRzNiO#W]V4*moJ0Za~ӻT 0}Eugf"#8LЍL'a4[v &a>a2N ӈ¦ `NʀA 6A"0FB#'0  +߄b +5TPzkRZ|GDD4" ae75AIݪ3Ռ,V]xO"#_cooP"L-=X_귭MY!$=P庶_}?ZzZR7H$K WKwӴ6zqU\jBI.Ti!\B!wCJ[!vA +|.UTz^ֽtj]}~gg%[."#hE4~Pj(}/JoS(H^z_IHMOJFK=-$β]ZkVrv -CWaWMְմ*K|\vb(*(?4av) WwQwzwA[T*Aӵ[P< +!SʮJ2/<7 iI:M*=PvI M4  x8e; PLM0jliӻ AHDDDDGU ]WCphh"DDDEIzm#K qv%܈I$rKtIZqO{OZwDvHXQI=_wyL#^u5fHէԎ g:( +PW[gQ ysB: ͞dB48x ``K j4 Ew0ZlSA# &Ae +6ffv|ȐC `gAv q &NjM6-4l' ?mpH5&L$TapL 4J4T֕jM]n襁[D[#AaNvsB*h4STwjEvMzDݢOvmhia5\a:% CkGwTMܛפ5p;rʇwD AAn an#w.M6,r('&NzzwW./?Wm?/a4'z _4?W]ONOWރnoN^ua0kl_Pt\'Wۿ~\q-~]/ Kpfc3jx!fm]]q _]&GSyew όUUbkiTz]lW~oTvI*zt_ `}WWcotOzv;+g[սm:%(y:SO'?M{hz.V%֕kFT^M{U[L&L&WBj{ O~S> P4|$% $8T0 paPaHt' Ӱ0A,@X04"B'D޽-}~*sJէMiOHU 0Aa0I """"""؈"8ЈZpV׵+ITBҊa(A\DDG\*ZabӋ-;A&i0TV+MUWiz +&;$]r`DBzuNUOT i qH mzIӴh5^г a4gD"7A=+p8[ iiqB!WMB"""#_UCC uV[p"9jr&w,㳰Kr[(םn;(`g`7 0B2,N fL,-L4-MB"|tI!d¦ +40Ujd'Ah++/O[4ۿ:%ߗI&Sw"ɚ }]%vOa^]%A=kt)yV);Ooola*/i 'wW_QIѣQ֫ZտW]uT]!S##O5\^\>G5@˵0?s2C"F.o*DJAF` Q(43L5PI 4G !xN,&B]GZI{=""3l|gL "l) q >(L yC6*0@AaMń0BaZ, T4~,{ZEc հB`A ZATi MU4[_M0Hz-ދ~O_|noZZuv,zhwwtɿMڄݵ7ƛu&$ocvDjۢQVtN(uHzðH'v p .v nA7jZ-zU֒ӥ^tNӽ$&Azyvڒt G wv%NV%zyKKp>/KZU2wdN+_ۡS;kOO[c:+T_]%T:wa;4uO>Ǧ[oU/ W鰸_ }RT*Q| J~iX ?tL~U KV_W_Guڷ}Uk9B^릻iZ? ¶X n凥/޿ץ_GiyĴO ^'撯_WLWr$.5luUM Ra+J* +_v8o{>5q;A: ]4iO~u_j ڽSӭit&aSMuNj׺#a5U i?߫붺*׸M0a8aE/=~}Dۮa.~ td`DDDDDDDk8a8bei}H*"_vGbHw|Rv KbZ|??kM;N+MmtuM?iM:OAq 6E~NAnmh4 07IIiӦӵIiSM:TKKICki{MP׵ pV ?A[ +JO!G% 8a0a584[$NjIh aFHu_+@q* L܃*WCV؃A-~:Q7OZ.0tM }/K +i@ZT-W ۢ]uM5ZJ*[ۤMm5UTiul]nKJJB꼱ǦPoyn~Ǔ}jtoQ+W~\ehI kuUZֽ*^C)7aU<3tN('}pPUUx^wT4>}U$"""""""" """$f OV AUPJ~'RZ^KDm]jz EƝ$[Zӯv?_I-$/־ZM*K J[_֋t%ˊTIxK]w zRoh$^Z$ -wK~}z _P]/D<~i_^8Z[83ݜKG&Bt,qQxTcոmIJפז  ;0>*֕wQ6Ea4W^MSP0[vzZm&{mV&&t5A]?MSKK]2*ڦ2 iDk,xL&V0;!\!eS`YK&='9Zdǚ~\m Waɏ J^^+z kEA۵Ì4 2\SHg&h Aƛj +!a0kj%ZeR;ez%hDb DB];l|ʦEBqB!XR V Hm:N'aQfLdhSƘDAivQc'nIY L"Cm«r] +WJIl&%nV$dkTAi&<򪔄}}qeHj+ubI7~ޚ[uU +<{n-vTީvG[=D&柙Du~6!d|waOhX('m ]5jkoiwߥ~L'z&ZD`K[gKT[ݦQo #=M 덻mu}뤴g#wZMVUDZ A*}˨mp§czK}7zWKIUJ/[KSmX0Eo~]iwtCt~i}U.:>v@Zb:4Z](4Qi.oC r&bAZNKI4ItN¦ 4X6 +bwZhzWq:jp& i} O]-' u\*4[ L&[Bi ¥0M0L*aDDDDDDDDE} y0ȻDDDDDDEj؊qMi}$P#maw, +Y"#&Y-dV Y/ 05  +̠"#UUro6g>#&h4Fe~XW+1R ,(N,xR>v U4A[:NWHȞ@1OVn4rr/A^vAL& J7hA6G!UACi&]iw]};TIB í5zu%tH}}~ZT4f7tkg@MPGfCd Ȍ:Zyz}/0,3duM`0y8`* 26363#03fm0T,h4 ͙>\`".(a0aiaH$/H_d₦ ]X!i Aj`a4Zw=a44, n(`4\ +T\xKcZoȃNIJ5Sm$T;RQkIwdKVEz>a}[*䜌|$}? [a6nlU]&D%;Qn{Jl +I,zH%cIuzO[}{֯K +.ɾNv,z**D?a_kc_/AKޕt_x99zTƿQWJE{ __蟅|>R]U6?UЩ1?.u''wKׯ Kiwׅ~]o3__ UIii'*!DǓ?DNm}iixA$ڠ?nlGVi {_K_\Wrum0Sq?A$'K_~bثJX_ou_z ]T=4z +aTm1uݵuua'>m-=i酵O>ZPh5[}+UQVمi__?{مJvWzoM.5L5@h0N"XijCn!p-mV!Ȃa(55iojkw*qza4DDDDDDDDCZVn*m6*[ ?MӊMi8 gDExAA;i?N ֚uTv6vl&&itۦ6#B"8jUk .i& M{#u[Mi277OVa^֩Uh0MPal&MqLC Jt'Ta4V`ead4 4 PM qDDDEE#Im{# +zMͪ;fZ$ENGErБ xAJ&$-3:)L@С `R2 +alDtT FxR1d@T]]ўIYn7kRma%&,$ W*A ] zNZ KL'vWzKqo J-'&h+&"*B,7.kH}43faTBT}IFa0T¨SjL/fY'5Mbm0XK[j,{rcjW_oAzn UHill%E݈5Om1{z;YݢݿSCm..+|_?4 ;Jnyޓ{n6Y==.IRNM;]ȱPsO+xupi[[-m6X\oثo$Uzw_w>-ۊ֓?WIoUiUWZK%VVדmj~MʣZYֺ]%zR]?~AҨU%%KJre +CU%CF Ԝ΄HD$maRUŧ}ikkkCQעnkO'ͯ3GIs֧3Ǡ*x*zII--,4TK WD*@wM7}wODݦam5p5ah n;z.rwDv/.7hom3vTv$mix\VuXMjpByv}'pqIOAMXZ G 'Jݑ)Y<#Moַ0T[tث hW 7O : _U[AªSTѨivGm_CگmZiݽ.O1:Nk:꾾"Џ_W}gMlb,? !FCjC2 \:ĝ3)HfCFeC3("CsR A 9 fvfD'"| yr0ia0L0Ah< gA&02(A a4SA +XA,!L vBi0BiiаM4𶝠A0iji&M=m=4{Zw.hDz'qtN75'hN'p։݄;˻woE݂DRP/;Z' ڗt^Q;mtJp I*mG8\'NmSa~ZzuvڗrNQ?jgAWKW䢇OV>Aݭ ߒu^%[okP"O4_%DPL&maX`Wu;x몎M︯ӥֿJiu+I2聢莈#H((D8(BDvbU®1z]}1-ٚ*ٚ#c03&HpzڶmZJ!aUK~?ZN;#48dpn<'KsM9s&iWj-Y=r ˗¦A<6nJCt?/u_[Yn>5ʆ֞:y:cڻ'HpމFO ߷_S^Hs/NDlǓ7OEG4jA{~N?k8ޞcèTy4F?Hn4MFm9w>2>~o׵[5aZԈO{.:/˙3q VyA/):c׷W0]v+x=k_Vҿ(1zu|z" *4OVukoO. &;WޝaAȖȗҎV[>DUOz~ 6)! ^WZR1W$?ROTحj4kZoQJoim4NDZQLR ӊk{ia-eƝۗeߨO=|xkqAWk TQNMAom5M:5ijjVM'R㡿ffOԾiKOTL4Z+ jvO[Ma l'jO 27OT4x8m/fv, 餫%ު ڧi¬0AiNL &8L hva3jpaaA eTh0 a5UV!?.(7};]i6xRxJxE$(ADDDDDDDDD8ə"""";s;jEwn2_y}wM:^T#Dwu'OjZTM-}kn׿'?LQ8ZfJ[Kb_>o9=3w %_(Z moNJwK}]a j%ULSkZ{1Z% >.+O%>OWN}VL.UMtO_;MtޓTz =[N;un6&jiB00_֩O? *X A""#hEzOkB* ' ֚gb"0C<|0E 'qЈUU1R+K KpvF[FXȩA3-2 0RX*(&)3@ i*UM4;aoX[&? ;{}9w"\9O4wikkz_i7>Ⱥ: AuDzܞ 4=SO~UTBzi{R[)ȠE#@CsvD*IF"tuM +IST\=h4PT`9 ƃ40gP'* &xl38it0l0G @@h360A 03dxjhZqa0h4 MB`ńB4`v}&aX&P ݱ =5M=4-SM]4}߮_ _M$==wq( D~ߢo . qa"v]]ݠԘ?:Kv݂ ôN!D 'v &ztR(NvgCII7[n;UEr,V{v-ijV\Vj2xK]' OO/l/x&V_OZzwo}^tФ}TtE Vz. h/W_  ުtcK__({޿w]¶*_###~!~Wס톿JMqJuT߿Ե~_ _Wخ$;І_^D:}긯iW4_f;~i~kU4v8}i0 o^^>^kNپ׮o_ksvO 5]MmkXzuo" $!ѝY'H彵YT[[/[ "GkM*k1vkq}jIE*zP#JKӿjjwzjզ~nOM4h8L%]XO+z &ANmn'a8n : Ӧ iOzUC 4Ku}|45kO_U/5 5 vK. + 8`r&]i*vEpT!0 `dM4AN":PDi#H\؃H'ІGB"."#80D" Ћ0DD0DEDDDDDDDDDFDDDDDDDjDDZگ*((a*J#QQAZxS"!.DHedYȾd1 {PAۃ,FqA"A[ +ܶDhaG:ZoaZ'2n?l:a AqWt +k^I k;tY'TXY'hZZQe޽'$VIaD[#QǫA;hl ~TҼ.痙Li)P  aBjޚZK"4 Ѽf*hBM + 5MVҷK]/?.yӢ4׬?GQX3q)fqg ML&rA ,v}'q`D0lk P4 * +juHiEH<ѻ<MUSM=Sc}uU*TnNDk 4O%nGm'pIYqV-pp֑qqEq]K\5:P+}Eq:.&}m_]iTtI-PD/G]U-..]BUb"QKZKx']oT1߆0^>j&T/@zKZ늪RI֪5Wa-"BO9$2h:-C$1# x#%'2$d:?ֺ_/E^7]uU}7^ۺO+2AFq2|}4$DZ J읛?G2A38 yNA8F0f&`3L3c6gÅAhfqryG@-WIV^J^*Id?Mja0< ``K ;>"i` K`0hcNOk_UiWk[}Kj!mQڶ RxL& h0M?]WM_N.nS߻RzӭV󋬝tZOKUI{g3jG6X\SMUuӧDi? KQD4Q8w~^6D˾^;D'm'{_ꫩo)_{vXz=i340TaVm^ <'J蝹;;M8aua]}ȯA>"6Ev4V?TӲ+O?V6tUe֒Cݸvo] 6ª =V6m%݊i1W P)u mTum<)=!״iiA9=AepWVhWi}_w|X=S۶Z~bRؠ6(&4t_]U5L&kAaS£M;hEimh/ӪV75~moq׾ %vM. *a0¡a0DDDDDDDE']7[7%w!5][PI0@DDDDDRHDRI*{__W^7E \*XO!u_WzBեĮU*B4J-o枂~QFWk}MU>~sZk '}_kzM/ucҦVoP]6Un {߽߷KznO{V_ l8mnxWm0?J[I5ᄛJ!u}oE;LR}/z'iN)84 zivN*<*aAJ}kn|Ci4Nzozh\]h4馯kt"a.+}W p AA! +nR +0&8 ONЏU2jTv2F2"B!a4 .VXE&A&Wx"t>gDCDCDDDCDDDDDDDDDDqi0>""4jsҹ>Il[ۼ~[ y }0^x&ype'N/Ei[dzxO"唄Y^<ԁd kvjܵ +L&{0hۯrD'徻^wnQ*N[vm@/OUiƆXl{Cҏ۪{N&UM0cuΙT*aM2"nc! F#FFD2:ěR  f$#Ays$ C$ fh2 hAE9V_`#f'a 4,f `aeA@@fl 0AńxA a5A !aT& *hXD1.!MSC4vUOh]k$?zqi:t4I߬DǬ$Hzn6'D+t]v 6;x\FEa\˼D.( :/2nᑽ'dW1Ii.yà[ >OdSz&ڧi7nwxuo鴺O]kiz,<"g;%"1Յ ጆ1Q{ƚ_HZ /ɲ-en +ED#{h_K0Ah\!kk&ra] C _l4 gp=|"PmZ6ZW3@`;ۻv^8m("qn4Q;&3N mtiܝ7 _ֿItI4LwߨނzGo^#X"a=ocx~+_ +Z /K]Nϝ؋?=hF~ںPm=}z\:&6EQoiRaȈS%2'rvNa;5EmuL{½]jw[}~$VV_*BnIȤiO83F'3"%F""#-DDDDDDGK~䇭I_K'*z[{tDq!KKKׯJZJ-R 71^/I}U_׷q揷ϩ'꿥ꗭiJ/vZZ_UKL*_^U_Ow{Z6**/?ijGUv%bwiͅ[~Ů USz>-wgj }F0]N&Oq=$7ÇtӥJl%a//i\V~'|U MZӫvcT %Kb+!I:Zd!{M>V!8evN˄XU]1RRM4&_PiNiE8EIUTv7UAa +l&A DD\G4*iTF!EDDDX!Ф"""")5@~ƔRC%2.HUJ"6ҪbU5CF"7r+KP,D!U-E W`֢_:3)9d)莈}x*pA0 4 Ah3BDV^.)a h;LM<&0o_5龫i>!Z;>8z.X(An?wQDSAwIGdqRE?;l/Pm <.l-?ֺ⾺MtAW_S\1n; B_hmh-߯ڦsiBnD:D_T 6Ik]]a޿k~/z[O?]>/Width 2566/BitsPerComponent 1/Length 44881>>stream +6028CVIRL!٘TC4`C +F>3쩄7EђBB P@i ; PBh̊BȻ9 29XB` n6d2p CdxgE>f3c? #N.&H-DgVm4b@3F#V <٦j" a &L CPBL'1a4-;0ON"a :f: t30ACC0C)F^N @ϔC ߡM.a?!/~1qAVŻǯoc?Š7دᏇmD   y.W_IOUKwM^亮T z7};>_~_on!JBW*"T ޻EȢBȺ/nzo[~{WoEaiot]nuWEWDWΈ4~׶+um;_:[՚/4)?[?fw_XZ_ +{3޿ol-ZkOfkjkk|ӿ + /{t+꽯L0 Z_jͧ^խ۶ӯK___oYiGDZlWTAF8,{V_Jcuv?޾z Kwi{uM_/wJڏ?i;^; % *}-Q%TA#)XV0AA5iSBwMMZMTpզ$Ǫ{iPiPMU&RoiXjZjMIj6WjxM&W XikTT^40m`L [}됎 +MU]5iOd3 A04&6BAaBinC9;ARAAAP0E  &e0MA aN< dn ӆk"{"B"%:DDDDDDDDDDDDDDDDDDDDDDDDDDDDX! DFEa$ G L&L.x +8"""#^h SlUZmDLEpDi e +v9@;C c#Pʛ޾ڢHZA7-6ޝ X-^\{: /:' >jޗ__^tXe_)yњ聗f!!7 !< Aa@0@ψp@g@!ph _$"wIT +B?$]'}/}\=T[~u}},*}O>_*=o/U~a/_uA}-_S*/]nԈ3"UG1"k+{]}"h/u{_ۦ{K]WMtݵ$ojӯS4]fݪ٢'4? +_'_N/l/ڶN +LU0a'z=X%a׍֛[}![]xI5tc>Ҏ6Wּ@:}iY{V-_)i6*o MOBLPNj4kjid 頃IM OMXjMB 5iDªVMC(r& :DH0AL& ]a0 n$L&@aOm&Aˆ"""""""""""!5DvO%N=d)QddK Z.G3R3G`)Ԍ"9B"E E^"@D)9*9CZeѠB23EEUFw2##dwPt.@fhDPBLBDS X!&!!D3„C'" +ĝa8Bq D1'C?5#ЋzNBLS +lDKԩGe2Ã&x[}_]i?'}_z~)Mÿ^KWw杊B1߫uCWm{x]`wzO[oVw+00]~=_O~;~%Q݇Xq}u#;_aKP݇ zտKvokҶat~PqSn]{`w h {o[p?V(}݆9} /ܓ_J~o&wօm1ɻqaCy4a:G֣ ~8A{rzw.w_ɻ o_iky_N Q'*˛_߯_W_['@{/O޿|oV_}WYt~VZ;]ou޻{}m뾺VWk}߶ýB:ZV~vj)/utJ\%{W $ C oT ڰJ_a4 i'ݾٝ߄\VՆ XhRФ)5O`n݊cXqH}|TSADtn)5b$S.m&o{ӽv4@0AmL(H  kLU h l:K 1AA a !ipO`0,Rj܈=}w[pg5ky^ikjPh7AAPA  *T-2  4 'q8M8A a +'30A*״>4 &qa""""DDDDDDI4""DDDDDDk1PL! &4#KH."D-1lr h!ͅ0)ЅრSa`4!3 gFGΡabDS 850PR`p)WІ` +B0D>E J`!;0Uvo|65@paa"-0 AG6$ l0A 00;|UdiOY~OM*][vOH۴kM.({J O|7WM:Aꟷmuл&wA?߯t}}w}[MӾ۽+~>z5]8NNl aO5-}ۤvL.3}p_U( I{߷vKw__UwW;޼{Oq_zM$+_] +}W~"kIWԐNy!YcLxF}EzGߵM7[Ƶ~!cC-zuxk_k^7ҿw|tM߿яww'~iu4M_&}T_CI7tXoZL>4\7MwTKTmv6+>-/35k%PJ (a. w[[_{ +GZqii~h7M +B>4 &aS $[Cm6#]Նڲ:[aۄN Apm&ݤA nB7-iS aA4ؤA=? pT%] kiM6m M`IЈ`D(0DbfVq,(8 e!rvh2Ah05XaoDE"""""""uDkCUQ2N&QT!LdE?"ْHJA +!S#c5# б \&eYe]0T]PPA Cuvxa~TމE"8im!/A{]^ 녧|3%&)-w^`XAa &C6gp#0L.$DDDDDDFD\DFKdT\pG_eZ BڰYQW,PL Ǵ ;c!YeS fv^aSM; +L5 z~3^{΃֝')K#i;N*#Я9cJRV"K^~_S-U~Ve>9$9ryfU2'e2vum25#4t2)’'"We[ݼJAv]d8"8fa„ 4a4s6!x*xL8͙31P3#fh3fq##P0@2;?͑? .h;#9-w +ZOM4-:Bk骦N¦Pa &4 8`0}B *j!`ZM0B-4N :t缸n`8~g.,$[0p\etM-*4ub\9E^L}ihU7.nM|xM.VyzW $ﴓCmHnǥ C|ߧPa;n#c Eڴ97 ~=]闁7^[&Kd;/={'zMװwM&:j\k+nɿLtqmN[ޝRoIb7nҿ:*:izhce4O=W^cm _I[zuuÅO$9&]nN_DO BXE^t?گ%\ko("Cu$>~z7ٞ? uDںTkqǫvG_oju?kK]a{ao?ށma!j%mRO:a_O~VWWk݂)a?u.NX`\Wݵnv}4U!|\0u %B# M{ZȱbL`ou8:jliӶlRi{06a<33>]EԎm<<Ё`/m#✂!ÒO)6Fr Exg7aNd.GYf~ꪝR{Tca{}1hzkMS aSԷH{.'y"pR􋆋ӆhi;REoHj..<]y +'kݰ]Kw5\WMZt(k+ +7ۥM1O2wòv&d]h}뤿AæҪB  x??m/_ Z+6ߗX`-Tf =h&# -490~/,%X+.+ ~W⿿zcn{^}8h8Diok8H.ϵ}/3ECY +ϧA~jgU9]gߚn<Q?3âqE[Z B~5#ᮽ:ttv 6Z ܘ 5a[ .ڷ &4gyamm mGuTLwaK@쎕X.U?☽=+Xa(ᦿ^֟iieV/i)vcvBݦ;.bc!5z!ZCjt6&ըk/M46v]i=>m4&m4M0 QmW t:MiVF:i5Ԋ?F:j"MVa21L&00AL%\4uh5Za4!a4!#a0A0Ai  !""" $  a`BІD0A>"BjX@d&A7 +C""""";Vh0*&㺳TE@ bQDeJ%y&h"Gb"UL$Zv*@ + aM0L0 XM3i4*MP}OiwDvgh't lw s;&⾒O{oM?OՋr4~Iqz?㎓(fhfjD!4da:0α"!b-21y4"i1f,:$QHB"a< "υ4A 3h0!gÄ&08drAq>/A.O8@T^yf31NEᓐLןC4f995fyѩ~L!ih0L!M4 4M M=WOACk &L(A 0CMB` h4-zw& .j}w-SI[~-ޕ'!hzijޝ&ApMImEA;1ދ +k'I>㰥AaMw ...(ݢq}yojhݓ;'*lP'eN5tO nw'u'tjNw-]2x^kj/i;WIO~<{>]qWOMOzMEX\WMZO߿'eOC'w%/گc_n%N!Hs%!?}V?4,ګz_nd=}H"ƿ_ ^޿/ECwsEa?]{&/[_ ~ү?ҿna|l谵]v_=/_;Fp.U[?mn]~X)n[[{_nᥠkeץoVKuc۷7} +iXv7[_=; /[I}=_Dz$)v85M+wP)vTK~A&*/.+qiijm[iMa8NEIqZM[qjcb6I4׎4mkm5Wx]Ma4֫m0i>jpmzm:~A a& m]ڽTaw M¯0Pam4wzioamXa4aPaa[UAtA0_mlu\& & ?i"""DDDDDD0B""Z"""AAb@*@E),!DA ЉVB `4B 0;B,/b4""""""""""#icmt+MՄ#Ac "$rѠh40gLJS C.A3-B$ٞw[K2>RzO ii +4(PPBDNAvu0UOUM^ªyojg jg'omE[k֝;>73ߦsD;{이h-QIOЎ'j_?믿oWS_OU_2{diϣlC>2!'#1".dhthkF"kW>hD#PD&C mQoFr[kE_~aڴ޶_&nD„8ao/(RzwkDNˋ +F=tO]&&YttllvlނmQvOz[ahqY8'ߏIɎ앺~xHtvWBO_V˅Zq/uROa7'}}Ooևz z}鯿wokt:k H/^u_}{K]Nn^Kykr_xnKdBOɨ,7!x_Wj!k +?[YhĿ-]p]cי|ϻ84_ qEhEh-]~v?hiy?Ga__kΨ?_8}?m3Xkvm}Wu/O_5]Kƽz}|5݊^Ҋc˯ca?׷TC5Kacﰑj׾)ۈ;j;뭰5үr,?w_"~WE܋un*4im' 4ߊi4wM6 IM=6)68Skziݠӷt4ni{t5iSMFڦh4Ӧ'aM6[]7uUtPڦ&kJTMliݧk:i ' nM2N#; 㰞i I)wd.䞯[[O h0 n[ )`&!1."""Ԉ>"!"D":0"""bս$\jI5iB ! 3!TK Gɢ1y]-ӲSLAL0aJL&w\EfFCeLge=4`5U T-4&VSa-@r跶ӻnvmMht?|ee;EZ M?**GƓW}!mGm;~J/;^OʵJv_fc4F#SA9㑘q9erA̜኶?憃>3<:fx<&<噑jHe4g٦b335S3XCM3C\Piz fdD.d"!Oh V, " @ (&AXApOL!aawp„/A"@@а @*wz`AgL8" : az ~CU6?m4D8۪ii&Z0Pa;L*i\$\=e'!HN&=ڦoo^Kw+nqEwa}kqEqjknOCa"hq75N“#7MIƭImIA+%& 5m{Mp齯j'ն\t\:m' նLpxmlZi]=5_'㶺IޝnM׫wI6M{Ou_^_c{cСҫ_uh-k?Ai޻׈X?.4>?ӖW`{_؂^!h/a+oX<V* +c"__ }u%_~ o67D??Ƭ~ggKs<P_/m{Ao]/qZ__vړ_ :_vkMgDZp /[g m-~{K_(k o^M^{.ccbcHe^%ᅵS5ooC+Xq]z?t +^iz8mCJ!hDCG}ںowm];R-.ӄ m&O^ATIitڏMްipkA6)74i66)4_(_kO~NPl4Nצ}ջI~mmR ;$a5Xa2 0a40FTze: 2(氁RA  && +Sa2'6] Q@">@*f8M=#OM4 kaOAD!DT8!"""""""""""DDDDDC_K^YSil$}]GXI&0CIЦAf)%D ;3#qOyR;-e\vSEQxfёL)  8j0MBd` +g2=Ua>W[MP„ tX3l9p`KwECTlpo>׆U M8}}}GGӭGW֓_Z:!\C{(eIy|X)<F A3fP .ι6vg< yv| h3 g3YDr +̐3Zw4̐g9ev]8NA0a vh2i43͓l2:"tSM v 0GaBB 40 PPO!a<&LZiÇMal&X  ;0BaP0A/tMMU5qU~h<. ST5OzZ& a"ދ-.emE`~qp5tl&]lkm:.-mq݄v+vDwdd_lw(_Om䣼%tvoz}ޝ'~V}WI.8_t-:k} +:zӯ˘&O~ U;-M}G:M֘[u}w_:__u_ +\ADuڇK~ ɨ&e|=?a~,&m {s+,6 җ·0_D~o]鴸 +W8'aq:N:.+q&_3oZ}^/36~i拵_ +9]l:[}~i r7g[WoJ}-L:_kOۯ]ZNi~^l. *]w_o0kk0[a~ع)ƛx%}iȱı7cuA.9 u{uuUWwcD1AT~-{xvշ4648vim]iݱQw{Ŷյ *pN4vZQ ZozӋaUkM\ a$ML&mt$Mh&j;@ H;bN!kcONctA Op]:ia{Tڶ~c޶ixi uR7T:5MS#tӵ0jZ᭒ut}i;a:'6MMP&A wB"ea4 a0B"!`DDf!0AFPDDDDDDDDDGDE\DDDՎa' D~Y\'_{- I|H `mkaZ_Oik[-5PE_ ?ݺ7 uV~T;jP޿{l/ka_ZTokl%[^ޚ׏0~+ aw9GUsk\q:jװ av)-O l]ki{/jľRD6HͲFE2s("tbb>3NA31,ua+ m1 J$U 5[_OWNqZAkV~,EԘX@ aX' *, ӋAh8` ic=ݦLL AQ'^qL ӊa4H4m?AOA 5P Ma TM {40za?NL!U }C^Ȯ:}|44ȣ4[^/릸MPNM~$?`vw..pi%A;1da3(HA aN4Aq0D C;pS&Z(DDDDDDDDDDDDDDDD'w%tNJג%Ҽt?vF:d=uZO]1Nm w:z~ն/ RƿZ-7tMkq / |B_d687w^4 r_gj P&C$mk={B7\,g/i ߅ſU߯~DoO?%DNlYׯ+_ִyu{0-ڇݵa- *k1]X0MҊK&{aW]^] /맵޿AXAű&;V+☾D_vA}KMqv\u qNӦ&M:ݥi;ML&( M(*Dё(Gxz8AB:4iئOMm&ӄQI4 iWGkFw ّ[MAS ;uI&jP7k >" - 'an;L& +*UL*idW F4e „A80idp"M  0 aA ]맪DE-e_&=SwONvnjם $K_F1tפi4[;[qgd,ԩʧHD_B(\. 5Ds,X54f3C q 3O9e8380G h6dvfDh d ` gBa +XB 4XA۴M4@͆ [Z L!` &`35Aij'꭬ZM;(MST"zӆ DvN.7hU$]O8r$ w'%M#{8j܎=IVODg nwNT輷n6N} &SpҒӲC۪&맥d ;$괝5Vm+%}Jlʙ;;GbFE-_oO_B_OMz_V^NodКzT(A4 ]zo_ߡuޣAkZ![__ ~Rɦi~o^붿k]|/l)zݢan܋o蝯DGD6Ӥ??Ax"斿}!_Xajz[U}ujm~5}__w %}kik5޿WZ3\:@PVK%!zddFf"IJ#Jf3R(di-m_Vqu#igflApDl"R]qA0PA8`(l fpȁ483f3a0A,0B0 3B 0k G⭥ x m)1mH/~=!`(APBӻBª[A;L!PzO40i6b}t64_iIa;Mm;MT ~bNuZuڨOzZO[ݢO֝[D{VpީM4 kitRuI0ikPoi>˿qt]7rw{DӢyDyq &m'Dwv }n7{T-LV#^ &E#pM5WM;__+doao^wwtm> ={}VY+~"!4! &0A`R!,X! .1ee9SC at1%GAm/ O.=I>'kdGM:B"""""""""""#= ]'qըOZ[C. Q='_Z A}kuDҭwa/_ +__nn?uu+tx__C_PID:'_d٧A=4¶g]"B\uk7c";[C-]vZU/Kt ӷ k0{Wߦ*ՊD{@ڮ.+H]/Z@_"[ ~vZmFLi]v-i4!ti4wA~>tH;tM:ti4QMCM'm]4U4ҪTߪMNMZim~Aʛ3#q#08}paMwa4װXa404;\ 2pa4˰M8L-p +DDDDE! """"""""""""""?궩HwoY6YJMnyDe +iCD}ӤG_}-uiJ^Έ*ISEm#fBHz>*ei DSi Ͳ4 `3DzSA3Df%XN*EwvO[TF>ޓn75MDDڢqMz MtNyw^tNr8oDNzZ 8z'ëVՆPu[BQP+%JLt|R<*pvJI 02nnoNm׿p?]7 +P~=~}޾DhDF[XQսwUo^ _. Ѕ_Juya.]_Dcma i.c~+_j~Ɖ?Dעw^ONN4Az 4GpkG_fzV߽z_V^ׯikZ۴)Q^׺\._/~%>=XVБuֵ;[0n)~IN4B"~vSv ڸankeµi6*=44qRm;v!qA;AI tݤNii>T^m&^ Wvh4vEi-]\& z -$lLTC a\ L!`j] ir9S0Be& #Z4CDDD0DD0CExDQ=DDE'qXK[?dAkI4ax0YWJ*d df(24RRa2!"!xABi)a  QPDGT&.SUUUk[AMkݧϢ'w4Wmi\'s܋ޤJS4v+Tʡ8[ЯBa0pd`P̂N@6S{kkVV™DnU]t[:}~ 5vK,wv1<>!* 4q(d7^3Y&jιC5(dZ4fGDAYt~RP a7iﻧ3;88N(A@3fB a :a<&30`  fL0xA v`T0LiڦӤQvR&wa=5~TVMBWA &&רI0Etp|U4N4oVz& Ri',zvi}߿_' 0Nxl0NܼL+(˽l&p$܂CH6EN3e͢xmӰZ' ZzLy;;;JO%O}SòVGkwnۯINC"Isq*Cfum\dlgY[OIxo]xпmu ~Z>/e;3eAgl'˴,0B e 5r'QNAH @F @ zKkONůu߭U+ W] v^֯h'xA a oՋ +;EE/ >﯄XcRc[k4:[NwN_I0릛F&WW.ۭVrA+&vY;3wH Dݺ'qaa]M}nr)xv Dtn.m?ò+Dk;5#wNZ}SkWҒ%mAv?_'Hx{o_&~=$6Iɺ>NBxvu'Owܝ?NQQ=w;؍=_wwi٫=M }~,?vҥ4]^i>i^_Kkl'^qa6?F܄v׺_x`*OݮL?WIp_R.]^Dķ|S b׽b; \5O.^C'w{~RRziSIOMM;⚮)bWu{SK۷z%$'__/m im4TII4in ;wMim?!΋YaP^i?_50i{T .jKO mS]V v=uKC({Aa0 a0D4˰M8ae4 h0N * h8iARVaB,84 Maht׮ڵ %_W_a+k؈";_d[ Zr&v*Ӻ,EZG"fحZӺu$)Xxwk +mMt8ㆥ +$$M47PxAP?iZitiR_ӿhM]_[SK +OM7寧l ax TUMA27P )]ŭ0iSUSTxk"ALD"""#.XDIDDDDDDDDDDDZإWDa-ti' +Ghj+D -23=Bi8~UX6.> VTsUTY, ̃ؼVdQq+GbQ"wn7T(UA‚j20S8*xo^ת[j 0:ʜP:RM*;'ZE3R*Q-:1.@ A`<*! 0Gg h0D_<g 3y@hg%Lp@O A @'`8Fuz4ë|y\Vkj4  5Z0ۄLBC,&D,&G^]4o&Sfqw~[PZHD8m4.l)v& +pݩwp.;vHMywv]m%NA龥I% 2+l$p7uImvӰmTᑹ\NK(H2ALtgAD|4q Dy3? Zo#YLAxgA'd7<{x&  L+쓅~_OalO$4ս4͘A<* ͐A!  + !a00A0h8XA`' +'a4fqvhc8 Aq`Aד|&wu_Ӳp߲sS'uPNwڴN^?._]}ڤ4?C/\14׳OZI??h7uֽA__b_!vui{jֿڽ?_H*_hE'!ܒ(6Zn[m-au z_֩P`ҦkKЯY:_x]vKm)Sq[_}Muu߶bKm9A}o~b'ۿ{Z$nZlTzvX +oT]hTm6zE lUM{JONEY:/Ἕ2(h-7~C_wVi44mb4k j(mH$iuAado?/֚t'Z_M*Nҵ_ a+L/iҵ}]zj״i0{ +Si~ _h0M;AaS +릘NaLT i4k&4ݒMpi\}IOoa^[KmQIمQYlЈQh}WWiZK%J!%e.iC {N?kǯlq^F4B)66|4ӊn m6鴛!OTt ׄ֞h @-iU +Zii 5MSjk +ozPײ+A׆uQӆgA j Be"!8a4 'ed&T!Ɏ80ܤX$N0=(p 4ɲKhDDG_ IciPn?  e첥gfDA@32;& g +M4T* 0M:}We&yw}ܘj +W8=W^^*_wwA\:D$`ϲM d!ę&a9!` ב1HhEuF2*B S Q6g jh;nӠq`CA#Ba0@8 aZ B  3(A0M@84DŽ &fAiqiTUL&AaVTikwixOA0C w7hDݵ&>8v&SEM_EM:^Ǻ-7HԹ+E ﶂn\4Awƞ +̸}wN r>0H Iᙊh< TA 03ff i C@OK@J>td[Im]'-ƶۿ%^K _CA@`a>-V,*x xm3CKzlL?޸d{o<&Mװީm4O>OMUWO}]?Kc5Ccu1yqNE\Q8n'$ׯ.ׯZ~ O_z_tNCINH~F'tO,+n] .ܚ//&bɘz'>Ҵl./T4y{vM^?.ﭿӡoo~?޴IҿXcغ٧w_׷"fif7K,6ߧz_޿A/?8k8V{+z`MO_u_}[)X{J7ֿm/_%a~Oq_WZM}0խ[[J+cۯ\O%kkiCV1dL}ACc WY&;k[ kiuUO`_#uM6b*SN*+iazӊ}W5VbL&v׷A_G0Ij:ji:M4ONMmBi4kڧ4Z ݫ׽^WkM~״aSATS 4a=a5MW~[ l MTWXd׍1 )1襃Dв#L@4"D0@`0NL&iih4ЉPv;[[w6]b[X*"""#4""""""8iVaju[L'kwkzM4իU[pP>Ba(kB-{5Oma־DDB"#,h P2VA Pa +iuTiH/cb.PU  +#-iQ"(NƘRa02鬲fZzڼXYy%fd3DdWD +[A5L&0HiT…"A"Fa'%/aB-5TB^x+{tD>U__7W5 %d,{v;NLrIbULS<vkM :oz o\̊Q C5ȠP@D:QgD\%dE!`8a3]X@v0'’=ON-OMU8Nִm;xM{$Ve;3>' U7ڿyD tkFq HDR\!I&jΑ:ȼ+Dݿ.=w転v wDDկ +MN'wńLةA An  54A=L ^~ +FA ) @0CHvޓiwIWWZ[oKkuzu_*wD wc\/IW Rv+mnZ]< 8/#W%=~_U +q_'W[' z}v]i4 i'?V_z=Z_k_}:q#Cvuz_U:o'WD?ptzɫ']ɫȮ +?oUu0I_oO^AzYkiudt;}`_Uo +__ z_i$6w~imawko߶݄ +; +{M;4'^`x#Siװd~D~V*Ү(e[Aah91Rh9 O_>}{i.Ӌ*6ki4uㆬZiTiH>m6Nam{m{^V_]kkiI 68oZa6)h& >An; ~tA *)^ӽw}m j ,0JIt UAڻ Vvh5Pvռ&^Mm5vKbK /"^ ݊iZ݄D~ŻmR-Tbظaj²xh2 ª !dSL ɸ aA2pM5 CL8&OPd 09 A :h5li]kpcثb DDDDDDDDDDDDF^YЈ ¦TM7NH6 6AAAh; M?ii4mV{J״VUZj &aa0L&W] hjNa4Ta5MPaL&iM4A„ A: &@4 a0"#B!5s#xaV0_v1T[e2E-ewi aaS +U5jɹ+z-83qYS;H!" <2 + + 0PDL$s#Xch=?C5O5qqtkUۢFfNRU[7s$Eiy;MsDwyF;:UJC:kFє Q ife3 i١f3AA r8ffCGqON24@]f!͌Ś0R8r@@A ߯ p30R 0M84  <a i a аj*l~>TɘBt%zjiiijh{;wjF>? +hH3<.2 +F0ASra r&r*r.dT2B3˳C$3Af sy}HP`32B1 H9w[wp"CD;D&;v;n8'mNHmiwD\wEj>`CA^30uA0CN 0' N w!ińԻaGH'z{xM +A=aMw}SkA#r-JN8;$/w_PTװU5 M{T-4NAa6NMz' +6JOoԞP/d:V$|&jۡDo8$]7wNՅ.OrE9vޓVC-~++ ״4u? ~zD 8:.ᑻxNHRԻl-Nm zunE'wDH]<1i~ƟAa&ǼRWJwk_ +_Y<'&uN ]Pr!~z/_i>~{jҴ|O}m~\\'WT/ˮ՗Wz/ooc=_ }-v1zZb_ !IrtRk_}0ߪ~Azvi([ff"__h/E[dn7VOLQRuk={d/MQ::}2}ֿ6kvںOY=%uڽ=oֿW w'wa{^& W_&avb~_mJ>Nb(%~u!f_aA5a._c¾ڡ%?߿_a;K{՚/?AU}Ӻc+|{wل+Ұ] b ~ժW^.רi5zw;kkj0wk]>ӥi]v)5 V):zi8iMja7_a[V&[ v·k{jOkX[th'ttnii%{MSh&Ai׋بiIu`wƼqN?ZﵰUEmخ}[&֡US^ +ivFi0d*ii 4׷맱qZmCVضX}85KLh04MN8AOvM Ru 4ADAVDD~' 5kAwQ[i0}M7}ڤmB""""DDDDDDDDDDDDGKm:kvi;{]ݤ;iݥO iii5i.JAiȃUȣڪTvHpL'Nd iiچqi 8@HOR ae54A4<"C`D0@`XCB""" !`DF)+""#T_\잭hS + ^MЍ2*b .41-HLr2gB%,%Q\v +(, `<PBhjUPrYWU/!I0[Mw;ErUZw8zw_Zrl ^vW[vXdKZ̄ +Q ѿ0dO0VmS$-m2CNtg@PD`C3dqs$\| &ȾEd03j4 &f, 6, qh3@#a 36: e (@` ińj  +/NjT[^Ӯt&M50AiL&v ii֚OZr4T %[2BF6@D fCF_'U^A`(i"AͯM᧦Nҵqi&vrc涋{"v'nUmS]Q7\o[' +W_o_M:;ZN|n*b*OyRp7hQ(hN%w "CMݫim˶`]Ӿ/^4N{Vկ*{_b_ޡWc~]W`M<.vC8Tۤ5 &WzvJ%o%n퍦m_-?ȎV9' + Av_Yz? CwdWXA<'}h_z|vwO 'IMڧi4 h4};;VMWWi0]5KSkvu׵"[ kk@anXinUii5N I0h-h2ڈwKa(v״b"{J]4MZbը)cBP^R M2vMmL! FPJ""""""""8,|~IAiz +_mXOL&ATn uTI"""""""""""""*kM0M'z]5j][]UV5uPkk讖 ;R8M4]oA4;B0([U<8M0 ATLPa2vT|": &g EZ  ! "aDC"""""#'R눏JKEC+W .v#M;VX` +""2I(U Gd 01e#NAa4Ї,vUW+)<*֗#DOek;"=Ml;Ra3 `,|t\aI`NܓP +ziq;H3Uu]U _h[C;hU=A4'}|Wn_.&Ӈp +,{>JOa u^*q*cRV*QF[R'js~{/ K2s$# 2tax@E3F]0 h2]Ayl<252e0A@X&A +A_04__ѬsɃS'KA- 4&fT-xL`ޞP_]>v+3:D0dY'5C&dS gC'&I `42 "3Ag +iiӷi>78ܻapH{ +WUa;! Aaf„ 0L…aNaBa<$ۖF=l08.։D軴—'v NN-.K=nmM0TpMUSMU5C]OWzjPEdqi7T'Kl;'$?d!p~UDǷV&;NԔ_TNi<}PJPE++['oOoMO:K[K /N_iNT.W};n]h]~b // M%_B˪.Wᎌ-{1t_iw =?  U/c(x.K?_cDǿDf~B^}VHh _Ocu %w_:^zfɆX}k/ b?\/xo_//xOkץ /8XoC"HtJ?o^W/a޿vKaS)WNN&hm׷4iȮ/Afw ._^p`{لc"OAU_mV7J6zV\zk뵰ƶk}.{iC[&_᭄puk]ᄭ&>-6#XiGűWzm[ 'M mA?iۄW_p +?մث ӆG}Xi7NFzt6=8:iv6AWk nbwj鰼m|Cb?k!8a+NUM''RzpvX[_#t_MlLpMxSM?M:i4vI i7421¦M +P*k 42Ve; h#4 0 40DDFM4pm4WMzw_vjii60bkC2ӂjP44404h0aS% Ga0q a5aXAZhXB e8B a`0M0DDCB'7DDDDDDDDDRDDGj)4 U>ӽvDa@@R#LGay?;5+xAda0ݴp CL%q؜ILiv-8@v & + ; iBaS}tUUUvKvwÕi0Ewp4avÐ-Ⱥwwp#*8_wR_ jFJ &M4 /M< M=S]5TAMU?C_Z 0 5TN05M4;[ U ?&Bi'h0[_ӿ\B% 4Hw zu./SNߢqn\ea;Ro8n[]tDzizz։Iqhwi"AWziVzm]ptj-6mituM4ZiiT4 0MZi}6 i6Mi5i&AN4M&N a4i}a4OL׻  ׵[_AviHVEBUޘ[L&ȣK 4!m~wD $b!Bpe0:f giAi '`,H@09 B !O( g*0 !a2A0 /4Dda8T N 0NCC4Ra20 h4 """"""4"4""""""""""2l42DDDDDDDDDDDDDDDDDDDDDDDDuiqcPa&0 2 PiDDb>[}b:;sC&ƶ[gu2%0NUAB +.Z{^跢ރr]gbI%j{=4PRyH(jvBN^Z# ѴOdjY]L33ȀH +K'"|5. h2xٜ2qA'{FH0B8A Ed3lGថ3N31Nʁ e &d06G .ZiB `,ఘBj`!ih,&C0L&| vi𚦆P,'a0݄, =Bj +iB 5MjM<&ӯkihxM=UHY!'HwO\eõDIo{M\>]\7i'n7Ɛ}a݂w7s^]I'N.Az/)~J)ld_o ;.N8V'0a;Uk{j_'n 4Kׯ{$__kw^}aA{MW]/u^xAӪP]t!~~!^O}.N _-v~+Qp^a gAC2(fd[40@U0'L&2!I&a,.> a4A +MS\&iIaPi'~4M4PM0jw=\4?D}uIm?A|k7vntj&Mh֩zJ{꨷pOWm޵nl}=:믺\^~ ڬnk Gjn}ዿZN-Cd)ȣ5I] fFPDcL.~RaJC 6g><&kaAaB?wR^"kx_/7;ЋT44-SOM5MJw<4'k~h{wѭ t]go +_Ҿm{[wݺvN+'wujn&KnM7kv^-KU8a$ڧJNŴ׆WxAOcZT^^ڥ~_xo}Ru]jqkt?S pJa~߿B'a=[n餿w_^a__oښ*}[F]%үKjxo WTHw,y)~W}$>]u+{liu }?կgK*I#~Oe H^$/a}0$zUڜ=$?Wjkkh$ }ZK⿶={Km&C6JRuI_b*J+m$RJIiۦӍi6P*)*)Xbi 0IB PûjkkWimFյUU5L&4j }xkdWj7ԧAj0 %Th090!0DDDDDAeHl!"""#B*""""ЊAZYV+_U{^b#  +endstream +endobj +54 0 obj +<>/Width 2566/BitsPerComponent 1/Length 12>>stream + +endstream +endobj +26 0 obj +<>stream +x}rDZ=~kw$%'&10 H9vgʬ*tV3!;A@ħꪼ_EsglD_9ݗ/w6_/߾" ݷ_|_x?~WRZ5v!p63ZM`@jΌ=x IMuYduԭ;s pO7'M>< to6[E>>3z7䣶!H 3-XWYkq}]{nŠ :atd۝nhq9Qy{@v,^>WÑ|H`lPGR6)^}慟/>g+Ieݙ?aRN& 9]Hκt:X /B$2 ]gʇ|Ɵ*a8 py~bN|?WB>/ Ǘc鋮Nl-\֪3f6f;NAMI0@XAlg"L:2rmz`k lC Uۢ`p߰?2'23 +'emam|A0:?W= ;oWIۤăWTRSe:ZFOf7r{PHՍۄ#7dD*]OU(kf/fd\I'cU鼑TQvUE)GT@F}, 91IBi.$`qCӒ"2jEH#a +:]T>O:N'RDO) J[ɚl9e 鑏6p +ѷT!|4`fmf@F&Zϛ۫ [# Ƿ]-j&$vaaf$h<(|G|9RGcH:}խt-al,r '? + +ܪ.p?qx5eY#|`.\>+w@%XYj+/c+L(9.4όky.9>P;Vz}Wtaf"hl[ uj١^&+It \4c9SMju-`G+6>&Η +HːQ}dUŠk߀4#c\yHj7nUc&HFo۴M.Qv_x@g)BC[b~  מ3ɾL"z=ՊZczD2x6TVʠƯ; IdU'ʢoY6Ւj͡kZ0Emrd5@oRkAwT!y8ন N kaGȅ(E Tbe3h }X#ȓ~Qwiw IߋMQ;?ok +HTG9HmRoD˹YQ3ݻHTm BL@&]V_jpuսXHijˋ?;Q 2)F%-(F1^XoҋpU Eo5@=g`9ɠT:Vho- +e-c؄kÿPJr/'9.ȳfIjrf[̵J c[H}Uw">!gط%[tԏH:A:">;SgG*;鿯j!kP ~ԺHrgGXT_:3s <:]o?| JT(-c) 2mq$B>Pe2NݿzKQ["/6 BnjopEeRdRZl9n} j?Ԡ,+fB#ITō@q?rلEg;ptfU,\y6? BRk ֥TvSan/9*/ H&Z;;.$Ӎ5K~'lH;:s LIN/_)t6{8v*/ +HTe*'T `1vČ,'BۤCg.SO^ LX֋ݪ[U>Iѩ-w%MHݢNׁdv[i;[ %Il,[&'֩z$^˟~{}^An~vc +$guz`('>IE awR-?@^Q~ +Μw6{J QJ-M"*y@+x{h=I +3mb-Hedzp.$hJugj8]~޹n0%@nNLɷ@ǔk:W%]Ѻk8O; l_D1EV$57ۋ^ԒØV&@LЄ|P@*Fu X$ȃ]z!Wz<$ U@yjf}H4_jh< 8 JmVE*q,"'"8 -GrH5%-熡P3x9BR2Y$hsc'ÍX!y]W%:p `= ^6xȞBqHxΎ'hH!UE$X-T'yNU&70L5 l0R/zڕR|T J PJ+j +d$6/") 8םWcͭ`eys5GYt1y\fx[MddĠb jt @-'ٲhAPwd2.nC=*D#p=}P+s6#s](h#:YGRa.lh0^.yuVٚFr,trNcQ [}H5-VB`jvPwH r~e7ril tpi)rT* E]/ú,BZgJJ]1ȱSkm|z* ,eIX8oeҸfV^5 URV +V&;r`qLvlt{mˁc%aG+ CVe˽J80j(vq d0Z?WX7|yB٪øڣ+NE Ui9s ^,U)T~Uuf cˀ*Vt[ޫn̈́wH,ԇG#9L[`Xg}u-gLRju:i0XKz.7(e1 @UôϚ3Tw$ݯ'bR^zGcKz$Ʊj0jd3'<|9S2?#.H(3!2`qjsL&RrU|b|{>"6-V=ڔ@i3AO ՞n= :myЇ~a] ˢnb +`%@p^yߋ $ѪPN:w&x[ +WO@wtmiCv(iO?|zKxkѝ4 1~{"%a7(łK*ņ6ӻ!1J]xgcҦ·ְyC/vUf!'PTҦF=ƸNWc@'X#ڪ948oC P}4(6f?v!4{@?Fy@Ny$vB[ڠg95OsDU]L@{_Uݫ{T iL|hN`MҔcoЮk9á +4c6і,) Fq+@ݐ+R  K7˻#i4m0lЂȏi:q~_=}NE[,ZRt3zJ;H*TOog„Injs;G}O̦~~r --/ +Hbz.!:-tl0S_ޞ+'hר^6x^7 HoAWdu+=:5:a; Ʉg mRMs\itEuhL@Ԁ k_?ZbD;bN,UCIB8K]l"94Gzg/-&dP_pisi g4gf phޡ.*SQ%q,tӗAos)o mr+v-Gk+A<,u0TyCamhr$G$/,Y׽*GDSr0 XͲ ϩlu|.B&.,H,t*$mnl?S^W va&S*m%=鲝~ZECJ[i#5b!x?D`Dgk;d{g]q xeokҹDҥ,/ Q)ItP4] 9 /ރ(ԝH_䴺4UUO1;]FTiZLYo*.z8KCL/{ǹxkGթl:<]>D6$ Ĉu + ߢL8ż` S٥720oU|ew:.U -H(bּvtNϫY +ήOHe:R3EDh{AJ˜Ar5͉_ 7Q!) vH控 +\UcU؟=Yԟx$m㕕x ŤSR+(L\ukrr=ʾ*;3  . •I\@s;x[(${<7X2zSS@oq1'^MBi{Z^ H0bJigEh󲀴cf/o$zJ/I^ ҺCAҺqUԠb/P<ʖѲJdtݙ9(l-/~a8 +7 +y>41T O7yEz$Ur6[@{9ٙ() =tXr.Up|ؑMKG焤I^_A gI.@>V'mγBOh~q}s7j2$֧2HΆ06i@vN?n+S)2b!oVf \x}?4@":#mqQu,i%tyFR2 U4;'ݦB#tƼg: ;h} 5kL HpUBMw'hMSgG=Hl7KX&pnvPH1V ++%7=@r; DыbYj+X +]΋;n֭<ӦID-㗁+$eR-dܥHSkJfCiL\pʴ%F$D(xSq +YZǘ>V9?'h$d>*s~uߛ蛰w@DrzNZH !֤!ZӘf܉I'6+!& b-ЍAT3-RO{ᔊk m`B.s% +ESxG.V֠lNqa{SJO+%}lIXʠ ۝u W%Pw' Gv pZEeҴ2)ۏ7E< Qr%V6?xfOj#֫O񃤾ï>w=X6/@Y.QC׭(9$uܥDb3l}t)cs!ٌ/KIߩJ()TTL;9{Rc@]ZE JJn7:C)rX(bx_}>nHb ec$|AJځrXGNt{3L <ؠ 0:c$JG+x -vT8?o+#ղqÍM ң &gDnd*;LgIslH}\3%Ζ8µXT\ڷcpa m(O@'Z5>p:1rj@фcR.oex]Äk;7}XI:Y=B!⋨YT`P8hM}tIcE`QT? [:"4 I2Nm);y:xCxQn$ќMwDU"Hv콏N"_~M'32FJCysH9{BR2HtFtV2zv{@&#\(s DE^މ"d(]xA#.q'v+`·ъqTYas+)*YLx+Qti䘦)?TBAyC_WKJ3iuaX894aV(E)VyUK2=T/8X<P鼋 +Dc'}OKLj [">C, jUI'l#Dtx1n $DXO*;^t=*â Pۖˠ' }'}uSb~@ )6[oZt[BcW֦gPGNMqTVVdxIlqt04A2U4iS* i||U=J5O5iiۍЖJ@BGZDQptI[3Z:h/eتH_9~Wi|U2}8rЀ](DiդAm6VC + |p@'z#n$M<}Xg0ċ]dYQ" +Swn?Zbttuf3xxu.Z1 ,5KA˻8 oUF iBO 1mϬn,`e$"YJ;us컥*%kɲҸH`Qxx6'}AW|W33"6o _ +*-=ozrr%آ (֊[_k؝RG޼JW9Ef+ś1HlC|@Y$M&b麒5GQoSkߑ\語L2ħS|f-Y>_Fb@]]M܈Cڮ(\ӂWTZY8v:/d+U/(g@vu3yqsԓR܎Ipaf=uřNf8)oR7F"r>ja0V*ג-pa&t EnХpeVX'?\' +H(d~_!yt:WEMj96`jݑPҀ}"z#QI;oY>W R{;p-9摁@龢ƀ;5l?nb2ɝq z{<I`:$\ПyMX]?r΃= +n1&?<{'ok, +0Fv_^yͿSk1+@j7e.˗KIZw/_ѕ6&}/|KڬH={ue$# ੇ NKE +8EpV&>7oQuyRtԨm^<[ݣN)L]:IQU_WwAQCp >۟^QmtC~PYDSzg^)4㠂Sr[?}j3Ó*n:ǿ|59rcv&=JWHF㖨`]I<Xt64 ++٪V/:5@}G}mǓ.`ۏtD 1\- Hx*"ۖ/٢x`c@Oa%#4ɤ1ʹ-};ȽtYU?-S@Ie;庮@@墂]˜y^F1Dn}a@*(!U$a4pťը_Zm0A=~~{jKYe4C?҂yۆI`mk(j ajl]3}0ѷl# oEtP.F A-twá^[6@r4Ԟ]E'_Xvl:5 +thΠHX<]՛;r Gk˾\[TE%Heg$Uצ[¢?LrR$G욬 oxc'L~qH'Y)&)/t8 +ȴ%]Ӕi<@BȊvY`]hr&IeOeW§HA1:ϫ&&m=lb O dqp^4%6й,@:^Ex`KⲚXIv~~ fw:P fa,zO'icm,sj*xSN#!S]iNSeega]oE9.! GӚ2~џz&7at7\.EDr@JԐ}^k*8HӨjw6)$,}M# Lq91= E.r@%91* ^/p2X(Uq] +|ԩR$|e`˩ >"Q`oH!K: <1'*6RYrE#9NpVۛ4h}ֈOrj)+ F=g7tc8TYJk"E&::YҺ5~tI3*Fsoud Ka8*Vmyl:Tijϫzӷ/h +ѴSEoJSG_gwmYR7& NDT%JH)b0+ؒRd +sJVEUMSAzgr?CВ-"Q>yŎY˶tPu 꽢JW + SpXiAÐRR=h2M" DjR2cV r#l)R"o0WA=,ߠ"9re9-?FSt@ Z]ȹ5%9UyUvۛ[PnH8%RN1>(<1CgJfl$DuXsJW91@RrW~IYaɳcQf-r:y {jv20"8sR;bJ.8<=鱤? +R݈+Uh@:ZݗFW|$&)M,):?>{Ikl㧴UV mԠ,eju}ՙ1G%mHSW +IբP$ehE v$EK3EnCVz,ϗuEu_8iI"pFޮS-nUlT̻X(T[RvUy_+]<-UTS'%U:DŽEiT@@JtQIpxɁG>EMΒަ܃Im6@ uk~ƫްV-ŵd @LeOL΀S4z^wn=piotР/Ty|W& QcMJ@eJ \Kqc, $օT׃I)<L.,J%^2 H;K~tiaj,zdT)29lY-M'$֔@j_nboCT)[THj T7b ʀL \r3Gz;B_v ~GPZAzj"=whX"&m}Q-k2`"j֣ +z4< AM7(+)PRW~It@N|#͒2M 1ݳH`JtWanrt@]r@Uy]lp4b%$mNbZV>o..P;u_-6> UGMYzl_ dh$0 bofT۔e5&+ +5*M^C_!)6*S74a:.\?&X1`وѢL<9P  ϛV|] d,F +?YZ]RsTHp7voJ;0 mk{2lz꽍.wjţ]_lJR.P@+*L+fjP(_O|-/i>U)UĮH:czȚjbWP1LOdz exS1?`YU|p,ӥ*?\䘐N̩hY.tlE:{=`B DHU(|#1a{!K֔fs-m&rSe^ceԖ^ҸwZn478MLbH4xiSc[j]qi ZHe-}Em&zfH>} E|ٖoQBdv41}O/=݆FY +[DŽ.k T jډUgڇzn}~ H#ѦM(mYLyg1:,i,zFicfE:/<1wUıFƌqV:=I"8Em qpV$鞰)qئM>,m_U+҄` ê5G$y>64USP8 B61\KJc^wrax9Ӷ6N2L94.D c0U@릌!XSfF@`iD ^$=L`Ġ訖2hG_hU +R[i)w94vR\T.e4-\Q\4ᡪcK:LɯެƆyꄟ`Ʋ ^.yٌ$N是oO%aqC2^#:lb c`S*_nI +.̺¥O[_t.9pyp#K*oJt"ZKb%%YP͋,€lAśLі p MebRսׁt){R-hyM8wl#l9̥VIhdfgNp~?=(ΊSy=wj0\r<I*YelŞҴ) Z8mi= xTI([5lz9}Q+YLRڪ4A.I4_>yb,mTYz9ɺ1YBK8ך +i}@"e)n@n;'_ MvI|uw*pР[ֱ e ٨ErLtsouTğR5rT n,u1rP@6me7xQ^{E|ISS6M v#91'DZ`8 i0"PhHhGژwANy5Qi"/n~̖}C(|Z2{l7Ɨ>a|fF`nAi@nm {$Lfo@FB 0H`xoH?/T?dęƎ*g{͗i 3ƨ/uKu +~/?8z +endstream +endobj +27 0 obj +<>/XObject<>>> +endobj +30 0 obj +<>stream +xxT?|fֽɦMBB !!"Y H@E =T 4 ]B("P, "*@E,3wwC<,{ޙ9sΙ3s.@1x` h u]4б31#t@aC.eօ0?58×Ն̻H Ft3L`Qx,͐u|OD:"ܓ1ѝDZ^^1ǠyG^-Pj R+XА:ˤͰWa`L[4 0%{ª8EH^33mh _X.H[!csQK1)tD W 30"5VHpi{܈0|LO +wW&""U+2fTB[ +HG""]i :A~Ɓt 0N] e*XnA#̛,-q""nC8Xސ\A*|kll놗O7 ۺ5wGyG8^4,{8v.{c׋HDyyG>a 1Ql2eӐ (fȬ{ t:Ͻx;VA4'.ؗ{s2㥆|4:'r'\ּly);3ׇe'ExY?/|fuC+5 #3ˋr: ^{HЦ6hÞAMd5i8,[HA7\vJt9|8 ?OKqi#&EArLB yrTo'g-h3WӺy|$#^E|D-%,WFb'X%[1Nh( B;=ů [$i-@ mE ~c+}2WY+)#PNxpكۈ_QڣLgc}@Wr<"Jr:|+eej-h߽z?q3it31%ǣ1>^>a޺.7H_(`soq?^f.zZӻAb*سW {38uGmP1y8{නseDZvK@HHXi iǴɨc۞neEvBo`)>ֱv0帙0 QhCuÈO`FMI4S<'؂5t0 EDc?E P x\ǿ }K~t ƗC!υGv} +&a(5T?}= @ uk6зrFBH4UW/*Q9}žǿ1N~_/9D҅~ -XGxl!_[UBq>#ԇ71\,bm;6bjr޼]zEqA[> C>v4'A 6W).F>j ԧ%Wࣳ4? +gm +i~C[!E΀MDD`<^~z ӟ3+ +pWN<ӝ0"rP.BS!#*ǕcДCzk\Zl%`ƥPVþ:sI^֨o\w9.ܯ!CK +|mV㝗s +'-xiH#muVNڒ+SI7qQđ""sdya@ڒI@`A_1<OS!z0L㩫x]Blw׿1?!p=ҷ.WL`|Ưa|" K!@ce>? ~)1h彆wD+Tn>}>ROWE=2)܏, Cb^}grߙHgџ|o˳nTFX:A'|{W80~._\i ƣ]Ӽ/6kv]#kj*ҽhA[kmܻ{6٩x@A~wJ~7^ɯ,{^&QI[𽅰Ce=.7OyԲ"^G!pҟŴ]HQA +w#pt"yHא|[/ +%F,r$ϕ<3HB4A#v F{!/(|+N *ab}18PC < {{g|z4(8[m?*g_aLx2PAlHvs>#`o\Uv`gB#~3<4!zϒ_:`51*#uϩzf?wgVi3Vj%Z)ӌM*iEJJ0|M?~^~se__c*뭧µg}Dy~;=\xSn g9~6MQGE]A3FIدXo3v̺ + jzE:~`cpo}o@<5x ܣxPCVJj(n8$SC=OϟG8{w2?Nfs-y@9ރ?oˇ]~׏*)S8i$xƙHeʒǟB;!} Jw_n ?eïhECrnbZJOpw>ӧe77˗pVs czޥz=VaNOwCуk`1eJ/a% /@Tk u/߽|v==y"fTq2^Unsqw xi쯻qO?5G?ob_3X;7{ޗg瑺aAta+7W0t^Q߻a/D;~ƻ?gӃ:qBrv?fˑwģ^0΄D6c0Xu;('by0!R"7xNuܐ c˚ŝCyzw~y22b)2 VRbOl#?@pN-8'<GD ?N+}N6.>bP.Bx^3ױe wO'g^HYqt Xw ޶=2i~ 3P[!x~>>(~O*D8r!t6ri~zCvkuvKu~^ M.-һnDNns5´Ǧ4Xs Y ~ܞWQ,mnDc/n!g5|?mO4l!?İ}ɗ ̃%o =ux %ƚ|jw{]ƻWJ>=?{nΑ>/szs3ק7u;Lv0@g#~$ޔ@Ґw6)ZrJ9r(@ލ:岁-yvw=#3?o;ᏼHqnncwu0nI9wa16rbr 9w]y$nmrG}k\λ!#w9!B6̽CDisiq՝Sw_Õy~ +O7yQ8sί +:V7Mئ+(ׂ\{r|Mf^Ik|,:_o؏#0Ə'Ǘ~̺Xp) #.B> =Ex]JgܵxD#2J٨ߚSx356eu +i9})"OAU9Ȕ[2L:4ݒ'u@+Ka/L_zf"/&V(@΀& \6/3܂އ# `XpQ8'J;ܧ~ '#x | +)?5#`80 +0X`"LI|dx` +`L|WGK%D;p,'+J"HD& +dy&kZD4b&p~#WkdH6d JvRHv"~Ӥ'nAd%VG"|MH O L7[ 9D& +ۡp.9L"H$"69p !v $%c8|HJ K8ONr| +HuR$2|KNK|iPZ$-HHJIKKe rBZ I/JiNZ/,"*&mF#&iE*m^KH)F  X+K7!m]tD:*/KHJ% pW(\.HD*2QEQeQU$j')tFL\BR:+K%tEN5tMQ*339|IjU9P9T#H9Jv!G1ZivIF}]ѾӾ7jm;2ˌ\ P9V&ru\S%'qZ"Ly<[#ϕ|yP^$/K \ ryڰі$kuzep>W FyY"oɯBy\$wɻP-L "H-Jiv͡Ek1ZVMZ Y90Yid*-VJkaFiS+J'EtS+=J/d+}J?2@j5ZZV[KhIZvUju-UY,R+Kgg略2eBYRXE`#7M9G~&[6N r%eEjPJH%*SDFB}/R?Oh Ch0I"40N#h$6jGmz 1.I$Vq4V5hMZ&hYv]~R4֡I4֥)4֣iPy_9F''J|:>MgЙtrΦsrRHXD9|V()+_(_*gsWyrQZ|\VU()+WkʏJr]T~R~4W~Qn)*ߔߕ??\:O~/(eK `1DUPJP1LeʪIT3zZb$6ѮZTW1ZcU?_ P 5X QC05\P#(զUƨISj ZKMPk85Q&j]5EMUjC6j5]}HmfN\mf-V/jkE(bhVmW;NjgUvW{=^jo5bX|-V5[>Uj:PVs!Pu:\PGu:Nԉ$. }>GK2W]NWЕEDW5cm7wAۨm6k[b'Nolyl![̞cK +^emg;nfcd }~`D[WzFibcm]4qwKw]ZF]Tg1DX[l"ME'n.f6b;M%av8H*NjXuq8Ug4W,%2VXZ\+"n.qO/=Ic(?ϊoX];xCEM##ѯ)]¤(9ˏIR T[#%RTOj{h.e2Ej)ZKmR;A(u:K]R7C)zKYRsvh;a&1?R_)GʕIõfj&l71xs s-sms94gۘ;{}9\0(%F"r|M. 7&jb&$$lRLdLfc5YM~&S)|C. ߄߅??; vJT;>>׾UzM{v@-#`7wɷva< o wp_U # "(z,ug=L.JӈFICi=$L.Y5? IG|KXʟ%4#3Yy MDYlaXb-,qxKuK KMK[K;K{KK-K%RǒdIԵtttXR-,-,-] D1zD۫k7!mzO!-'I~BOH72^ߡ?]!dv`,%|+A,vsābG{jB8A:1F+cY VBxR">z1cj|Ԗi,Fy%:,%,z(_(?uz+ʽ?o&@)bUď(P[\/.D !qMt!Xg /|lѳG3gFӇқ4Nk԰~ԔIuk'ԪYz|\ؘhg5Ȓ(0JvV9B!>MD +$:0e +9F1%XrhNwIgyIbuCzbmGXGaIf隅ᅙَR#/1 GGcGaBhYjҰ9xEl!ڰäaPPaH$)14e v0<6eaXl&A!k90K׬ى I +!yoQZJ- +ep>QPb+ I0Uf6ɗCE-T̍`-C;x`pm׬4UNA+lz2}wFgegYؤ=!-yJGR10<y}rޣض(IV, ia1&X0gdx"ژb5Q+rbK?e'E +<\0.LH(UԈO=Ǝ: v`v$dt4NYE3)!Cޜ<'ߛS^='%yqTėָKw~r,}bFyPa@,A=!\ʾy$\(?bYA4RU5m+7y-ܫfaM=s }>P xhQ=Q3_~GvDYւ@s'yKgbVh + +Z:Z ,:{;-sSQjA6jiJAX2'۽O^+cn"ieuq7R)O<hOpE#:\H0⃋ i7bNz( 4i#*z;C`5"E QbF5;YNf́m&W^ #"ln4D>b; #W@AA\9,E9fY 1 xMBtF @,FAHF921 qqqgS!E sĨ#:ψif[wbu빓4w?.%S%P` Ǝ+Z$O rbDuz[Rw-㗲Y;z #"Jcыx@ADD@HW]DX~I A L«ɸpsxҳ8x_bK%vTQôF !y!pJ1菚(Q8(QY 4TSW^B҇ۋ7; ͒PؓOOAEH:3XX(DՊpg DtA("l,onoQA !=b{=Ԇ8=RdC3 XZ&aHY߮7wv&!2=Hcrxp\,Y?5Xs/^8SgEb_g.O!~5 C;Cg%s ᥘ~Zu{#/} r1c x^,U 9ҙP=?@$ɟJtߟ'Ho#N4BViPo#y$?Ǒj$A:itQT4f\>/FFGM8ד݈9#]8iZx)cbwqޅ ']w& |8/6xMBd  !n $;7xXӝyDhg5Қ`mG_lm!{˞,fʏ5 +'b..#^L7 "/M@#iO6<#^"NA$݂4(V-mG|x=?"/,>r3G@1eǒL9_LsEF6o;n+S9c*}d1ĝ?cN_{>6xAvgs=#=]>Ǟ]HpkagkFڌlXL9k,@NkѲ]#@_*>Y1)")BP8P2~?r' a+W!hPh=m߽9i_xh0(=[cBоGF e[aÄrv(S \\{d'͊@߬֘0;B'ef7Kk75_}egn.L=*}s|㰗LnK~$;k/kJ~nٍI/8OX%' 3/.].cj`9U8\ȫ2sGjFeB2qqF|8n965DFb[QCQ$Ez+)2<%Ft\\2 ߐ dg}+'DNIB 9;g{vc9t!c3;[<+Yb3:ų|ړ:It>ѓed0abDm9C L9u ׿ҫh=pr̽ ` +<spY)~DL ¶Jlo + ?4NaY`h]` ,$.3!tGa,׳E+*eeA8 O~]\?Xc) Yu78|,@G?APB)eP?" 'iW益@08uÛ%17W-g l+9&"jB持(|DbthSD8Y.nWot*Ď|ysރI8I"I/ZxPźɅx(F{d/ [;R3/K6H$5FqxS2OݗjwkkȵKpq W:~ ~F|/CyNjrfAƑǑ3JgB#>סis?:g.zd1_j֬&'2V>d_K6]0 v!FaZNN+~ ~+lX rO^,?Ur oT|\dYKT! 0'P@.HQRF2>EvjRڄtB<]Co&#iOO +6#IޅRqLX>/" `"!n`]P +YVly +vӖ;Nd3څ$tt;5d I?REJwjEMQDB +;ޤab $J&IVI:(aOlO',0 ℋhݦ!4*}ѦAއv)(9P.zXh'ъ]RZ >_#,$=O;noa1l$\OXJ~AlEODZ@GB*~^HSq?AwQk]a-a Չ[8 Uߠۉ 飠3We 8Dž0v'!ȇ'rk"ڟyN|r?_>N'iAȌ)`:VǑ$/H `_02$I"R6Ri49u|}pbM7~ؘ5hϯ)A"i0DCxҠAz1RP`p!) XI'9r냛|iA5"'O6$.ĖZK:<;t]mY1ƍnZo39I<װATIO KOts`M ew>.XM帯!Ns ZJU{`Z])oZiO \e&c>[=}_ޯπXW=?!AVZ6u+ꓧ+-{Nٗ]?쥓 0N#)DjɒFh(MH[dYD?i1kbD $%#Jd" +Nz6vtUr^/=-)?$ /apA˅$WG9uY&<Ug<޸sF&L-jTswj/Sns빸N!P*4mkã*Ca>C$fΔ0s>Fu^nIXݪ]?//:(ڏ8x3YWJFףfy2JvnAtqN)1t0Qɍ;`-JZmW[n]bh%Zj-3nr*v @{JNIC-,7?cf>vcH:b@űX Lr?HX<R?:Iw\g%x8g(Mwwq;k1m swj_IIS7w4 %AEiX?tekvF$ }{Mظs29z9b~O-XBBI%dWV㟁|'PHn@ 3+ff3^< PJR#!NNF#pilWV~{%9¬Eԡ_`?W$Hs\m1QP2CP= 1R 42,' 4I;GZ./ hg}˻:c%T+K~ygLu!%Fq n~4`+B?crgAzƄ"a|sbOYtw"z9,#dUc\(^ ddp=\6c$IZJjv &O6b|l(2FzdIZB.J~~FSZ1d m\DCx"}0f=N358V?JvIk $f.A?5t~E@{ywޚў!|1wqy֌Ɯ MAi|T9)5g{4L0F 7Hkfo¯ Uqm&"I###ÕpJx$ج_1 G;| 5BN!t:8J9~3:NG,v+yNzFiY~e<--x5#ggE7:CJ iH+ol\ӫހ?>u͆wm,}𡩇:U'-kWK"$liaNH \T!5cM_ddl5#ŚX94  Cȋ'qS?H)_4>5DKeEhoR<:"07xٖyZLr->L]§L~B2}Üձ"v71A\r^a [)<'~Ibh1iTv\gjgwx 1fJ[ep:=8d\6f'7,zO̯k}i?!_+=b]W_ȡO/q}m]1)Wǟ̙G)E\^N jB;gW7yYbhҘ fTLdL`f S~Pp iA"p$ӡoegZB{a2׍TL:-3&]_^K8iz@Ay \>d7/+VZoNKK39uT___d[V\|RXLb-q23]4sL$4f㶴>IK c~.+I_zȑ]dlv֡R/-h5ܚD"}LHn*4_AEZ|ȡ^04%\PfpŨo^_>e51PԀPZLM}hj5p7' ׂ* qED! 1<Ui=Lp?>#H tr\ec21r2;i, gax(ȐyFuG#g^vPg95O$=gg9aw\՘HYQKq7uIm9Isg 2-D y!bZmgICM,-D3,3c\}&G2\34d*6 #Z^z<챏f~Ҽ}UְN_YBw^?78'SI{2lz{;w9xۑc>-DTTe\ )T%1YX Uk~eHƐi\%GW(a(! 2 :FF{֩m6M5sa㻀=."ӹz'02}CwϼXjAf^<ȸc!Av oEU5<;7HގH\6v&^ia3'fy Ü#7>ocIt A m_1,)xL&(扖!,f+ӵٖ! AM)tsp$qc0-؍uHNTZLqZ|_V_[LٓW[g/T rѠ%u˷41z瘱=q0.;;*S+hKE!#ƎrՑ,t g9lּmvI==m|//BڇЁC&=͜1`wK:޽,IZ=q 1|%0S(3gL հ>'b+*_ib͹r8_aDR lsr+{; +v:k!mUj*bCz;;c; +Hl Vo +?~5#ۂY㚹Xha3/Ir$❰#iEY]R]L˒ӏ-I8ZTZq]7MizչE +(L~Ɩ9xOOQ|n 2S]GK#K_^xѦ)O#ݭ0^#b];z/9j\-'ЏAU* ,H_)q~n)?0E-))a%%w7ཌྷS,>0˙О^nj"24Ĵt$k&)K#h[L+VLnL%9]05IB@z~2z{eeVIFƏvs( {? DY8FAi =I)=(BJe D.6n?n#>뿱ō|?. M}|X@?gO>Wi"щZ3AE`,]p!q[^釫\zRK +/ſp硄&w3rWg鮁;II{!q!ydϻ< Ajm,$Ƣ S{GU{^2I22I4`EP]ê`AA]`YŶȲvvv7(,+e&sν̽g{y^?7t~ox߫CN!@h!qn)| 0FArv֟3cڥڵuhGm'?uJ;0^ÌfԂR:A{4iX'8r< ߇DkLJW©l܏oL +D1hNaaN*]DY愗D{M2W`yU_$+VUUYIEbh܊c1)Nf|Ajbsv5t]L)Q ES0]puQ,N%4\x;d9Dlz`Ɛ'q5A$NgjLlfoR/RĆaj;Kf_v˚m X1h䨡u39S/ouvGK.|6Oogz^4oW|GF}nWPR]E?UdU\YS'y'&.g]ka=L?=4†3,R! +OE)D<1H#Tipq Bӝ%hl%%gQ5Q] ,)-)Cg`| +&ZX91;GlT~vmV>W5pşg=翿7%왊(ZGcws:M#SehK$D%J+H +5@z?H/SsS$׿9W/p+0Å h=~Ё4t +KfBNW )4}&\|y`_cMe1ܽf7~`;|E]߳|0oUxǑde>DZ1Ayf@JbLSGa#R\RXe ;h fGJOsL_7;^7?W_\T"s HiI ø aX/ۖ ?}i^W[l? 'Mq_FKc#ވ( +`eeT +$91F@[=K/e畉AgAn%/ ?,i[vq0|<$J ᄏ1i=:zi%BY@yDư jfh>@4_ ,uN[B___/w':N.R-tgɑ@< yD IG):>߹3DZ;rOLJ­_E M  X[A9>sEs.M:碘s*ըkٍ,UdS(q>0Zqtq-EZG!  #8aK/{)[ڐ9mi]ܔȘkWwbkbb =ceRUDo2fe&bJR|gr̕@Wlٸ=ggEKmaR?we(k{'lӣCA9t('`9ulE3G̭/^ 7\wΒ u=K,Ǟ)]Ґr( &+h~ RBXJXfngeẊ oV2* _݊ "rj/3B731:( g%/ˢg8dsDJh(#/6z?g7~aG +܏qdoi9yJmfKCn=V,045ؐ+v$`4 Ml"=vlU<S[a;uu"nI w3b7?fa%hܪC?J"_n?aP07y[5}^k/i +;AyN1s_tSWr=

hC +vHQZ~͚oOdYސ4>誻nA=Q!@ +APE}9?ic~ +?>;''03 +Ibl7[r%@y[4- "/0t؂e{L$daBٸ 8yHnYY@41jTcYܮ1{)t6M,#Y23U GSlT9hC3=iHbw{58M|ԉK3E~~d5fjp=b4W4<̍hNau&`ߧ4*Bm kx@$0ry&]{]`ƋlsglOaE“#wF(FVL}) < |j zxiIn+Ez +!Kt_q=.{ *1) veAS3`;`s&(3 Gwmow~@7n +R[Y{o~OŔ3.r|TܾԺ |P2{K*O 6SF)5jz5{0$u p i2YRL_gR##CJM}SS&OO.K]+zW穐>$ݶD20AomdH+h"=a'[4bNyx&<,f&a<↝ij *XH!$K&+*J ` eooe]Zer4tĔސ*gjq׏>7l W<_A˧Oh6*sN0O;^m}wd2[to'O;)JPնT'Ɇ_ +Dn,Y`^w.-"+# {#Mw#3@2H ZOQ1"e$43BX^^ 0ns.៿|Jv3 LifGȸg/9we OZڥs]q׊ickkU ޶|ٞ%K;Ⱥmp +;ˈpָz"o A[&Ape? _ BdA( ^+Ndve2HքZ1# w0>>"%0~L~d71Ha{P +vN`&=694\Pw%.e6q8?_o~@ᚎ8 +"CqHGJ=PI~J$v)$NʂZӵ>E*?hp;/' cOnyu%;In%"=7G3=@,:bEbny3 Ɗe5,*TSf( kN"Ǖq +d,@7E +rW67UXiIB$Y/~꛸YLVd MX+*+2A+f~]vYynglpVA6 wq ;y[(n-OGfF +餺;C%@CxV?_DGm<>yض٩J*eVZ`hf0s5,8lN&uw ZCi_[˞]^L]^-e*tև +K@<67Y ?F3, 9 (QT5]W 2%T0ϊe=Շ\N^ +1_-Ec> 5-Saz ôDEX4_[b頡(SвL@8K8=lg(pht.¡\p̐Y~c l)ѽOp.thUh>d&, f9DNQ RhVfAQ,"8S JkW$[Wxo!^m~/s-rb㳆xzBGH#<DlЩ 4;qCξD{.G^wݒ`ɭ{,U"q%eaUn8& iIłzJSSfqsM͹].c#HR(QW!c$Fu oEgϴ_Eac<e)[zlzh#Oq1Rir㩐-OwFA\ Fim2=MfP7I^mXBɚKL`r[(Kx"ϲ l+J'ȄOBoht //ë1w iNh\-De<[MsEN£I8=a13+5k}w;?$?߱O;=< S 2Ѩz-KBJoxEx Kܛ%$7?nITy~h'}j 9idp,8I/D#Sb Hך О_'rқp } G]LCD"DL d p A|9 T +VP=eZgdj[!@+rtK~rLCCRЌsYP!3s}2gRTcWXRUjUUFk4Vʪ٪ꜪnWWV>$(lhz*lB{*B8bث5aYC=0tuU]T`WOZҳ9*-z,m6i1jE +aeFkhn]mԾhMq|[xp|XDkx״(nF!R. rGc2Q3㟕1Rp<λ(è{^ϕ*+xep8?1ژb3~}?CYbu2>2|ogo $%5er{8X5sdF7$XIi7#@\Aפ $BHPהK8}t!VD UVR@ _}]u&$߇ |hנD7]܍ [2~ާ!xuѦ{oq(y%d̹TM>w˘c.KJW95z(}:|3/*F3=JD+E2f?XE/c!,\DkgG-=MyY!Nѳ s+ş(> C+_]5z۬y8v6iѿb4H/20d[!Ɍ("r{]qr1 b56\I;X փM0`A3 h LaTIRp;0V?i$h$bN0U,cJ;uܛIԭ[S $́bgP%7+7_w̃u^o-ݑךk^>W'ޱFv\AWa0u-B222|{ϓ$7pyBve +(9'03!03#|~X}x2jH se"M}J&n)_Y ZEBF1H t[X#Je=FѭiO%Կ29] xl2;ɜɜo!> 'bY8ʼn[Ba̮˜wLo(8D,MR/Sp_#|&:H7)ĒřGz00msf"40ia1¬jrL°&qabHl6*{yOXc䈜c)i#j'ڇm}(כHٖ.)>z,0v& N54k׍,M3ٚ?lo6\{c+}v|(}?}wQHМMTԇ,'ʳyBq,ZBdq(J^Oޣa=>+:ޚ:?z |q**Qx4hP~8?F7iT_k7a0S;೘b Ҭqwq}=9S-;wUuTqZ2UYXbQeUu()dH|&21c hklԮ\k&"9^>AU ٶ}M{-\WMg {T3w\[yO!)AS؆,PWz&/dQ~> +aB 1!<"A=*L{= Q:/v{l&d(H(HHH:Z\!IVfq.K0PծOwi.}K "U:Lf`JPGDdQ:(1ear" B2D+BiZ,|m}]^@b K5e:OM p{nW7t4t%OFqv~<-OО!ˬZNzϓx9(TT-եyw<;"_.VYzfykW+CC*/H\P9Y9~_nnnzxI8Տ6ڋx=FuiHITd 3m 9XMZ@X So߅S]FH=TIU}O֙bY=V/!d)s٦KXoG?p@,>"iĀ,w! e{(8g5|gӝ\ԬϷ=uu^ S.ڰŃ~\]W^*qބ Ώ#UKyd!!`*fGY+KJRkuS~c6IT G/;&IY! FCAyX8ɅqJK +cv+(NغS:,54r>sU ;}ټqw6!dU"تk'u}eēj"<۾P{0V\+7>SbHl׹ݢT,"g -r X8>R:f=d3\'sgg p"3n 7F¿$SX_d0Ix 1OGo1]Gw4MErk{{;ݞ='|Lħ8'xHlQC6fjٕ,XgȰ +2 +c2{(s|" TVr#;% '!-<zs5b[2t+<Xn\R[)M0`H j|r(^kAV//X0F0OǮ}Hq3]/hËV$nHQ ɌNTh$a6+%hqqAqo1{-\ KaXkHS+eҧ8)r)>)dAb:VmaZ)|x=s5:gC7wLY4q(' $yaN<K d"tDqNZdI +&Hfj,П>qI LYDw" RԿ$=dIAQo>=@CsL!E.4(7P 8N[2PTԄis­Cj[)w]ܒ ![ӣyfAUS ~k^o9`-Ao8oN=YVg~FvWܥ4L7C׿mg" 4 DzܯsvvInt]cpEl2HKv<&"}ȲYGNfSҾwڱ+Dtw$\EaN]Xx̗$ ᑹ8:K!åߏj~lպ$t G0 K`$.ti,I42I6> Hiɵ&0ⱑBtcJ + FĘI:i`rmDEz.B.sLu%#`^"9/>?kK`/]La ĥ>Y^,KvT;Ld COrduu0)^Oʫ`v]\MH}[q?6੹(_?t~>V42\tɔ/jpUW{'+D/~pai7=" x2qyW%US 撉%kKdr yabmBϏ9*K.w&P& yL3][^A(>)d4 om7M7a?\O .Ÿi[?5H ?XApW$#c9ShHd3[&좸x˾8Cj7|LꁍCp}n \yły7G2>ȔYTtz&u%"/XRqÅI\p7GF_bF󍬕\./5X >ci4e>=%W@M$2eD==y@`z% 7f)vՓF)K|G`(2JѰK*$Pkd~ r-?I lX@C +negthWiO<>{zvx {`݄!E(DWo'ogwwzi˪[޲j /@ V0 4w)F c47aqR)-PtvѢڸh Ӕ鑹^ds~Ǐ_wט;A?{;G T aVQjk5F:O]9vτLȌX[}+۠Q K/p2΁(&U$zQ8oAj)m}ަ31D{:"tH c;f"=?W' 'w _+>l5wCpiju~{7\-[OTr7 +|ߒUaS:mۗQA%$wFv7' Mt"ur{zܕ8$օKPGL^HBq^JXn%Kؗ!S#XOvyX)Nex +QJ#1/zJ#TIRTf"TQ,9+^?ٞboP|y~۵]Uƞ5 nIY2纹~MW4|Έ[<3J#VvuEqzϟ~~Ci#՞u&?} +.#۲m!@EM 1KHuӲnP%@ +!"_3N~/ϑE7"ZsnfqB&úC;iX8 +gI%[䚌.,H,ZRWɀtWR+DC#|^%oymtEuƙ3W~~չ{GWd~&~}KT9!=~Huخui(<~x2&&֟ ;&Jx)=&"=I. g'* 0k>Ûa&$ŁŽ~ CQ.- "ܙ&"1  iʑ5榌[^1Q14UWqd8.FP`:`U +'],O0p<|>1֐e / kn c͎u@I2]}@^gUbf$,U3#"7N$VtYPKQ@N$YG=ԾoG]*Ĕ0i[)l0WQW+U* +oon~Goޢ }J} t:"UHA/UPXʖDֶu,"®8&)$PD׈9G\,8 4؝ޝjz3$^E!L:Q$QHSQR"ض"l,jbڠDϘCl.ʺ%%{pE3sz>$uN99$$S o+YLL*we /XoX")*ԟeJƹ>>C2pˌ+ 횳(T+n6y.4d NG*$rR1d$Ɣ\tt&.p>)EQ? ā^PTJp9ͼˤ͸S-0&;bqΈ9bqY)!e(EY,^>*D"&*!Q|0X;ha|>iMϷ +YWsKv_ B6+ +\˭ RX)d&llI7y!Λfy/礪yUU/8oq9A7M%g!9+aֱt.y*ŠTZOR|J7Xo8ǚ`y&ڲ's= ML#l5?fl?綸\gڂÏUnXMq%_ޏlֽ-D=Ւ[Fm@*Bb¨M$PI޿;W-:Nݻ軑ڻq 5p~{> 3oL͸o2TE7{Nş;x6f?R "O<`C`T43ϼ/?S0to+r>)n=HH/4C>Er*HXzM%yQ^rJ e3 il'ɿτiSF=hWdƚ̴-"Pޔ5>?~f,TeA(Nr`$ r?ρqÉ$F ѓcHuxz]F' uމ0AaF7(%~1'`KH3hs6R[7h,Gr_! +qr^.f p sщlk'4DѮ2$E.(% D 9 (IdD;Sd'iCt9DhurG_|ژVaή=Wr#[YԯD~<D#aoF$Nt4[ylK˶wi%T |"N:Qz +$}D۪&$^ѯ^-r\ T뵇Lª X-kgjnzy-jk6es[kԜq(F?WYP; Փؠ늁d%B^'iI^DW0Lr%9TԈšQt4^`͖mW-hu렄KdOnau lnįC ^WEDk#]!kӡp8DZT;z/ibrsFmҐ "i2tv!#4d4e|Mo2.SD4t>ׄ\4<`X9`*wݤeeyzS{hيy'xvlT >+ lU%@ phΌHԨbi + +#ıtp@*3惙p0W, )P)Ō#cnyA$^E\/9ҰQ II{ NX6Okz;R,2FQa+֗5@i6Ckk,//iK)6R`,h B4FݵntID @qHpkj.Xkch6UAg<(t^,'˾ܢtHF3q%!n@/zKm=Jԝ _|rɔXk {]x;a:M;OIA5p,bi^%T%v'n7(y_tx6JMx zsB: >zOf.;Sl pҶ'/}%X0s萙3 ϒ_Ǘ9s(ztw1.2? Wix ]YQ^ƔTe(fA.+KRz*/Ob}_a?o׃ʾ@J$9Hܷ/[19-敋;1y`]7!)<ߔ\맏tU{37P3w:RhtWN:V-쥂7 ۪8HD$wG))T4j gTyaKZpZ86X <.{ք˟?cT#c55ß8gȌ殇m]^Փw*<(͜0 B:.wYUɗ̳p,,8@;,j>@/onBǂqRxSH 3 ?NFO{G ed< 6=`݈6ujWM]Wht혢WpxMo4h:{v]1ScH#.< G{ /zvkp-~t>>_?TCGr4&gT0l3HÙp&e`dngnLRhAeU$^9t5Dz*@_ +_;FTDsbfsx +V9U#H[ntFQ5f=}; $GC ꦑ:i5Щ ŵM`f'={jҍCWzgԒYt1K9YSgb`Ivhvݯq˖e獻0.VL ׄH-w<72h9kyPӅo$U ޜ$J^/E4'C52Xq(4,ׄK#+ %g]E +VFMaE`jiz^ݳaݻ12B WR}dwmYU1D zǖ(yL:f։1f @~۳9t9W4+T2M Gpɿy̿2B#? rθQ}hE?m q,t1g;w(A#KNC8:GuɐG_+Onȟ%hοvƩ{g +(d]IS +M3MT Rm&zwOS]}=}]hc~}はzF~y~'^8_S^z=Ptc} j*JJ5]5gIS&]@N[ABTMNoDd{JҢqCi[8`$Z +Z?4zH^m}-^5,]ʦqC&jFǰoCFp p?{=M&|_E"% wtE)s<6LCx|@&4IAUT BBCVNsfn1x &%m gZ.2Nw6՞ZqzZzB M8tFxZr<û +endstream +endobj +55 0 obj +71176 +endobj +56 0 obj +<> +endobj +57 0 obj +<> +endobj +xref +0 58 +0000000000 65535 f +0000000015 00000 n +0000003840 00000 n +0000003888 00000 n +0000003995 00000 n +0000004096 00000 n +0000004200 00000 n +0000004304 00000 n +0000004407 00000 n +0000004510 00000 n +0000004613 00000 n +0000004717 00000 n +0000100276 00000 n +0000113216 00000 n +0000208794 00000 n +0000221369 00000 n +0000285569 00000 n +0000293833 00000 n +0000357396 00000 n +0000365438 00000 n +0000461410 00000 n +0000473800 00000 n +0000538834 00000 n +0000547276 00000 n +0000629909 00000 n +0000640578 00000 n +0000736879 00000 n +0000750898 00000 n +0000004821 00000 n +0000005823 00000 n +0000750997 00000 n +0000006025 00000 n +0000064172 00000 n +0000099475 00000 n +0000113312 00000 n +0000146754 00000 n +0000208580 00000 n +0000221465 00000 n +0000252981 00000 n +0000285358 00000 n +0000293929 00000 n +0000324926 00000 n +0000357187 00000 n +0000365536 00000 n +0000397992 00000 n +0000461201 00000 n +0000473899 00000 n +0000503664 00000 n +0000538625 00000 n +0000547375 00000 n +0000581824 00000 n +0000629700 00000 n +0000640677 00000 n +0000691587 00000 n +0000736670 00000 n +0000787589 00000 n +0000787611 00000 n +0000787672 00000 n +trailer +<]/Root 56 0 R/Size 58>> +startxref +788104 +%%EOF diff --git a/datasets/Acyclic/dataset_bps.ds b/datasets/Acyclic/dataset_bps.ds new file mode 100644 index 0000000..45c55c4 --- /dev/null +++ b/datasets/Acyclic/dataset_bps.ds @@ -0,0 +1,183 @@ +dimethyl_ether.ct -23.70 +dimethyl_peroxide.ct 14.00 +dimethyl_sulfide.ct 37.30 +dimethyl_disulfide.ct 109.70 +ethyl_methyl_ether.ct 10.80 +ethyl_methyl_peroxide.ct 39.00 +dimethoxymethane.ct 42.00 +ethyl_methyl_sulfide.ct 66.60 +ethyl_methyl_disulfide.ct 135.00 +bis(methylthio)methane.ct 148.50 +methyl_propyl_ether.ct 40.00 +diethyl_ether.ct 34.60 +isopropyl_methyl_ether.ct 32.00 +diethyl_peroxide.ct 63.00 +isopropyl_methyl_peroxide.ct 53.50 +1,1-dimethoxyethane.ct 64.40 +1,2-dimethoxyethane.ct 84.70 +methyl_propyl_sulfide.ct 95.50 +diethyl_sulfide.ct 92.00 +isopropyl_methyl_sulfide.ct 84.40 +diethyl_disulfide.ct 154.00 +1,1-bis(methylthio)ethane.ct 156.00 +ethylthiomethylthiomethane.ct 166.00 +1,2-bis(methylthio)ethane.ct 183.00 +butyl_methyl_ether.ct 70.30 +ethyl_propyl_ether.ct 63.60 +ethyl_isopropyl_ether.ct 52.50 +isobutyl_methyl_ether.ct 59.00 +sec-butyl_methyl_ether.ct 59.50 +tert-butyl_methyl_ether.ct 55.20 +diethoxymethane.ct 88.00 +2,2-dimethoxypropane.ct 83.00 +1,3-dimethoxypropane.ct 104.50 +1-ethoxy-2-methoxyethane.ct 102.00 +1,2-dimethoxypropane.ct 92.00 +ethyl_isopropyl_sulfide.ct 107.40 +butyl_methyl_sulfide.ct 123.20 +isobutyl_methyl_sulfide.ct 112.50 +ethyl_propyl_sulfide.ct 118.50 +tert-butyl_methyl_sulfide.ct 101.50 +ethyl_propyl_disulfide.ct 173.70 +ethyl_isopropyl_disulfide.ct 165.50 +bis(ethylthio)methane.ct 181.00 +methyl_pentyl_ether.ct 99.50 +ethyl_butyl_ether.ct 92.30 +dipropyl_ether.ct 90.10 +isopropyl_propyl_ether.ct 80.20 +ethyl_isobutyl_ether.ct 82.00 +isopentyl_methyl_ether.ct 91.20 +methyl_2-methylbutyl_ether.ct 91.50 +ethyl_sec-butyl_ether.ct 81.20 +methyl_1-methylbutyl_ether.ct 93.00 +diisopropyl_ether.ct 69.00 +methyl_tert-pentyl_ether.ct 86.30 +1,2-dimethylpropyl_methyl_ether.ct 82.00 +1,1-diethoxyethane.ct 103.00 +1,1-dimethoxy-2-methylpropane.ct 103.50 +2-ethoxy-2-methoxypropane.ct 96.00 +1,1-dimethoxybutane.ct 112.00 +1-methoxy-1-propoxyethane.ct 104.00 +1,4-dimethoxybutane.ct 132.50 +1,2-diethoxyethane.ct 123.50 +1,3-dimethoxybutane.ct 120.30 +methyl_pentyl_sulfide.ct 145.00 +butyl_ethyl_sulfide.ct 144.20 +dipropyl_sulfide.ct 142.80 +isopropyl_propyl_sulfide.ct 132.00 +ethyl_isobutyl_sulfide.ct 134.20 +isopentyl_methyl_sulfide.ct 137.00 +methyl_2-methylbutyl_sulfide.ct 139.00 +sec-butyl_ethyl_sulfide.ct 133.60 +tert-butyl_ethyl_sulfide.ct 120.40 +diisopropyl_sulfide.ct 120.00 +1-ethylpropyl_methyl_sulfide.ct 137.00 +dipropyl_disulfide.ct 195.80 +diisopropyl_disulfide.ct 177.20 +sec-butyl_ethyl_disulfide.ct 181.00 +isopropyl_propyl_disulfide.ct 185.90 +tert-butyl_ethyl_disulfide.ct 175.70 +1,1-bis(ethylthio)ethane.ct 186.00 +1,2-bis(ethylthio)ethane.ct 211.00 +hexyl_methyl_ether.ct 125.00 +ethyl_pentyl_ether.ct 118.00 +butyl_propyl_ether.ct 117.10 +butyl_isopropyl_ether.ct 107.00 +isobutyl_propyl_ether.ct 102.50 +ethyl_isopentyl_ether.ct 112.00 +tert-butyl_propyl_ether.ct 97.40 +2,2-dimethylpropyl_ethyl_ether.ct 91.50 +tert-butyl_isopropyl_ether.ct 87.60 +ethyl_1-methylbutyl_ether.ct 106.50 +ethyl_tert-pentyl_ether.ct 101.00 +1,2-dimethylpropyl_ethyl_ether.ct 99.30 +ethyl_1-ethylpropyl_ether.ct 90.00 +dipropoxymethane.ct 137.00 +2,2-diethoxypropane.ct 114.00 +1-ethoxy-1-propoxyethane.ct 126.00 +1,1-diethoxypropane.ct 124.00 +1,3-diethoxypropane.ct 140.50 +1,5-dimethoxypentane.ct 157.50 +1-ethoxy-4-methoxybutane.ct 146.00 +1,4-dimethoxypentane.ct 145.00 +1,3-dimethoxypentane.ct 141.00 +hexyl_methyl_sulfide.ct 171.00 +butyl_propyl_sulfide.ct 166.00 +isobutyl_propyl_sulfide.ct 155.00 +isobutyl_isopropyl_sulfide.ct 145.00 +ethyl_2-methylbutyl_sulfide.ct 159.00 +tert-butyl_propyl_sulfide.ct 138.00 +sec-butyl_isopropyl_sulfide.ct 142.00 +ethyl_isopentyl_sulfide.ct 159.00 +butyl_isopropyl_sulfide.ct 163.50 +1,3-bis(ethylthio)propane.ct 229.50 +dibutyl_ether.ct 142.00 +isopentyl_propyl_ether.ct 125.00 +butyl_isobutyl_ether.ct 132.00 +butyl_sec-butyl_ether.ct 130.50 +butyl_tert-butyl_ether.ct 125.00 +sec-butyl_isobutyl_ether.ct 122.00 +1,3-dimethylpentyl_methyl_ether.ct 121.00 +diisobutyl_ether.ct 122.20 +isobutyl_tert-butyl_ether.ct 112.00 +di-tert-butyl_ether.ct 106.00 +isopropyl_tert-pentyl_ether.ct 114.50 +heptyl_methyl_ether.ct 151.00 +1-ethylpropyl_propyl_ether.ct 128.50 +di-tert-butyl_peroxide.ct 109.50 +1,1-diisopropoxyethane.ct 126.00 +1,1-dipropoxyethane.ct 147.00 +1,1-dimethoxyhexane.ct 158.00 +2,4-dimethoxy-2-methylpentane.ct 147.00 +1,4-diethoxybutane.ct 165.00 +dibutylsulfide.ct 188.90 +diisobutyl_sulfide.ct 170.00 +butyl_isobutyl_sulfide.ct 178.00 +di-tert-butyl_sulfide.ct 148.50 +di-sec-butyl_sulfide.ct 165.00 +butyl_sec-butyl_sulfide.ct 177.00 +sec-butyl_isobutyl_sulfide.ct 167.00 +heptyl_methyl_sulfide.ct 195.00 +dibutyl_disulfide.ct 226.00 +diisobutyl_disulfide.ct 215.00 +di-tert-butyl_disulfide.ct 201.00 +1,1-bis(isopropylthio)ethane.ct 205.00 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.50 +ethyl_heptyl_ether.ct 165.50 +butyl_isopentyl_ether.ct 157.00 +tert-butyl_isopentyl_ether.ct 139.00 +butyl_pentyl_ether.ct 163.00 +1,5-dimethylhexyl_methyl_ether.ct 153.50 +isobutyl_isopentyl_ether.ct 139.00 +methyl_1-methylheptyl_ether.ct 162.00 +methyl_octyl_ether.ct 173.00 +2-ethylhexyl_methyl_ether.ct 159.50 +methyl_1,1,4-trimethylpentyl_ether.ct 159.50 +3,5-dimethylhexyl_methyl_ether.ct 155.50 +ethyl_1,1,3-trimethylbutyl_ether.ct 141.00 +tert-butyl_tert-pentyl_peroxide.ct 126.00 +1,1-dimethoxy-2,2-dimethylpentane.ct 164.00 +1,1-diethoxypentane.ct 163.00 +1,1-dipropoxypropane.ct 166.50 +1,1-diisopropoxypropane.ct 146.00 +1,3-dipropoxypropane.ct 165.00 +1,3-diisopropoxypropane.ct 159.00 +ethyl_heptyl_sulfide.ct 195.00 +methyl_octyl_sulfide.ct 218.00 +bis(butylthio)methane.ct 250.00 +2,2-bis(propylthio)propane.ct 235.00 +ethyl_octyl_ether.ct 186.50 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.50 +bis(1-ethylpropyl)_ether.ct 162.00 +bis(1-methylbutyl)_ether.ct 162.00 +diisopentyl_ether.ct 173.20 +dipentyl_ether.ct 186.80 +isopropyl_heptyl_ether.ct 173.00 +heptyl_propyl_ether.ct 187.00 +isopentyl_pentyl_ether.ct 174.00 +methyl_1-methyloctyl_ether.ct 188.50 +di-tert-pentyl_sulfide.ct 199.00 +dipentyl_sulfide.ct 228.00 +diisopentyl_sulfide.ct 215.00 +isobutyl_4-methylpentyl_sulfide.ct 216.00 +methyl_nonyl_sulfide.ct 240.00 diff --git a/datasets/Acyclic/dataset_bps_old.ds b/datasets/Acyclic/dataset_bps_old.ds new file mode 100644 index 0000000..85de530 --- /dev/null +++ b/datasets/Acyclic/dataset_bps_old.ds @@ -0,0 +1,185 @@ +dimethyl_ether.ct -23.70 +dimethyl_peroxide.ct 14.00 +dimethyl_sulfide.ct 37.30 +dimethyl_disulfide.ct 109.70 +ethyl_methyl_ether.ct 10.80 +ethyl_methyl_peroxide.ct 39.00 +dimethoxymethane.ct 42.00 +ethyl_methyl_sulfide.ct 66.60 +ethyl_methyl_disulfide.ct 135.00 +bis(methylthio)methane.ct 148.50 +methyl_propyl_ether.ct 40.00 +diethyl_ether.ct 34.60 +isopropyl_methyl_ether.ct 32.00 +diethyl_peroxide.ct 63.00 +isopropyl_methyl_peroxide.ct 53.50 +#ethoxymethoxyethane.ct 67.00 +1,1-dimethoxyethane.ct 64.40 +1,2-dimethoxyethane.ct 84.70 +methyl_propyl_sulfide.ct 95.50 +diethyl_sulfide.ct 92.00 +isopropyl_methyl_sulfide.ct 84.40 +diethyl_disulfide.ct 154.00 +1,1-bis(methylthio)ethane.ct 156.00 +ethylthiomethylthiomethane.ct 166.00 +1,2-bis(methylthio)ethane.ct 183.00 +butyl_methyl_ether.ct 70.30 +ethyl_propyl_ether.ct 63.60 +ethyl_isopropyl_ether.ct 52.50 +isobutyl_methyl_ether.ct 59.00 +sec-butyl_methyl_ether.ct 59.50 +tert-butyl_methyl_ether.ct 55.20 +diethoxymethane.ct 88.00 +2,2-dimethoxypropane.ct 83.00 +1,3-dimethoxypropane.ct 104.50 +1-ethoxy-2-methoxyethane.ct 102.00 +1,2-dimethoxypropane.ct 92.00 +ethyl_isopropyl_sulfide.ct 107.40 +butyl_methyl_sulfide.ct 123.20 +isobutyl_methyl_sulfide.ct 112.50 +ethyl_propyl_sulfide.ct 118.50 +tert-butyl_methyl_sulfide.ct 101.50 +ethyl_propyl_disulfide.ct 173.70 +ethyl_isopropyl_disulfide.ct 165.50 +bis(ethylthio)methane.ct 181.00 +methyl_pentyl_ether.ct 99.50 +ethyl_butyl_ether.ct 92.30 +dipropyl_ether.ct 90.10 +isopropyl_propyl_ether.ct 80.20 +ethyl_isobutyl_ether.ct 82.00 +isopentyl_methyl_ether.ct 91.20 +methyl_2-methylbutyl_ether.ct 91.50 +ethyl_sec-butyl_ether.ct 81.20 +methyl_1-methylbutyl_ether.ct 93.00 +diisopropyl_ether.ct 69.00 +methyl_tert-pentyl_ether.ct 86.30 +1,2-dimethylpropyl_methyl_ether.ct 82.00 +1,1-diethoxyethane.ct 103.00 +1,1-dimethoxy-2-methylpropane.ct 103.50 +2-ethoxy-2-methoxypropane.ct 96.00 +1,1-dimethoxybutane.ct 112.00 +1-methoxy-1-propoxyethane.ct 104.00 +1,4-dimethoxybutane.ct 132.50 +1,2-diethoxyethane.ct 123.50 +1,3-dimethoxybutane.ct 120.30 +methyl_pentyl_sulfide.ct 145.00 +butyl_ethyl_sulfide.ct 144.20 +dipropyl_sulfide.ct 142.80 +isopropyl_propyl_sulfide.ct 132.00 +ethyl_isobutyl_sulfide.ct 134.20 +isopentyl_methyl_sulfide.ct 137.00 +methyl_2-methylbutyl_sulfide.ct 139.00 +sec-butyl_ethyl_sulfide.ct 133.60 +tert-butyl_ethyl_sulfide.ct 120.40 +diisopropyl_sulfide.ct 120.00 +1-ethylpropyl_methyl_sulfide.ct 137.00 +dipropyl_disulfide.ct 195.80 +diisopropyl_disulfide.ct 177.20 +sec-butyl_ethyl_disulfide.ct 181.00 +isopropyl_propyl_disulfide.ct 185.90 +tert-butyl_ethyl_disulfide.ct 175.70 +1,1-bis(ethylthio)ethane.ct 186.00 +1,2-bis(ethylthio)ethane.ct 211.00 +hexyl_methyl_ether.ct 125.00 +ethyl_pentyl_ether.ct 118.00 +butyl_propyl_ether.ct 117.10 +butyl_isopropyl_ether.ct 107.00 +isobutyl_propyl_ether.ct 102.50 +ethyl_isopentyl_ether.ct 112.00 +tert-butyl_propyl_ether.ct 97.40 +2,2-dimethylpropyl_ethyl_ether.ct 91.50 +tert-butyl_isopropyl_ether.ct 87.60 +ethyl_1-methylbutyl_ether.ct 106.50 +ethyl_tert-pentyl_ether.ct 101.00 +1,2-dimethylpropyl_ethyl_ether.ct 99.30 +ethyl_1-ethylpropyl_ether.ct 90.00 +dipropoxymethane.ct 137.00 +2,2-diethoxypropane.ct 114.00 +1-ethoxy-1-propoxyethane.ct 126.00 +1,1-diethoxypropane.ct 124.00 +1,3-diethoxypropane.ct 140.50 +1,5-dimethoxypentane.ct 157.50 +1-ethoxy-4-methoxybutane.ct 146.00 +1,4-dimethoxypentane.ct 145.00 +1,3-dimethoxypentane.ct 141.00 +hexyl_methyl_sulfide.ct 171.00 +butyl_propyl_sulfide.ct 166.00 +isobutyl_propyl_sulfide.ct 155.00 +isobutyl_isopropyl_sulfide.ct 145.00 +ethyl_2-methylbutyl_sulfide.ct 159.00 +tert-butyl_propyl_sulfide.ct 138.00 +sec-butyl_isopropyl_sulfide.ct 142.00 +ethyl_isopentyl_sulfide.ct 159.00 +butyl_isopropyl_sulfide.ct 163.50 +1,3-bis(ethylthio)propane.ct 229.50 +dibutyl_ether.ct 142.00 +isopentyl_propyl_ether.ct 125.00 +butyl_isobutyl_ether.ct 132.00 +butyl_sec-butyl_ether.ct 130.50 +butyl_tert-butyl_ether.ct 125.00 +sec-butyl_isobutyl_ether.ct 122.00 +1,3-dimethylpentyl_methyl_ether.ct 121.00 +diisobutyl_ether.ct 122.20 +isobutyl_tert-butyl_ether.ct 112.00 +di-tert-butyl_ether.ct 106.00 +isopropyl_tert-pentyl_ether.ct 114.50 +heptyl_methyl_ether.ct 151.00 +1-ethylpropyl_propyl_ether.ct 128.50 +di-tert-butyl_peroxide.ct 109.50 +1,1-diisopropoxyethane.ct 126.00 +1,1-dipropoxyethane.ct 147.00 +1,1-dimethoxyhexane.ct 158.00 +2,4-dimethoxy-2-methylpentane.ct 147.00 +1,4-diethoxybutane.ct 165.00 +dibutylsulfide.ct 188.90 +diisobutyl_sulfide.ct 170.00 +butyl_isobutyl_sulfide.ct 178.00 +di-tert-butyl_sulfide.ct 148.50 +di-sec-butyl_sulfide.ct 165.00 +butyl_sec-butyl_sulfide.ct 177.00 +sec-butyl_isobutyl_sulfide.ct 167.00 +heptyl_methyl_sulfide.ct 195.00 +dibutyl_disulfide.ct 226.00 +diisobutyl_disulfide.ct 215.00 +di-tert-butyl_disulfide.ct 201.00 +1,1-bis(isopropylthio)ethane.ct 205.00 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.50 +ethyl_heptyl_ether.ct 165.50 +butyl_isopentyl_ether.ct 157.00 +tert-butyl_isopentyl_ether.ct 139.00 +butyl_pentyl_ether.ct 163.00 +1,5-dimethylhexyl_methyl_ether.ct 153.50 +isobutyl_isopentyl_ether.ct 139.00 +methyl_1-methylheptyl_ether.ct 162.00 +methyl_octyl_ether.ct 173.00 +2-ethylhexyl_methyl_ether.ct 159.50 +methyl_1,1,4-trimethylpentyl_ether.ct 159.50 +3,5-dimethylhexyl_methyl_ether.ct 155.50 +ethyl_1,1,3-trimethylbutyl_ether.ct 141.00 +tert-butyl_tert-pentyl_peroxide.ct 126.00 +1,1-dimethoxy-2,2-dimethylpentane.ct 164.00 +1,1-diethoxypentane.ct 163.00 +1,1-dipropoxypropane.ct 166.50 +1,1-diisopropoxypropane.ct 146.00 +1,3-dipropoxypropane.ct 165.00 +1,3-diisopropoxypropane.ct 159.00 +ethyl_heptyl_sulfide.ct 195.00 +methyl_octyl_sulfide.ct 218.00 +bis(butylthio)methane.ct 250.00 +2,2-bis(propylthio)propane.ct 235.00 +ethyl_octyl_ether.ct 186.50 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.50 +bis(1-ethylpropyl)_ether.ct 162.00 +bis(1-methylbutyl)_ether.ct 162.00 +#1-butyl-propane-2-ol.ct 170.20 +diisopentyl_ether.ct 173.20 +dipentyl_ether.ct 186.80 +isopropyl_heptyl_ether.ct 173.00 +heptyl_propyl_ether.ct 187.00 +isopentyl_pentyl_ether.ct 174.00 +methyl_1-methyloctyl_ether.ct 188.50 +di-tert-pentyl_sulfide.ct 199.00 +dipentyl_sulfide.ct 228.00 +diisopentyl_sulfide.ct 215.00 +isobutyl_4-methylpentyl_sulfide.ct 216.00 +methyl_nonyl_sulfide.ct 240.00 diff --git a/datasets/Acyclic/di-sec-butyl_sulfide.ct b/datasets/Acyclic/di-sec-butyl_sulfide.ct new file mode 100644 index 0000000..c89719e --- /dev/null +++ b/datasets/Acyclic/di-sec-butyl_sulfide.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 6 1 1 + 3 7 1 1 + 4 8 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/di-tert-butyl_disulfide.ct b/datasets/Acyclic/di-tert-butyl_disulfide.ct new file mode 100644 index 0000000..dc3551c --- /dev/null +++ b/datasets/Acyclic/di-tert-butyl_disulfide.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 7 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/di-tert-butyl_ether.ct b/datasets/Acyclic/di-tert-butyl_ether.ct new file mode 100644 index 0000000..ad79746 --- /dev/null +++ b/datasets/Acyclic/di-tert-butyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/di-tert-butyl_peroxide.ct b/datasets/Acyclic/di-tert-butyl_peroxide.ct new file mode 100644 index 0000000..26ff92c --- /dev/null +++ b/datasets/Acyclic/di-tert-butyl_peroxide.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/di-tert-butyl_sulfide.ct b/datasets/Acyclic/di-tert-butyl_sulfide.ct new file mode 100644 index 0000000..cbf9ea0 --- /dev/null +++ b/datasets/Acyclic/di-tert-butyl_sulfide.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 7 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/di-tert-pentyl_sulfide.ct b/datasets/Acyclic/di-tert-pentyl_sulfide.ct new file mode 100644 index 0000000..a8b4763 --- /dev/null +++ b/datasets/Acyclic/di-tert-pentyl_sulfide.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 7 1 1 + 2 8 1 1 + 3 9 1 1 + 4 9 1 1 + 5 10 1 1 + 6 10 1 1 + 7 9 1 1 + 8 10 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/dibutyl_disulfide.ct b/datasets/Acyclic/dibutyl_disulfide.ct new file mode 100644 index 0000000..f4a9acb --- /dev/null +++ b/datasets/Acyclic/dibutyl_disulfide.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/dibutyl_ether.ct b/datasets/Acyclic/dibutyl_ether.ct new file mode 100644 index 0000000..4c65478 --- /dev/null +++ b/datasets/Acyclic/dibutyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/dibutylsulfide.ct b/datasets/Acyclic/dibutylsulfide.ct new file mode 100644 index 0000000..0b1ce26 --- /dev/null +++ b/datasets/Acyclic/dibutylsulfide.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/diethoxymethane.ct b/datasets/Acyclic/diethoxymethane.ct new file mode 100644 index 0000000..6da12c1 --- /dev/null +++ b/datasets/Acyclic/diethoxymethane.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/diethyl_disulfide.ct b/datasets/Acyclic/diethyl_disulfide.ct new file mode 100644 index 0000000..15c4651 --- /dev/null +++ b/datasets/Acyclic/diethyl_disulfide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/diethyl_ether.ct b/datasets/Acyclic/diethyl_ether.ct new file mode 100644 index 0000000..e6e1421 --- /dev/null +++ b/datasets/Acyclic/diethyl_ether.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/diethyl_peroxide.ct b/datasets/Acyclic/diethyl_peroxide.ct new file mode 100644 index 0000000..368b65b --- /dev/null +++ b/datasets/Acyclic/diethyl_peroxide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/diethyl_sulfide.ct b/datasets/Acyclic/diethyl_sulfide.ct new file mode 100644 index 0000000..fe170b1 --- /dev/null +++ b/datasets/Acyclic/diethyl_sulfide.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/diisobutyl_disulfide.ct b/datasets/Acyclic/diisobutyl_disulfide.ct new file mode 100644 index 0000000..d202ca5 --- /dev/null +++ b/datasets/Acyclic/diisobutyl_disulfide.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 7 1 1 + 2 7 1 1 + 3 8 1 1 + 4 8 1 1 + 5 7 1 1 + 5 9 1 1 + 6 8 1 1 + 6 10 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/diisobutyl_ether.ct b/datasets/Acyclic/diisobutyl_ether.ct new file mode 100644 index 0000000..c4a28ab --- /dev/null +++ b/datasets/Acyclic/diisobutyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 7 1 1 + 3 8 1 1 + 4 8 1 1 + 5 7 1 1 + 5 9 1 1 + 6 8 1 1 + 6 9 1 1 diff --git a/datasets/Acyclic/diisobutyl_sulfide.ct b/datasets/Acyclic/diisobutyl_sulfide.ct new file mode 100644 index 0000000..3a8fba8 --- /dev/null +++ b/datasets/Acyclic/diisobutyl_sulfide.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 7 1 1 + 2 7 1 1 + 3 8 1 1 + 4 8 1 1 + 5 7 1 1 + 5 9 1 1 + 6 8 1 1 + 6 9 1 1 diff --git a/datasets/Acyclic/diisopentyl_ether.ct b/datasets/Acyclic/diisopentyl_ether.ct new file mode 100644 index 0000000..04bc200 --- /dev/null +++ b/datasets/Acyclic/diisopentyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 9 1 1 + 2 9 1 1 + 3 10 1 1 + 4 10 1 1 + 5 7 1 1 + 5 9 1 1 + 6 8 1 1 + 6 10 1 1 + 7 11 1 1 + 8 11 1 1 diff --git a/datasets/Acyclic/diisopentyl_sulfide.ct b/datasets/Acyclic/diisopentyl_sulfide.ct new file mode 100644 index 0000000..155ce40 --- /dev/null +++ b/datasets/Acyclic/diisopentyl_sulfide.ct @@ -0,0 +1,23 @@ +g + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 9 1 1 + 2 9 1 1 + 3 10 1 1 + 4 10 1 1 + 5 7 1 1 + 5 9 1 1 + 6 8 1 1 + 6 10 1 1 + 7 11 1 1 + 8 11 1 1 diff --git a/datasets/Acyclic/diisopropyl_disulfide.ct b/datasets/Acyclic/diisopropyl_disulfide.ct new file mode 100644 index 0000000..72204aa --- /dev/null +++ b/datasets/Acyclic/diisopropyl_disulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/diisopropyl_ether.ct b/datasets/Acyclic/diisopropyl_ether.ct new file mode 100644 index 0000000..3d161e4 --- /dev/null +++ b/datasets/Acyclic/diisopropyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/diisopropyl_sulfide.ct b/datasets/Acyclic/diisopropyl_sulfide.ct new file mode 100644 index 0000000..445ea0a --- /dev/null +++ b/datasets/Acyclic/diisopropyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/dimethoxymethane.ct b/datasets/Acyclic/dimethoxymethane.ct new file mode 100644 index 0000000..7ec0633 --- /dev/null +++ b/datasets/Acyclic/dimethoxymethane.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 4 1 1 + 3 5 1 1 diff --git a/datasets/Acyclic/dimethyl_disulfide.ct b/datasets/Acyclic/dimethyl_disulfide.ct new file mode 100644 index 0000000..70aec56 --- /dev/null +++ b/datasets/Acyclic/dimethyl_disulfide.ct @@ -0,0 +1,9 @@ + + 4 3 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 4 1 1 diff --git a/datasets/Acyclic/dimethyl_ether.ct b/datasets/Acyclic/dimethyl_ether.ct new file mode 100644 index 0000000..bd5601a --- /dev/null +++ b/datasets/Acyclic/dimethyl_ether.ct @@ -0,0 +1,7 @@ + + 3 2 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 3 1 1 diff --git a/datasets/Acyclic/dimethyl_peroxide.ct b/datasets/Acyclic/dimethyl_peroxide.ct new file mode 100644 index 0000000..553b9a9 --- /dev/null +++ b/datasets/Acyclic/dimethyl_peroxide.ct @@ -0,0 +1,9 @@ + + 4 3 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 4 1 1 diff --git a/datasets/Acyclic/dimethyl_sulfide.ct b/datasets/Acyclic/dimethyl_sulfide.ct new file mode 100644 index 0000000..8a1d11f --- /dev/null +++ b/datasets/Acyclic/dimethyl_sulfide.ct @@ -0,0 +1,7 @@ + + 3 2 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 3 1 1 diff --git a/datasets/Acyclic/dipentyl_ether.ct b/datasets/Acyclic/dipentyl_ether.ct new file mode 100644 index 0000000..06552dd --- /dev/null +++ b/datasets/Acyclic/dipentyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/dipentyl_sulfide.ct b/datasets/Acyclic/dipentyl_sulfide.ct new file mode 100644 index 0000000..45539f3 --- /dev/null +++ b/datasets/Acyclic/dipentyl_sulfide.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 9 1 1 + 8 10 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/dipropoxymethane.ct b/datasets/Acyclic/dipropoxymethane.ct new file mode 100644 index 0000000..ed9f8a9 --- /dev/null +++ b/datasets/Acyclic/dipropoxymethane.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 8 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/dipropyl_disulfide.ct b/datasets/Acyclic/dipropyl_disulfide.ct new file mode 100644 index 0000000..fdee11e --- /dev/null +++ b/datasets/Acyclic/dipropyl_disulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/dipropyl_ether.ct b/datasets/Acyclic/dipropyl_ether.ct new file mode 100644 index 0000000..71e26e0 --- /dev/null +++ b/datasets/Acyclic/dipropyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/dipropyl_sulfide.ct b/datasets/Acyclic/dipropyl_sulfide.ct new file mode 100644 index 0000000..0d726f3 --- /dev/null +++ b/datasets/Acyclic/dipropyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/ethoxymethoxyethane.ct b/datasets/Acyclic/ethoxymethoxyethane.ct new file mode 100644 index 0000000..6da12c1 --- /dev/null +++ b/datasets/Acyclic/ethoxymethoxyethane.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/ethyl_1,1,3,3-tetramethylbutyl_ether.ct b/datasets/Acyclic/ethyl_1,1,3,3-tetramethylbutyl_ether.ct new file mode 100644 index 0000000..099d70e --- /dev/null +++ b/datasets/Acyclic/ethyl_1,1,3,3-tetramethylbutyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 9 1 1 + 3 9 1 1 + 4 9 1 1 + 5 10 1 1 + 6 10 1 1 + 7 11 1 1 + 8 9 1 1 + 8 10 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/ethyl_1,1,3-trimethylbutyl_ether.ct b/datasets/Acyclic/ethyl_1,1,3-trimethylbutyl_ether.ct new file mode 100644 index 0000000..bbf9215 --- /dev/null +++ b/datasets/Acyclic/ethyl_1,1,3-trimethylbutyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 8 1 1 + 3 8 1 1 + 4 9 1 1 + 5 9 1 1 + 6 10 1 1 + 7 8 1 1 + 7 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/ethyl_1-ethylpropyl_ether.ct b/datasets/Acyclic/ethyl_1-ethylpropyl_ether.ct new file mode 100644 index 0000000..9b7e25a --- /dev/null +++ b/datasets/Acyclic/ethyl_1-ethylpropyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 7 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/ethyl_1-methylbutyl_ether.ct b/datasets/Acyclic/ethyl_1-methylbutyl_ether.ct new file mode 100644 index 0000000..52d957b --- /dev/null +++ b/datasets/Acyclic/ethyl_1-methylbutyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 7 1 1 + 4 6 1 1 + 5 8 1 1 + 6 7 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/ethyl_2-methylbutyl_sulfide.ct b/datasets/Acyclic/ethyl_2-methylbutyl_sulfide.ct new file mode 100644 index 0000000..8aa09ca --- /dev/null +++ b/datasets/Acyclic/ethyl_2-methylbutyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 7 1 1 + 4 7 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/ethyl_butyl_ether.ct b/datasets/Acyclic/ethyl_butyl_ether.ct new file mode 100644 index 0000000..06f8659 --- /dev/null +++ b/datasets/Acyclic/ethyl_butyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 7 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/ethyl_heptyl_ether.ct b/datasets/Acyclic/ethyl_heptyl_ether.ct new file mode 100644 index 0000000..892ded1 --- /dev/null +++ b/datasets/Acyclic/ethyl_heptyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 10 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/ethyl_heptyl_sulfide.ct b/datasets/Acyclic/ethyl_heptyl_sulfide.ct new file mode 100644 index 0000000..d664a89 --- /dev/null +++ b/datasets/Acyclic/ethyl_heptyl_sulfide.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 10 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/ethyl_isobutyl_ether.ct b/datasets/Acyclic/ethyl_isobutyl_ether.ct new file mode 100644 index 0000000..c7c40b4 --- /dev/null +++ b/datasets/Acyclic/ethyl_isobutyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 6 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/ethyl_isobutyl_sulfide.ct b/datasets/Acyclic/ethyl_isobutyl_sulfide.ct new file mode 100644 index 0000000..8edf4bc --- /dev/null +++ b/datasets/Acyclic/ethyl_isobutyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 6 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/ethyl_isopentyl_ether.ct b/datasets/Acyclic/ethyl_isopentyl_ether.ct new file mode 100644 index 0000000..6435e5c --- /dev/null +++ b/datasets/Acyclic/ethyl_isopentyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/ethyl_isopentyl_sulfide.ct b/datasets/Acyclic/ethyl_isopentyl_sulfide.ct new file mode 100644 index 0000000..4d0634f --- /dev/null +++ b/datasets/Acyclic/ethyl_isopentyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 6 1 1 + 5 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/ethyl_isopropyl_disulfide.ct b/datasets/Acyclic/ethyl_isopropyl_disulfide.ct new file mode 100644 index 0000000..55df8a8 --- /dev/null +++ b/datasets/Acyclic/ethyl_isopropyl_disulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/ethyl_isopropyl_ether.ct b/datasets/Acyclic/ethyl_isopropyl_ether.ct new file mode 100644 index 0000000..139007f --- /dev/null +++ b/datasets/Acyclic/ethyl_isopropyl_ether.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/ethyl_isopropyl_sulfide.ct b/datasets/Acyclic/ethyl_isopropyl_sulfide.ct new file mode 100644 index 0000000..32b12e2 --- /dev/null +++ b/datasets/Acyclic/ethyl_isopropyl_sulfide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/ethyl_methyl_disulfide.ct b/datasets/Acyclic/ethyl_methyl_disulfide.ct new file mode 100644 index 0000000..3a6027a --- /dev/null +++ b/datasets/Acyclic/ethyl_methyl_disulfide.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/ethyl_methyl_ether.ct b/datasets/Acyclic/ethyl_methyl_ether.ct new file mode 100644 index 0000000..8baf01d --- /dev/null +++ b/datasets/Acyclic/ethyl_methyl_ether.ct @@ -0,0 +1,9 @@ + + 4 3 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 4 1 1 diff --git a/datasets/Acyclic/ethyl_methyl_peroxide.ct b/datasets/Acyclic/ethyl_methyl_peroxide.ct new file mode 100644 index 0000000..ead2eaa --- /dev/null +++ b/datasets/Acyclic/ethyl_methyl_peroxide.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/ethyl_methyl_sulfide.ct b/datasets/Acyclic/ethyl_methyl_sulfide.ct new file mode 100644 index 0000000..848f705 --- /dev/null +++ b/datasets/Acyclic/ethyl_methyl_sulfide.ct @@ -0,0 +1,9 @@ + + 4 3 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 4 1 1 diff --git a/datasets/Acyclic/ethyl_octyl_ether.ct b/datasets/Acyclic/ethyl_octyl_ether.ct new file mode 100644 index 0000000..4d4cd7e --- /dev/null +++ b/datasets/Acyclic/ethyl_octyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 11 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/ethyl_pentyl_ether.ct b/datasets/Acyclic/ethyl_pentyl_ether.ct new file mode 100644 index 0000000..7871646 --- /dev/null +++ b/datasets/Acyclic/ethyl_pentyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 8 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/ethyl_propyl_disulfide.ct b/datasets/Acyclic/ethyl_propyl_disulfide.ct new file mode 100644 index 0000000..cefd847 --- /dev/null +++ b/datasets/Acyclic/ethyl_propyl_disulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/ethyl_propyl_ether.ct b/datasets/Acyclic/ethyl_propyl_ether.ct new file mode 100644 index 0000000..0a1de41 --- /dev/null +++ b/datasets/Acyclic/ethyl_propyl_ether.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/ethyl_propyl_sulfide.ct b/datasets/Acyclic/ethyl_propyl_sulfide.ct new file mode 100644 index 0000000..35e7d7a --- /dev/null +++ b/datasets/Acyclic/ethyl_propyl_sulfide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/ethyl_sec-butyl_ether.ct b/datasets/Acyclic/ethyl_sec-butyl_ether.ct new file mode 100644 index 0000000..c700761 --- /dev/null +++ b/datasets/Acyclic/ethyl_sec-butyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/ethyl_tert-pentyl_ether.ct b/datasets/Acyclic/ethyl_tert-pentyl_ether.ct new file mode 100644 index 0000000..8906f91 --- /dev/null +++ b/datasets/Acyclic/ethyl_tert-pentyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 7 1 1 + 4 7 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/ethylthiomethylthiomethane.ct b/datasets/Acyclic/ethylthiomethylthiomethane.ct new file mode 100644 index 0000000..caac5d2 --- /dev/null +++ b/datasets/Acyclic/ethylthiomethylthiomethane.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 5 1 1 + 3 6 1 1 + 4 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/ft9949002015.pdf b/datasets/Acyclic/ft9949002015.pdf new file mode 100644 index 0000000000000000000000000000000000000000..30f2a290b4b651236daef473efcf926c721b3a79 GIT binary patch literal 613095 zcmV+W{{#RfP((&8F)lL-CF0}H(+W8tFd%PYY6?6&FH?15ba`-PFHC7}YcEn|V{}_H zFfcAQI3PGNI3P1NHXt}MI9)G6JUlN`FI7@WFI7@WC}?zaa5^t9WOy!QZ)q-Xa%V3w zFfK7LGdVA2bU8URIWRCXFflbLK0Yr(Z*pX1a$7JUFd#5pFGE`}ATS^?T|PbvWo~3| zVrmL8Fd#4>Z(?c+JUlN`bz*dRaAhw{X>MyTQe|UwTQfE`E;TnGI59XNG&3_GI5Ie0 zFF`y!FHFkLT0TQDFnATeD&J_==SWN%_>3NbMtFd%PYY6?6& zFH?15ba`-PFHC7}YcEn|V{}_IGcztVHXt}LI3P7NFd#TGI9)G6JUlN`FI7@WFI7@W zC}?zaa5^t9aCKsHE^>2YE^l&YFJ*2oYHxLNZeeV5FKTafa&BR4FGf^9X>)URWocwR zMpQ95IW%86Fkdk=DLy_gLT_?pWpZ0EATS^>T`xmhFd#4>FYWRZ>YPXmoUNIxjC|crIjbX)bSaXD=}@E-^4OIWJ~(IXN^rFfcMOF*PYZJ}*LV za%5$4TQDFnATV7oLt8K)Fd#8qK0XR%Ze(v_Y6>wkATS_rVrmLJJTFsqVsv?MWiL!= zZfh@6Wn*+(G&VUdHaH+SF*6`FGc_PMGBaH-K|DM!Q!iCgNiS7WNhoM^bZ|N^FJyQw zWN&FMZ*pfZF)%JMFf%zXW^_3@G&wLZGB7bUDLy_gLT_?pWpZ0EATS^>T`xmhFd#4> zFYWRZ>YPXmoUNIxjC|crIjbX)bSaXD=}@E-^4OIWJ~( zIXN^rFfcMOF*PYZJ}*LVa%5$4TQDFnATV7oLt8K)Fd#8qK0XR%Ze(v_Y6>wmATS_r zVrmLJJTFsqVsv?MWiL!=Zfh@6Wn*+(G&VUdHaH+SF*6`FGc_PMGBaH-K|DM!Q!iCg zNiS7WNhoM^bZ|N^FJyQwWN&FMZ*pfZF)%JMFf%zXW^_3@G&wLZGB7bUDLy_gLT_?p zWpZ0EATS^>T`xmhFd#4>FwRFd%PYY6?6&FI0JOWiMDyVrpe$bT3nNVsv?MWiLi=a&0eC zWpi(Ja${w4JUlN@a&Kc(Wpp50FHl5AATLy9cyu5yNo`?gWkMh?No`?gWkVn@No`?g zWl3ExMsIF(JUlN(F(5J^Fd$MsK0ZD#LPBqNTQDFnATu#FE;lwHF)&>(MsIR$RC#b^ zATcjZVRUk7cpzIbATS^>ATb~?ATV7oOl59obZ8(kGB__rX>4?5axX?~VRU6gWn*t- zWj;Q0baG{3Z3=jt70W>mf-n$9;r*QA->DlqLqLI@Mon} z&ybu)8{%ZV9o)J}sYF!Ha)1<#?3=R6u-ni@(;w_qBHapQZe(+Ga%Ev{3T19&Z(?c+ zGaxV^Z(?c+JUlN{d2nSfSWjYVWn*+NQ*~l=d2nSfMsIR$FH&W5Z*_8GWpg|{FHmxC zV^d{xAX_g`L`EPlRAqQ{ATLR6VP|DRATLR6VP|DSATLR6VP|DYT`xv&Zgf06FGevS zG9WM@Qa(ODJ}*K-Z+KfUATS^{H7+wUATcmqFGg>2ZB%)1WgsyxO<{C$X?P%8F(5D? zFd#7?Fd#5pFHB`_XLM*FHa9OuX>4?5axX?~VRU6gWn*t-Wj;Q0baG{3Z3=jtGf*&4 zFjOc?=W+_+(swgduuup|<1z#af`knej1)q0xirEuQ_B?`i%K$+b5a%j^KvrtQZ+-e zxLiZH0K&Wv#tLO_WOHZ*pxfQe|^*b#h~6b38mRP;zf$Q)P4@TQ5*VMj$U#Wq5QTFG+1-XJtYl zFG+1-XJtbmFG+1-XJtuUFGg=}bUZvSMlm2VATS_OK0ZD^FG50Zcv~(MsIR$RC#b^ATcjZVRUk7cpzIbATS^>ATb~?ATV7oOl59obZ8(pH!ntMY;3lh^)HAAwvTtm13woVUH3T19&b98cLVQmU!Ze(v_ zY6>+VFd%PYY6?6&FI0JOWiMDyVrpe$bT3nNVsv?MWiLi=a&0eCWpi(Ja${w4JUlN@ za&Kc(Wpp50FHl5AATLy9cyu5yNo`?gWkMh?No`?gWkVn@No`?gWl3ExMsIF(JUlN( zF(5J^Fd$MsK0ZD#LPBqNTQDFnATcmDE;KYCF)&>(MsIR$RC#b^ATcjZVRUk7cpzIb zATS^>ATb~?ATV7oOl59obZ8(rF)v1GY;8$XN1ac?rHnAy>zLEM*rTRQZT27@l^ z>B)gHr|MHJgnU!?Scs)OzSTn}l^5bU6$A=pZe(+Ga%Ev{3T19&Z(?c+HXtw{Z(?c+ zJUlN{d2nSfSWjYVWn*+NQ*~l=d2nSfMsIR$FH&W5Z*_8GWpg|{FHmxCV^d{xAX_g` zL`EPlRAqQ{ATLR6VP|DRATLR6VP|DSATLR6VP|DYT`xv&Zgf06FGevSG9WM@Qa(OD zJ}*K-Z+KfUATS^{H7+wUATcmqFGg>2ZB%)1WgsyxO<{C$X?P%8F(5D?Fd#7?Fd#5p zFHB`_XLM*FHa9OuX>4?5axX?~VRU6gWn*t-Wj;Q0baG{3Z3=jtGf*&4FjOc?=W+_+ z(swgduuup|<1z#af`knej1)q0xirEuQ_B?`i%K$+b5a%j^KvrtQZ+-exLiZH0K&Wv z#tLO_WOH zZ*pxfQe|^*b#h~6b38mRP;zf$Q)P4@TQ5*VMj$U#Wq5QTFG+1-XJtYlFG+1-XJtbm zFG+1-XJtuUFGg=}bUZvSMlm2VATS_OK0ZD^FG50Zcv~(MsIR$ zRC#b^ATcjZVRUk7cpzIbATS^>ATb~?ATV7oOl59obZ8(pH!ntMY;3lh^)HAAwvTtm13woVUH3T19&b98cLVQmU!Ze(v_Y6>_YFd%PY zY6?6&FI0JOWiMDyVrpe$bT3nNVsv?MWiLi=a&0eCWpi(Ja${w4JUlN@a&Kc(Wpp50 zFHl5AATLy9cyu5yNo`?gWkMh?No`?gWkVn@No`?gWl3ExMsIF(JUlN(F(5J^Fd$Ms zK0ZD#LPBqNTQDFnAT~8FGcq7CFkLT3Z*px^d2nSQF)vMFbaH8UAX_mYFd#4>F(5D? zFkLT9Wo~D5XdpH>FGgu>bY*fcMr>hpWkh9TZ)9aYK67+(Wnpa!c$_m(FiWN%_>3NbbyFd%PYY6?6&FHLV`L}7GgC`39kFflhVF)=kU zG%+?cI4dwPConK4DKA5EWnpw_Z*D|kbY&<+Ix;XYGcY$XGcYnRHZn6SFf}JLFefQ5 zLvm$dbZ>GfL1S`nVqtV3H7+n9P+@Roav(!taCCKYWgt*&b!RPUZXjlFav)b}Ze(wF zb15%Sa&KgHV`XwEL1S`nVqtV3G%he8No{a%a&#b2Y;|WXX>K59Z*m}4X>Me1cXK-+ zZEs|0W@%+)Aa!$TZf78ARAqQ{t{^ooGcGeAsWLDyFfB4LF)|=AR5MsqAVO9`K_FZx zK}S$bEp}ycb7^mGTq!9&J_==SWN%_>3NbezFd%PYY6?6&FHB`_XLM*FF)%MiX>4?5 zaxX?~VRU6gWn*t-Wj;Q0baG{3Z3=jtE93$I0PX;M3T19&b98cLVQmU!Ze(v_Y6>wp zATS_rVrmLJJTFXTZfA68AUHQKMrmwxWpXb@Y+-a|L}g=dWMw`+b98cLVQmU{oMp

~5SWnyr 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

s3q8X*Z;e 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 zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^C zAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CAT}^CT|PbvWo~3|VrmLCIUq0~Z(?c+ zJUlN{d2nSfMsIF(L}hbha%pgMZ*nh2Z*Fu>VQpnELvM9*X=QRwWp_|hO;j&NZ*Fu# zLT`9mEiyGQAT2UAFd#NFI3O`FFfd&&Mr>hcb09M{FGFE)NM&hfXmlVpHa0Iob7N(0 zbRal0GcQDCb7N(0bRaV@FfUVdWo=d3N|nxFd%PYY6?6&FGgu> zbY*f|FF{j7Nl7?0L}g=dWMwZ#Y+-a|L}g=dWMy41S7~H)XdpK-FGyu+XJ~XFF)%YP zLvL(va#L_&V`U&VF(5D?QZGVjbaPN;azk%zaBps9Zge0xFHB`_XLM*FF)}nbK0b4F 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 zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC zFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NCFd#NC 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 GPeuw>Xb~9z literal 0 KcmV+b0RR6000031 diff --git a/datasets/Acyclic/heptyl_methyl_ether.ct b/datasets/Acyclic/heptyl_methyl_ether.ct new file mode 100644 index 0000000..21f1fa7 --- /dev/null +++ b/datasets/Acyclic/heptyl_methyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 9 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/heptyl_methyl_sulfide.ct b/datasets/Acyclic/heptyl_methyl_sulfide.ct new file mode 100644 index 0000000..b6c0e99 --- /dev/null +++ b/datasets/Acyclic/heptyl_methyl_sulfide.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 9 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/heptyl_propyl_ether.ct b/datasets/Acyclic/heptyl_propyl_ether.ct new file mode 100644 index 0000000..2faef5b --- /dev/null +++ b/datasets/Acyclic/heptyl_propyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 9 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 10 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/hexyl_methyl_ether.ct b/datasets/Acyclic/hexyl_methyl_ether.ct new file mode 100644 index 0000000..ba0c018 --- /dev/null +++ b/datasets/Acyclic/hexyl_methyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 8 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/hexyl_methyl_sulfide.ct b/datasets/Acyclic/hexyl_methyl_sulfide.ct new file mode 100644 index 0000000..ab63bb8 --- /dev/null +++ b/datasets/Acyclic/hexyl_methyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 8 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/isobutyl_4-methylpentyl_sulfide.ct b/datasets/Acyclic/isobutyl_4-methylpentyl_sulfide.ct new file mode 100644 index 0000000..911ad74 --- /dev/null +++ b/datasets/Acyclic/isobutyl_4-methylpentyl_sulfide.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 9 1 1 + 2 9 1 1 + 3 10 1 1 + 4 10 1 1 + 5 6 1 1 + 5 7 1 1 + 6 9 1 1 + 7 11 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Acyclic/isobutyl_isopentyl_ether.ct b/datasets/Acyclic/isobutyl_isopentyl_ether.ct new file mode 100644 index 0000000..1b36783 --- /dev/null +++ b/datasets/Acyclic/isobutyl_isopentyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 8 1 1 + 3 9 1 1 + 4 9 1 1 + 5 6 1 1 + 5 8 1 1 + 6 10 1 1 + 7 9 1 1 + 7 10 1 1 diff --git a/datasets/Acyclic/isobutyl_isopropyl_sulfide.ct b/datasets/Acyclic/isobutyl_isopropyl_sulfide.ct new file mode 100644 index 0000000..25ff82a --- /dev/null +++ b/datasets/Acyclic/isobutyl_isopropyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 6 1 1 + 2 6 1 1 + 3 7 1 1 + 4 7 1 1 + 5 6 1 1 + 5 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/isobutyl_methyl_ether.ct b/datasets/Acyclic/isobutyl_methyl_ether.ct new file mode 100644 index 0000000..ce33866 --- /dev/null +++ b/datasets/Acyclic/isobutyl_methyl_ether.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/isobutyl_methyl_sulfide.ct b/datasets/Acyclic/isobutyl_methyl_sulfide.ct new file mode 100644 index 0000000..88166fa --- /dev/null +++ b/datasets/Acyclic/isobutyl_methyl_sulfide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 5 1 1 + 3 6 1 1 + 4 5 1 1 + 4 6 1 1 diff --git a/datasets/Acyclic/isobutyl_propyl_ether.ct b/datasets/Acyclic/isobutyl_propyl_ether.ct new file mode 100644 index 0000000..2b77209 --- /dev/null +++ b/datasets/Acyclic/isobutyl_propyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 7 1 1 + 3 7 1 1 + 4 5 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/isobutyl_propyl_sulfide.ct b/datasets/Acyclic/isobutyl_propyl_sulfide.ct new file mode 100644 index 0000000..e2a30f4 --- /dev/null +++ b/datasets/Acyclic/isobutyl_propyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 7 1 1 + 3 7 1 1 + 4 5 1 1 + 5 8 1 1 + 6 7 1 1 + 6 8 1 1 diff --git a/datasets/Acyclic/isobutyl_tert-butyl_ether.ct b/datasets/Acyclic/isobutyl_tert-butyl_ether.ct new file mode 100644 index 0000000..a7d8461 --- /dev/null +++ b/datasets/Acyclic/isobutyl_tert-butyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 7 1 1 + 3 8 1 1 + 4 8 1 1 + 5 8 1 1 + 6 7 1 1 + 6 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/isopentyl_methyl_ether.ct b/datasets/Acyclic/isopentyl_methyl_ether.ct new file mode 100644 index 0000000..63f5fb8 --- /dev/null +++ b/datasets/Acyclic/isopentyl_methyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 6 1 1 + 3 7 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/isopentyl_methyl_sulfide.ct b/datasets/Acyclic/isopentyl_methyl_sulfide.ct new file mode 100644 index 0000000..903a154 --- /dev/null +++ b/datasets/Acyclic/isopentyl_methyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 6 1 1 + 2 6 1 1 + 3 7 1 1 + 4 5 1 1 + 4 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/isopentyl_pentyl_ether.ct b/datasets/Acyclic/isopentyl_pentyl_ether.ct new file mode 100644 index 0000000..ad48268 --- /dev/null +++ b/datasets/Acyclic/isopentyl_pentyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 10 1 1 + 3 10 1 1 + 4 5 1 1 + 5 6 1 1 + 6 8 1 1 + 7 9 1 1 + 7 10 1 1 + 8 11 1 1 + 9 11 1 1 diff --git a/datasets/Acyclic/isopentyl_propyl_ether.ct b/datasets/Acyclic/isopentyl_propyl_ether.ct new file mode 100644 index 0000000..eec8142 --- /dev/null +++ b/datasets/Acyclic/isopentyl_propyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 8 1 1 + 3 8 1 1 + 4 6 1 1 + 5 7 1 1 + 5 8 1 1 + 6 9 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/isopropyl_heptyl_ether.ct b/datasets/Acyclic/isopropyl_heptyl_ether.ct new file mode 100644 index 0000000..0fb9798 --- /dev/null +++ b/datasets/Acyclic/isopropyl_heptyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 10 1 1 + 3 10 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/isopropyl_methyl_ether.ct b/datasets/Acyclic/isopropyl_methyl_ether.ct new file mode 100644 index 0000000..c878cd1 --- /dev/null +++ b/datasets/Acyclic/isopropyl_methyl_ether.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 4 1 1 + 3 5 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/isopropyl_methyl_peroxide.ct b/datasets/Acyclic/isopropyl_methyl_peroxide.ct new file mode 100644 index 0000000..a1fa099 --- /dev/null +++ b/datasets/Acyclic/isopropyl_methyl_peroxide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/isopropyl_methyl_sulfide.ct b/datasets/Acyclic/isopropyl_methyl_sulfide.ct new file mode 100644 index 0000000..cebaf9e --- /dev/null +++ b/datasets/Acyclic/isopropyl_methyl_sulfide.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 4 1 1 + 3 5 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/isopropyl_propyl_disulfide.ct b/datasets/Acyclic/isopropyl_propyl_disulfide.ct new file mode 100644 index 0000000..e870743 --- /dev/null +++ b/datasets/Acyclic/isopropyl_propyl_disulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 6 1 1 + 3 6 1 1 + 4 5 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/isopropyl_propyl_ether.ct b/datasets/Acyclic/isopropyl_propyl_ether.ct new file mode 100644 index 0000000..9447fb5 --- /dev/null +++ b/datasets/Acyclic/isopropyl_propyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 6 1 1 + 3 6 1 1 + 4 5 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/isopropyl_propyl_sulfide.ct b/datasets/Acyclic/isopropyl_propyl_sulfide.ct new file mode 100644 index 0000000..fb6f6e8 --- /dev/null +++ b/datasets/Acyclic/isopropyl_propyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 6 1 1 + 3 6 1 1 + 4 5 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/isopropyl_tert-pentyl_ether.ct b/datasets/Acyclic/isopropyl_tert-pentyl_ether.ct new file mode 100644 index 0000000..7c1c156 --- /dev/null +++ b/datasets/Acyclic/isopropyl_tert-pentyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 8 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/methyl_1,1,4-trimethylpentyl_ether.ct b/datasets/Acyclic/methyl_1,1,4-trimethylpentyl_ether.ct new file mode 100644 index 0000000..9852ae1 --- /dev/null +++ b/datasets/Acyclic/methyl_1,1,4-trimethylpentyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 8 1 1 + 3 9 1 1 + 4 9 1 1 + 5 10 1 1 + 6 7 1 1 + 6 8 1 1 + 7 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/methyl_1-methylbutyl_ether.ct b/datasets/Acyclic/methyl_1-methylbutyl_ether.ct new file mode 100644 index 0000000..81f9900 --- /dev/null +++ b/datasets/Acyclic/methyl_1-methylbutyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 6 1 1 + 3 7 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/methyl_1-methylheptyl_ether.ct b/datasets/Acyclic/methyl_1-methylheptyl_ether.ct new file mode 100644 index 0000000..540c7fe --- /dev/null +++ b/datasets/Acyclic/methyl_1-methylheptyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 9 1 1 + 3 10 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/methyl_1-methyloctyl_ether.ct b/datasets/Acyclic/methyl_1-methyloctyl_ether.ct new file mode 100644 index 0000000..bd1d4a6 --- /dev/null +++ b/datasets/Acyclic/methyl_1-methyloctyl_ether.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 10 1 1 + 3 11 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/methyl_2-methylbutyl_ether.ct b/datasets/Acyclic/methyl_2-methylbutyl_ether.ct new file mode 100644 index 0000000..ad22976 --- /dev/null +++ b/datasets/Acyclic/methyl_2-methylbutyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 6 1 1 + 3 7 1 1 + 4 6 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/methyl_2-methylbutyl_sulfide.ct b/datasets/Acyclic/methyl_2-methylbutyl_sulfide.ct new file mode 100644 index 0000000..0b4c637 --- /dev/null +++ b/datasets/Acyclic/methyl_2-methylbutyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 6 1 1 + 3 7 1 1 + 4 6 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/methyl_nonyl_sulfide.ct b/datasets/Acyclic/methyl_nonyl_sulfide.ct new file mode 100644 index 0000000..1d98167 --- /dev/null +++ b/datasets/Acyclic/methyl_nonyl_sulfide.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 11 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/methyl_octyl_ether.ct b/datasets/Acyclic/methyl_octyl_ether.ct new file mode 100644 index 0000000..887308b --- /dev/null +++ b/datasets/Acyclic/methyl_octyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 10 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/methyl_octyl_sulfide.ct b/datasets/Acyclic/methyl_octyl_sulfide.ct new file mode 100644 index 0000000..bc0c443 --- /dev/null +++ b/datasets/Acyclic/methyl_octyl_sulfide.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 10 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/methyl_pentyl_ether.ct b/datasets/Acyclic/methyl_pentyl_ether.ct new file mode 100644 index 0000000..e4dbe02 --- /dev/null +++ b/datasets/Acyclic/methyl_pentyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 7 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/methyl_pentyl_sulfide.ct b/datasets/Acyclic/methyl_pentyl_sulfide.ct new file mode 100644 index 0000000..e942c06 --- /dev/null +++ b/datasets/Acyclic/methyl_pentyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 7 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/methyl_propyl_ether.ct b/datasets/Acyclic/methyl_propyl_ether.ct new file mode 100644 index 0000000..1435415 --- /dev/null +++ b/datasets/Acyclic/methyl_propyl_ether.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 3 1 1 + 2 5 1 1 + 3 4 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/methyl_propyl_sulfide.ct b/datasets/Acyclic/methyl_propyl_sulfide.ct new file mode 100644 index 0000000..f261df2 --- /dev/null +++ b/datasets/Acyclic/methyl_propyl_sulfide.ct @@ -0,0 +1,11 @@ + + 5 4 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 3 1 1 + 2 5 1 1 + 3 4 1 1 + 4 5 1 1 diff --git a/datasets/Acyclic/methyl_tert-pentyl_ether.ct b/datasets/Acyclic/methyl_tert-pentyl_ether.ct new file mode 100644 index 0000000..092466b --- /dev/null +++ b/datasets/Acyclic/methyl_tert-pentyl_ether.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 6 1 1 + 3 6 1 1 + 4 7 1 1 + 5 6 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/readme.md b/datasets/Acyclic/readme.md new file mode 100644 index 0000000..5bc76d2 --- /dev/null +++ b/datasets/Acyclic/readme.md @@ -0,0 +1,6 @@ +A database of acyclic molecules with hetero atoms (acyclic ethers, peroxides, acetals and their sulfur analogues). The dataset is concerned with the determination of the boiling point using regression (see dataset.ds) In both results presented bellow GLK stands for graph Laplacian kernel. + +# references +[1] https://brunl01.users.greyc.fr/CHEMISTRY/index.html#Acyclic + +**Attention the file dataset_bps.ds is sent to me by Benoit. The original one has some problems and now is renamed dataset_bps_old.ds.** diff --git a/datasets/Acyclic/sec-butyl_ethyl_disulfide.ct b/datasets/Acyclic/sec-butyl_ethyl_disulfide.ct new file mode 100644 index 0000000..ea87f8a --- /dev/null +++ b/datasets/Acyclic/sec-butyl_ethyl_disulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/sec-butyl_ethyl_sulfide.ct b/datasets/Acyclic/sec-butyl_ethyl_sulfide.ct new file mode 100644 index 0000000..e45c5c6 --- /dev/null +++ b/datasets/Acyclic/sec-butyl_ethyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/sec-butyl_isobutyl_ether.ct b/datasets/Acyclic/sec-butyl_isobutyl_ether.ct new file mode 100644 index 0000000..e2d3caa --- /dev/null +++ b/datasets/Acyclic/sec-butyl_isobutyl_ether.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 7 1 1 + 6 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/sec-butyl_isobutyl_sulfide.ct b/datasets/Acyclic/sec-butyl_isobutyl_sulfide.ct new file mode 100644 index 0000000..7ca6ca7 --- /dev/null +++ b/datasets/Acyclic/sec-butyl_isobutyl_sulfide.ct @@ -0,0 +1,19 @@ + + 9 8 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 7 1 1 + 3 7 1 1 + 4 8 1 1 + 5 8 1 1 + 6 7 1 1 + 6 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/sec-butyl_isopropyl_sulfide.ct b/datasets/Acyclic/sec-butyl_isopropyl_sulfide.ct new file mode 100644 index 0000000..cae3480 --- /dev/null +++ b/datasets/Acyclic/sec-butyl_isopropyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 6 1 1 + 3 6 1 1 + 4 7 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/sec-butyl_methyl_ether.ct b/datasets/Acyclic/sec-butyl_methyl_ether.ct new file mode 100644 index 0000000..90efb35 --- /dev/null +++ b/datasets/Acyclic/sec-butyl_methyl_ether.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 4 1 1 + 2 5 1 1 + 3 6 1 1 + 4 5 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/tert-butyl_ethyl_disulfide.ct b/datasets/Acyclic/tert-butyl_ethyl_disulfide.ct new file mode 100644 index 0000000..5bf91b9 --- /dev/null +++ b/datasets/Acyclic/tert-butyl_ethyl_disulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 6 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/tert-butyl_ethyl_sulfide.ct b/datasets/Acyclic/tert-butyl_ethyl_sulfide.ct new file mode 100644 index 0000000..6dfaa1d --- /dev/null +++ b/datasets/Acyclic/tert-butyl_ethyl_sulfide.ct @@ -0,0 +1,15 @@ + + 7 6 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 6 1 1 + 3 6 1 1 + 4 6 1 1 + 5 7 1 1 + 6 7 1 1 diff --git a/datasets/Acyclic/tert-butyl_isopentyl_ether.ct b/datasets/Acyclic/tert-butyl_isopentyl_ether.ct new file mode 100644 index 0000000..e25468c --- /dev/null +++ b/datasets/Acyclic/tert-butyl_isopentyl_ether.ct @@ -0,0 +1,21 @@ + + 10 9 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 8 1 1 + 2 8 1 1 + 3 9 1 1 + 4 9 1 1 + 5 9 1 1 + 6 7 1 1 + 6 8 1 1 + 7 10 1 1 + 9 10 1 1 diff --git a/datasets/Acyclic/tert-butyl_isopropyl_ether.ct b/datasets/Acyclic/tert-butyl_isopropyl_ether.ct new file mode 100644 index 0000000..3f62f44 --- /dev/null +++ b/datasets/Acyclic/tert-butyl_isopropyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 6 1 1 + 2 6 1 1 + 3 7 1 1 + 4 7 1 1 + 5 7 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/tert-butyl_methyl_ether.ct b/datasets/Acyclic/tert-butyl_methyl_ether.ct new file mode 100644 index 0000000..8dd3c20 --- /dev/null +++ b/datasets/Acyclic/tert-butyl_methyl_ether.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 5 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/tert-butyl_methyl_sulfide.ct b/datasets/Acyclic/tert-butyl_methyl_sulfide.ct new file mode 100644 index 0000000..c37cbe7 --- /dev/null +++ b/datasets/Acyclic/tert-butyl_methyl_sulfide.ct @@ -0,0 +1,13 @@ + + 6 5 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 5 1 1 + 3 5 1 1 + 4 6 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/tert-butyl_propyl_ether.ct b/datasets/Acyclic/tert-butyl_propyl_ether.ct new file mode 100644 index 0000000..5a1211e --- /dev/null +++ b/datasets/Acyclic/tert-butyl_propyl_ether.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 1 5 1 1 + 2 7 1 1 + 3 7 1 1 + 4 7 1 1 + 5 6 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/tert-butyl_propyl_sulfide.ct b/datasets/Acyclic/tert-butyl_propyl_sulfide.ct new file mode 100644 index 0000000..f36729f --- /dev/null +++ b/datasets/Acyclic/tert-butyl_propyl_sulfide.ct @@ -0,0 +1,17 @@ + + 8 7 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 S + 1 5 1 1 + 2 7 1 1 + 3 7 1 1 + 4 7 1 1 + 5 6 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/tert-butyl_tert-pentyl_peroxide.ct b/datasets/Acyclic/tert-butyl_tert-pentyl_peroxide.ct new file mode 100644 index 0000000..8b1f525 --- /dev/null +++ b/datasets/Acyclic/tert-butyl_tert-pentyl_peroxide.ct @@ -0,0 +1,23 @@ + + 11 10 + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 C + 0.0000 0.0000 0.0000 O + 0.0000 0.0000 0.0000 O + 1 7 1 1 + 2 8 1 1 + 3 8 1 1 + 4 8 1 1 + 5 9 1 1 + 6 9 1 1 + 7 9 1 1 + 8 10 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/testset_0.ds b/datasets/Acyclic/testset_0.ds new file mode 100644 index 0000000..66a795c --- /dev/null +++ b/datasets/Acyclic/testset_0.ds @@ -0,0 +1,19 @@ +dimethyl_ether.ct -23.7 +methyl_propyl_ether.ct 40 +diethyl_disulfide.ct 154 +diethoxymethane.ct 88 +ethyl_propyl_disulfide.ct 173.7 +ethyl_sec-butyl_ether.ct 81.2 +1,4-dimethoxybutane.ct 132.5 +sec-butyl_ethyl_sulfide.ct 133.6 +1,2-bis(ethylthio)ethane.ct 211 +ethyl_1-methylbutyl_ether.ct 106.5 +1-ethoxy-4-methoxybutane.ct 146 +ethyl_isopentyl_sulfide.ct 159 +diisobutyl_ether.ct 122.2 +2,4-dimethoxy-2-methylpentane.ct 147 +dibutyl_disulfide.ct 226 +isobutyl_isopentyl_ether.ct 139 +1,1-dipropoxypropane.ct 166.5 +bis(1-ethylpropyl)_ether.ct 162 +diisopentyl_sulfide.ct 215 diff --git a/datasets/Acyclic/testset_1.ds b/datasets/Acyclic/testset_1.ds new file mode 100644 index 0000000..0ca5f64 --- /dev/null +++ b/datasets/Acyclic/testset_1.ds @@ -0,0 +1,19 @@ +dimethyl_peroxide.ct 14 +diethyl_ether.ct 34.6 +1,1-bis(methylthio)ethane.ct 156 +2,2-dimethoxypropane.ct 83 +ethyl_isopropyl_disulfide.ct 165.5 +methyl_1-methylbutyl_ether.ct 93 +1,2-diethoxyethane.ct 123.5 +tert-butyl_ethyl_sulfide.ct 120.4 +hexyl_methyl_ether.ct 125 +ethyl_tert-pentyl_ether.ct 101 +1,4-dimethoxypentane.ct 145 +butyl_isopropyl_sulfide.ct 163.5 +isobutyl_tert-butyl_ether.ct 112 +1,4-diethoxybutane.ct 165 +diisobutyl_disulfide.ct 215 +methyl_1-methylheptyl_ether.ct 162 +1,1-diisopropoxypropane.ct 146 +bis(1-methylbutyl)_ether.ct 162 +isobutyl_4-methylpentyl_sulfide.ct 216 diff --git a/datasets/Acyclic/testset_2.ds b/datasets/Acyclic/testset_2.ds new file mode 100644 index 0000000..06bebd0 --- /dev/null +++ b/datasets/Acyclic/testset_2.ds @@ -0,0 +1,19 @@ +dimethyl_sulfide.ct 37.3 +isopropyl_methyl_ether.ct 32 +ethylthiomethylthiomethane.ct 166 +1,3-dimethoxypropane.ct 104.5 +bis(ethylthio)methane.ct 181 +diisopropyl_ether.ct 69 +1,3-dimethoxybutane.ct 120.3 +diisopropyl_sulfide.ct 120 +ethyl_pentyl_ether.ct 118 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +1,3-dimethoxypentane.ct 141 +1,3-bis(ethylthio)propane.ct 229.5 +di-tert-butyl_ether.ct 106 +dibutylsulfide.ct 188.9 +di-tert-butyl_disulfide.ct 201 +methyl_octyl_ether.ct 173 +1,3-dipropoxypropane.ct 165 +diisopentyl_ether.ct 173.2 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/testset_3.ds b/datasets/Acyclic/testset_3.ds new file mode 100644 index 0000000..fb6a3a1 --- /dev/null +++ b/datasets/Acyclic/testset_3.ds @@ -0,0 +1,18 @@ +dimethyl_disulfide.ct 109.7 +diethyl_peroxide.ct 63 +1,2-bis(methylthio)ethane.ct 183 +1-ethoxy-2-methoxyethane.ct 102 +methyl_pentyl_ether.ct 99.5 +methyl_tert-pentyl_ether.ct 86.3 +methyl_pentyl_sulfide.ct 145 +1-ethylpropyl_methyl_sulfide.ct 137 +butyl_propyl_ether.ct 117.1 +ethyl_1-ethylpropyl_ether.ct 90 +hexyl_methyl_sulfide.ct 171 +dibutyl_ether.ct 142 +isopropyl_tert-pentyl_ether.ct 114.5 +diisobutyl_sulfide.ct 170 +1,1-bis(isopropylthio)ethane.ct 205 +2-ethylhexyl_methyl_ether.ct 159.5 +1,3-diisopropoxypropane.ct 159 +dipentyl_ether.ct 186.8 diff --git a/datasets/Acyclic/testset_4.ds b/datasets/Acyclic/testset_4.ds new file mode 100644 index 0000000..8fb5f78 --- /dev/null +++ b/datasets/Acyclic/testset_4.ds @@ -0,0 +1,18 @@ +ethyl_methyl_ether.ct 10.8 +isopropyl_methyl_peroxide.ct 53.5 +butyl_methyl_ether.ct 70.3 +1,2-dimethoxypropane.ct 92 +ethyl_butyl_ether.ct 92.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_disulfide.ct 195.8 +butyl_isopropyl_ether.ct 107 +dipropoxymethane.ct 137 +butyl_propyl_sulfide.ct 166 +isopentyl_propyl_ether.ct 125 +heptyl_methyl_ether.ct 151 +butyl_isobutyl_sulfide.ct 178 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +ethyl_heptyl_sulfide.ct 195 +isopropyl_heptyl_ether.ct 173 diff --git a/datasets/Acyclic/testset_5.ds b/datasets/Acyclic/testset_5.ds new file mode 100644 index 0000000..b3b22a6 --- /dev/null +++ b/datasets/Acyclic/testset_5.ds @@ -0,0 +1,18 @@ +ethyl_methyl_peroxide.ct 39 +1,1-dimethoxyethane.ct 64.4 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_sulfide.ct 107.4 +dipropyl_ether.ct 90.1 +1,1-diethoxyethane.ct 103 +dipropyl_sulfide.ct 142.8 +diisopropyl_disulfide.ct 177.2 +isobutyl_propyl_ether.ct 102.5 +2,2-diethoxypropane.ct 114 +isobutyl_propyl_sulfide.ct 155 +butyl_isobutyl_ether.ct 132 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_sulfide.ct 148.5 +ethyl_heptyl_ether.ct 165.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +methyl_octyl_sulfide.ct 218 +heptyl_propyl_ether.ct 187 diff --git a/datasets/Acyclic/testset_6.ds b/datasets/Acyclic/testset_6.ds new file mode 100644 index 0000000..27af996 --- /dev/null +++ b/datasets/Acyclic/testset_6.ds @@ -0,0 +1,18 @@ +dimethoxymethane.ct 42 +1,2-dimethoxyethane.ct 84.7 +ethyl_isopropyl_ether.ct 52.5 +butyl_methyl_sulfide.ct 123.2 +isopropyl_propyl_ether.ct 80.2 +1,1-dimethoxy-2-methylpropane.ct 103.5 +isopropyl_propyl_sulfide.ct 132 +sec-butyl_ethyl_disulfide.ct 181 +ethyl_isopentyl_ether.ct 112 +1-ethoxy-1-propoxyethane.ct 126 +isobutyl_isopropyl_sulfide.ct 145 +butyl_sec-butyl_ether.ct 130.5 +di-tert-butyl_peroxide.ct 109.5 +di-sec-butyl_sulfide.ct 165 +butyl_isopentyl_ether.ct 157 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +bis(butylthio)methane.ct 250 +isopentyl_pentyl_ether.ct 174 diff --git a/datasets/Acyclic/testset_7.ds b/datasets/Acyclic/testset_7.ds new file mode 100644 index 0000000..361e0fa --- /dev/null +++ b/datasets/Acyclic/testset_7.ds @@ -0,0 +1,18 @@ +ethyl_methyl_sulfide.ct 66.6 +methyl_propyl_sulfide.ct 95.5 +isobutyl_methyl_ether.ct 59 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_isobutyl_ether.ct 82 +2-ethoxy-2-methoxypropane.ct 96 +ethyl_isobutyl_sulfide.ct 134.2 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_propyl_ether.ct 97.4 +1,1-diethoxypropane.ct 124 +ethyl_2-methylbutyl_sulfide.ct 159 +butyl_tert-butyl_ether.ct 125 +1,1-diisopropoxyethane.ct 126 +butyl_sec-butyl_sulfide.ct 177 +tert-butyl_isopentyl_ether.ct 139 +tert-butyl_tert-pentyl_peroxide.ct 126 +2,2-bis(propylthio)propane.ct 235 +methyl_1-methyloctyl_ether.ct 188.5 diff --git a/datasets/Acyclic/testset_8.ds b/datasets/Acyclic/testset_8.ds new file mode 100644 index 0000000..2face29 --- /dev/null +++ b/datasets/Acyclic/testset_8.ds @@ -0,0 +1,18 @@ +ethyl_methyl_disulfide.ct 135 +diethyl_sulfide.ct 92 +sec-butyl_methyl_ether.ct 59.5 +ethyl_propyl_sulfide.ct 118.5 +isopentyl_methyl_ether.ct 91.2 +1,1-dimethoxybutane.ct 112 +isopentyl_methyl_sulfide.ct 137 +tert-butyl_ethyl_disulfide.ct 175.7 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +1,3-diethoxypropane.ct 140.5 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isobutyl_ether.ct 122 +1,1-dipropoxyethane.ct 147 +sec-butyl_isobutyl_sulfide.ct 167 +butyl_pentyl_ether.ct 163 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +ethyl_octyl_ether.ct 186.5 +di-tert-pentyl_sulfide.ct 199 diff --git a/datasets/Acyclic/testset_9.ds b/datasets/Acyclic/testset_9.ds new file mode 100644 index 0000000..c427c66 --- /dev/null +++ b/datasets/Acyclic/testset_9.ds @@ -0,0 +1,18 @@ +bis(methylthio)methane.ct 148.5 +isopropyl_methyl_sulfide.ct 84.4 +tert-butyl_methyl_ether.ct 55.2 +tert-butyl_methyl_sulfide.ct 101.5 +methyl_2-methylbutyl_ether.ct 91.5 +1-methoxy-1-propoxyethane.ct 104 +methyl_2-methylbutyl_sulfide.ct 139 +1,1-bis(ethylthio)ethane.ct 186 +tert-butyl_isopropyl_ether.ct 87.6 +1,5-dimethoxypentane.ct 157.5 +sec-butyl_isopropyl_sulfide.ct 142 +1,3-dimethylpentyl_methyl_ether.ct 121 +1,1-dimethoxyhexane.ct 158 +heptyl_methyl_sulfide.ct 195 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +1,1-diethoxypentane.ct 163 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +dipentyl_sulfide.ct 228 diff --git a/datasets/Acyclic/trainset_0.ds b/datasets/Acyclic/trainset_0.ds new file mode 100644 index 0000000..1a62e74 --- /dev/null +++ b/datasets/Acyclic/trainset_0.ds @@ -0,0 +1,164 @@ +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_1.ds b/datasets/Acyclic/trainset_1.ds new file mode 100644 index 0000000..5d86d48 --- /dev/null +++ b/datasets/Acyclic/trainset_1.ds @@ -0,0 +1,164 @@ +dimethyl_ether.ct -23.7 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_2.ds b/datasets/Acyclic/trainset_2.ds new file mode 100644 index 0000000..c30337a --- /dev/null +++ b/datasets/Acyclic/trainset_2.ds @@ -0,0 +1,164 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 diff --git a/datasets/Acyclic/trainset_3.ds b/datasets/Acyclic/trainset_3.ds new file mode 100644 index 0000000..bf754a2 --- /dev/null +++ b/datasets/Acyclic/trainset_3.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_4.ds b/datasets/Acyclic/trainset_4.ds new file mode 100644 index 0000000..c98c9c8 --- /dev/null +++ b/datasets/Acyclic/trainset_4.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_5.ds b/datasets/Acyclic/trainset_5.ds new file mode 100644 index 0000000..74acc59 --- /dev/null +++ b/datasets/Acyclic/trainset_5.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_6.ds b/datasets/Acyclic/trainset_6.ds new file mode 100644 index 0000000..693b0c6 --- /dev/null +++ b/datasets/Acyclic/trainset_6.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_7.ds b/datasets/Acyclic/trainset_7.ds new file mode 100644 index 0000000..c606226 --- /dev/null +++ b/datasets/Acyclic/trainset_7.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_disulfide.ct 135 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +diethyl_sulfide.ct 92 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +sec-butyl_methyl_ether.ct 59.5 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +ethyl_propyl_sulfide.ct 118.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +isopentyl_methyl_ether.ct 91.2 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +1,1-dimethoxybutane.ct 112 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +isopentyl_methyl_sulfide.ct 137 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +tert-butyl_ethyl_disulfide.ct 175.7 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,3-diethoxypropane.ct 140.5 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +tert-butyl_propyl_sulfide.ct 138 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +sec-butyl_isobutyl_ether.ct 122 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-dipropoxyethane.ct 147 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +sec-butyl_isobutyl_sulfide.ct 167 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +butyl_pentyl_ether.ct 163 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +ethyl_octyl_ether.ct 186.5 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +di-tert-pentyl_sulfide.ct 199 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_8.ds b/datasets/Acyclic/trainset_8.ds new file mode 100644 index 0000000..f5196c3 --- /dev/null +++ b/datasets/Acyclic/trainset_8.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +bis(methylthio)methane.ct 148.5 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +isopropyl_methyl_sulfide.ct 84.4 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +tert-butyl_methyl_ether.ct 55.2 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +tert-butyl_methyl_sulfide.ct 101.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +methyl_2-methylbutyl_ether.ct 91.5 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1-methoxy-1-propoxyethane.ct 104 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +methyl_2-methylbutyl_sulfide.ct 139 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +1,1-bis(ethylthio)ethane.ct 186 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +tert-butyl_isopropyl_ether.ct 87.6 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,5-dimethoxypentane.ct 157.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +sec-butyl_isopropyl_sulfide.ct 142 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +1,3-dimethylpentyl_methyl_ether.ct 121 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dimethoxyhexane.ct 158 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +heptyl_methyl_sulfide.ct 195 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +1,5-dimethylhexyl_methyl_ether.ct 153.5 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-diethoxypentane.ct 163 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_1,1,3,3-tetramethylbutyl_ether.ct 156.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +dipentyl_sulfide.ct 228 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Acyclic/trainset_9.ds b/datasets/Acyclic/trainset_9.ds new file mode 100644 index 0000000..d494de0 --- /dev/null +++ b/datasets/Acyclic/trainset_9.ds @@ -0,0 +1,165 @@ +dimethyl_ether.ct -23.7 +dimethyl_peroxide.ct 14 +dimethyl_sulfide.ct 37.3 +dimethyl_disulfide.ct 109.7 +ethyl_methyl_ether.ct 10.8 +ethyl_methyl_peroxide.ct 39 +dimethoxymethane.ct 42 +ethyl_methyl_sulfide.ct 66.6 +ethyl_methyl_disulfide.ct 135 +methyl_propyl_ether.ct 40 +diethyl_ether.ct 34.6 +isopropyl_methyl_ether.ct 32 +diethyl_peroxide.ct 63 +isopropyl_methyl_peroxide.ct 53.5 +1,1-dimethoxyethane.ct 64.4 +1,2-dimethoxyethane.ct 84.7 +methyl_propyl_sulfide.ct 95.5 +diethyl_sulfide.ct 92 +diethyl_disulfide.ct 154 +1,1-bis(methylthio)ethane.ct 156 +ethylthiomethylthiomethane.ct 166 +1,2-bis(methylthio)ethane.ct 183 +butyl_methyl_ether.ct 70.3 +ethyl_propyl_ether.ct 63.6 +ethyl_isopropyl_ether.ct 52.5 +isobutyl_methyl_ether.ct 59 +sec-butyl_methyl_ether.ct 59.5 +diethoxymethane.ct 88 +2,2-dimethoxypropane.ct 83 +1,3-dimethoxypropane.ct 104.5 +1-ethoxy-2-methoxyethane.ct 102 +1,2-dimethoxypropane.ct 92 +ethyl_isopropyl_sulfide.ct 107.4 +butyl_methyl_sulfide.ct 123.2 +isobutyl_methyl_sulfide.ct 112.5 +ethyl_propyl_sulfide.ct 118.5 +ethyl_propyl_disulfide.ct 173.7 +ethyl_isopropyl_disulfide.ct 165.5 +bis(ethylthio)methane.ct 181 +methyl_pentyl_ether.ct 99.5 +ethyl_butyl_ether.ct 92.3 +dipropyl_ether.ct 90.1 +isopropyl_propyl_ether.ct 80.2 +ethyl_isobutyl_ether.ct 82 +isopentyl_methyl_ether.ct 91.2 +ethyl_sec-butyl_ether.ct 81.2 +methyl_1-methylbutyl_ether.ct 93 +diisopropyl_ether.ct 69 +methyl_tert-pentyl_ether.ct 86.3 +1,2-dimethylpropyl_methyl_ether.ct 82 +1,1-diethoxyethane.ct 103 +1,1-dimethoxy-2-methylpropane.ct 103.5 +2-ethoxy-2-methoxypropane.ct 96 +1,1-dimethoxybutane.ct 112 +1,4-dimethoxybutane.ct 132.5 +1,2-diethoxyethane.ct 123.5 +1,3-dimethoxybutane.ct 120.3 +methyl_pentyl_sulfide.ct 145 +butyl_ethyl_sulfide.ct 144.2 +dipropyl_sulfide.ct 142.8 +isopropyl_propyl_sulfide.ct 132 +ethyl_isobutyl_sulfide.ct 134.2 +isopentyl_methyl_sulfide.ct 137 +sec-butyl_ethyl_sulfide.ct 133.6 +tert-butyl_ethyl_sulfide.ct 120.4 +diisopropyl_sulfide.ct 120 +1-ethylpropyl_methyl_sulfide.ct 137 +dipropyl_disulfide.ct 195.8 +diisopropyl_disulfide.ct 177.2 +sec-butyl_ethyl_disulfide.ct 181 +isopropyl_propyl_disulfide.ct 185.9 +tert-butyl_ethyl_disulfide.ct 175.7 +1,2-bis(ethylthio)ethane.ct 211 +hexyl_methyl_ether.ct 125 +ethyl_pentyl_ether.ct 118 +butyl_propyl_ether.ct 117.1 +butyl_isopropyl_ether.ct 107 +isobutyl_propyl_ether.ct 102.5 +ethyl_isopentyl_ether.ct 112 +tert-butyl_propyl_ether.ct 97.4 +2,2-dimethylpropyl_ethyl_ether.ct 91.5 +ethyl_1-methylbutyl_ether.ct 106.5 +ethyl_tert-pentyl_ether.ct 101 +1,2-dimethylpropyl_ethyl_ether.ct 99.3 +ethyl_1-ethylpropyl_ether.ct 90 +dipropoxymethane.ct 137 +2,2-diethoxypropane.ct 114 +1-ethoxy-1-propoxyethane.ct 126 +1,1-diethoxypropane.ct 124 +1,3-diethoxypropane.ct 140.5 +1-ethoxy-4-methoxybutane.ct 146 +1,4-dimethoxypentane.ct 145 +1,3-dimethoxypentane.ct 141 +hexyl_methyl_sulfide.ct 171 +butyl_propyl_sulfide.ct 166 +isobutyl_propyl_sulfide.ct 155 +isobutyl_isopropyl_sulfide.ct 145 +ethyl_2-methylbutyl_sulfide.ct 159 +tert-butyl_propyl_sulfide.ct 138 +ethyl_isopentyl_sulfide.ct 159 +butyl_isopropyl_sulfide.ct 163.5 +1,3-bis(ethylthio)propane.ct 229.5 +dibutyl_ether.ct 142 +isopentyl_propyl_ether.ct 125 +butyl_isobutyl_ether.ct 132 +butyl_sec-butyl_ether.ct 130.5 +butyl_tert-butyl_ether.ct 125 +sec-butyl_isobutyl_ether.ct 122 +diisobutyl_ether.ct 122.2 +isobutyl_tert-butyl_ether.ct 112 +di-tert-butyl_ether.ct 106 +isopropyl_tert-pentyl_ether.ct 114.5 +heptyl_methyl_ether.ct 151 +1-ethylpropyl_propyl_ether.ct 128.5 +di-tert-butyl_peroxide.ct 109.5 +1,1-diisopropoxyethane.ct 126 +1,1-dipropoxyethane.ct 147 +2,4-dimethoxy-2-methylpentane.ct 147 +1,4-diethoxybutane.ct 165 +dibutylsulfide.ct 188.9 +diisobutyl_sulfide.ct 170 +butyl_isobutyl_sulfide.ct 178 +di-tert-butyl_sulfide.ct 148.5 +di-sec-butyl_sulfide.ct 165 +butyl_sec-butyl_sulfide.ct 177 +sec-butyl_isobutyl_sulfide.ct 167 +dibutyl_disulfide.ct 226 +diisobutyl_disulfide.ct 215 +di-tert-butyl_disulfide.ct 201 +1,1-bis(isopropylthio)ethane.ct 205 +1-ethyl-1,3-dimethylbutyl_methyl_ether.ct 151.5 +ethyl_heptyl_ether.ct 165.5 +butyl_isopentyl_ether.ct 157 +tert-butyl_isopentyl_ether.ct 139 +butyl_pentyl_ether.ct 163 +isobutyl_isopentyl_ether.ct 139 +methyl_1-methylheptyl_ether.ct 162 +methyl_octyl_ether.ct 173 +2-ethylhexyl_methyl_ether.ct 159.5 +methyl_1,1,4-trimethylpentyl_ether.ct 159.5 +3,5-dimethylhexyl_methyl_ether.ct 155.5 +ethyl_1,1,3-trimethylbutyl_ether.ct 141 +tert-butyl_tert-pentyl_peroxide.ct 126 +1,1-dimethoxy-2,2-dimethylpentane.ct 164 +1,1-dipropoxypropane.ct 166.5 +1,1-diisopropoxypropane.ct 146 +1,3-dipropoxypropane.ct 165 +1,3-diisopropoxypropane.ct 159 +ethyl_heptyl_sulfide.ct 195 +methyl_octyl_sulfide.ct 218 +bis(butylthio)methane.ct 250 +2,2-bis(propylthio)propane.ct 235 +ethyl_octyl_ether.ct 186.5 +bis(1-ethylpropyl)_ether.ct 162 +bis(1-methylbutyl)_ether.ct 162 +diisopentyl_ether.ct 173.2 +dipentyl_ether.ct 186.8 +isopropyl_heptyl_ether.ct 173 +heptyl_propyl_ether.ct 187 +isopentyl_pentyl_ether.ct 174 +methyl_1-methyloctyl_ether.ct 188.5 +di-tert-pentyl_sulfide.ct 199 +diisopentyl_sulfide.ct 215 +isobutyl_4-methylpentyl_sulfide.ct 216 +methyl_nonyl_sulfide.ct 240 diff --git a/datasets/Monoterpenoides/1.ct b/datasets/Monoterpenoides/1.ct new file mode 100644 index 0000000..e9f0425 --- /dev/null +++ b/datasets/Monoterpenoides/1.ct @@ -0,0 +1,26 @@ + + 12 12 + -5.0223 0.0320 0.0000 O + -5.7368 0.4445 0.0000 C + -5.7368 1.2695 0.0000 C + -4.3079 1.2695 0.0000 C + -4.3079 0.4445 0.0000 C + -3.5934 0.0320 0.0000 C + -3.5934 0.8570 0.0000 C + -2.8789 0.4445 0.0000 C + -6.4512 0.0320 0.0000 C + -7.1657 0.4445 0.0000 C + -6.4513 -0.7930 0.0000 C + -7.1657 -1.2055 0.0000 O + 1 2 1 1 + 1 5 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 5 7 1 1 + 7 8 2 2 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 + 11 12 1 1 diff --git a/datasets/Monoterpenoides/1.gxl b/datasets/Monoterpenoides/1.gxl new file mode 100644 index 0000000..9e853c7 --- /dev/null +++ b/datasets/Monoterpenoides/1.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/10.ct b/datasets/Monoterpenoides/10.ct new file mode 100644 index 0000000..ed25f3b --- /dev/null +++ b/datasets/Monoterpenoides/10.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -5.5581 2.2982 0.0000 C + -4.1291 -1.8268 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 1 1 + 7 8 2 2 + 8 9 1 1 + 8 10 1 1 + 2 11 1 1 + 10 12 2 2 diff --git a/datasets/Monoterpenoides/10.gxl b/datasets/Monoterpenoides/10.gxl new file mode 100644 index 0000000..f9cf8f8 --- /dev/null +++ b/datasets/Monoterpenoides/10.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/100.ct b/datasets/Monoterpenoides/100.ct new file mode 100644 index 0000000..b6241d6 --- /dev/null +++ b/datasets/Monoterpenoides/100.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.1159 5.2098 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/100.gxl b/datasets/Monoterpenoides/100.gxl new file mode 100644 index 0000000..19ef60e --- /dev/null +++ b/datasets/Monoterpenoides/100.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/101.ct b/datasets/Monoterpenoides/101.ct new file mode 100644 index 0000000..7ca7d90 --- /dev/null +++ b/datasets/Monoterpenoides/101.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.5448 4.3848 0.0000 C + -6.1159 4.3848 0.0000 O + -8.2593 2.3223 0.0000 C + -8.2593 1.4973 0.0000 C + -8.9738 2.7348 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 1 8 1 1 + 3 9 1 1 + 9 10 2 2 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/101.gxl b/datasets/Monoterpenoides/101.gxl new file mode 100644 index 0000000..4e5c69e --- /dev/null +++ b/datasets/Monoterpenoides/101.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/102.ct b/datasets/Monoterpenoides/102.ct new file mode 100644 index 0000000..25507fe --- /dev/null +++ b/datasets/Monoterpenoides/102.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8305 4.9206 0.0000 C + -8.2593 2.3223 0.0000 C + -8.2593 1.4973 0.0000 C + -8.9738 2.7348 0.0000 O + -8.9738 1.9098 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/102.gxl b/datasets/Monoterpenoides/102.gxl new file mode 100644 index 0000000..87cf136 --- /dev/null +++ b/datasets/Monoterpenoides/102.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/103.ct b/datasets/Monoterpenoides/103.ct new file mode 100644 index 0000000..44a733e --- /dev/null +++ b/datasets/Monoterpenoides/103.ct @@ -0,0 +1,22 @@ + + 10 10 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8305 4.9206 0.0000 C + -8.2593 2.3223 0.0000 C + -8.2593 1.4973 0.0000 C + -8.9291 2.8473 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 8 9 2 2 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/103.gxl b/datasets/Monoterpenoides/103.gxl new file mode 100644 index 0000000..92a2eb3 --- /dev/null +++ b/datasets/Monoterpenoides/103.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/104.ct b/datasets/Monoterpenoides/104.ct new file mode 100644 index 0000000..72f0724 --- /dev/null +++ b/datasets/Monoterpenoides/104.ct @@ -0,0 +1,23 @@ + + 10 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 2 2 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/104.gxl b/datasets/Monoterpenoides/104.gxl new file mode 100644 index 0000000..15bc9b4 --- /dev/null +++ b/datasets/Monoterpenoides/104.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/105.ct b/datasets/Monoterpenoides/105.ct new file mode 100644 index 0000000..e5d9ea8 --- /dev/null +++ b/datasets/Monoterpenoides/105.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.1159 5.2098 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/105.gxl b/datasets/Monoterpenoides/105.gxl new file mode 100644 index 0000000..86ed4c9 --- /dev/null +++ b/datasets/Monoterpenoides/105.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/106.ct b/datasets/Monoterpenoides/106.ct new file mode 100644 index 0000000..3346095 --- /dev/null +++ b/datasets/Monoterpenoides/106.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -5.4014 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 2 2 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/106.gxl b/datasets/Monoterpenoides/106.gxl new file mode 100644 index 0000000..f2e934a --- /dev/null +++ b/datasets/Monoterpenoides/106.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/107.ct b/datasets/Monoterpenoides/107.ct new file mode 100644 index 0000000..4fff0e5 --- /dev/null +++ b/datasets/Monoterpenoides/107.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -5.4014 3.9723 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/107.gxl b/datasets/Monoterpenoides/107.gxl new file mode 100644 index 0000000..a5452bf --- /dev/null +++ b/datasets/Monoterpenoides/107.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/108.ct b/datasets/Monoterpenoides/108.ct new file mode 100644 index 0000000..7d6d0b5 --- /dev/null +++ b/datasets/Monoterpenoides/108.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.0938 4.5518 0.0000 O + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -7.4138 4.5557 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/108.gxl b/datasets/Monoterpenoides/108.gxl new file mode 100644 index 0000000..cbf3787 --- /dev/null +++ b/datasets/Monoterpenoides/108.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/109.ct b/datasets/Monoterpenoides/109.ct new file mode 100644 index 0000000..8ed6d71 --- /dev/null +++ b/datasets/Monoterpenoides/109.ct @@ -0,0 +1,23 @@ + + 10 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/109.gxl b/datasets/Monoterpenoides/109.gxl new file mode 100644 index 0000000..0aee5dc --- /dev/null +++ b/datasets/Monoterpenoides/109.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/11.ct b/datasets/Monoterpenoides/11.ct new file mode 100644 index 0000000..8e14548 --- /dev/null +++ b/datasets/Monoterpenoides/11.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -5.5581 2.2982 0.0000 C + -3.4146 0.2357 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 8 10 1 1 + 2 11 1 1 + 6 12 2 2 diff --git a/datasets/Monoterpenoides/11.gxl b/datasets/Monoterpenoides/11.gxl new file mode 100644 index 0000000..23e2d7a --- /dev/null +++ b/datasets/Monoterpenoides/11.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/110.ct b/datasets/Monoterpenoides/110.ct new file mode 100644 index 0000000..8e0f0c6 --- /dev/null +++ b/datasets/Monoterpenoides/110.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.1159 5.2098 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/110.gxl b/datasets/Monoterpenoides/110.gxl new file mode 100644 index 0000000..3c7a57c --- /dev/null +++ b/datasets/Monoterpenoides/110.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/111.ct b/datasets/Monoterpenoides/111.ct new file mode 100644 index 0000000..6aead58 --- /dev/null +++ b/datasets/Monoterpenoides/111.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -5.4014 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/111.gxl b/datasets/Monoterpenoides/111.gxl new file mode 100644 index 0000000..56f9573 --- /dev/null +++ b/datasets/Monoterpenoides/111.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/112.ct b/datasets/Monoterpenoides/112.ct new file mode 100644 index 0000000..961b4d0 --- /dev/null +++ b/datasets/Monoterpenoides/112.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.0938 4.5518 0.0000 O + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -7.4138 4.5557 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/112.gxl b/datasets/Monoterpenoides/112.gxl new file mode 100644 index 0000000..8246d32 --- /dev/null +++ b/datasets/Monoterpenoides/112.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/113.ct b/datasets/Monoterpenoides/113.ct new file mode 100644 index 0000000..17fbbfc --- /dev/null +++ b/datasets/Monoterpenoides/113.ct @@ -0,0 +1,26 @@ + + 11 13 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.0938 4.5518 0.0000 O + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -7.4138 4.5557 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 1 11 1 1 + 6 7 1 1 diff --git a/datasets/Monoterpenoides/113.gxl b/datasets/Monoterpenoides/113.gxl new file mode 100644 index 0000000..eca8275 --- /dev/null +++ b/datasets/Monoterpenoides/113.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/114.ct b/datasets/Monoterpenoides/114.ct new file mode 100644 index 0000000..52e1c5a --- /dev/null +++ b/datasets/Monoterpenoides/114.ct @@ -0,0 +1,22 @@ + + 10 10 + -8.4598 6.8295 0.0000 C + -9.1743 6.4170 0.0000 C + -9.1743 5.5920 0.0000 C + -8.4598 5.1794 0.0000 C + -7.7454 5.5920 0.0000 C + -7.7454 6.4170 0.0000 C + -8.4598 7.6545 0.0000 C + -9.8888 5.1795 0.0000 C + -9.8888 4.3545 0.0000 C + -10.6032 5.5920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/114.gxl b/datasets/Monoterpenoides/114.gxl new file mode 100644 index 0000000..226f26a --- /dev/null +++ b/datasets/Monoterpenoides/114.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/115.ct b/datasets/Monoterpenoides/115.ct new file mode 100644 index 0000000..97d5606 --- /dev/null +++ b/datasets/Monoterpenoides/115.ct @@ -0,0 +1,22 @@ + + 10 10 + -8.4598 6.8295 0.0000 C + -9.1743 6.4170 0.0000 C + -9.1743 5.5920 0.0000 C + -8.4598 5.1794 0.0000 C + -7.7454 5.5920 0.0000 C + -7.7454 6.4170 0.0000 C + -8.4598 7.6545 0.0000 C + -9.8888 5.1795 0.0000 C + -9.8888 4.3545 0.0000 C + -10.6032 5.5920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 8 9 2 2 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/115.gxl b/datasets/Monoterpenoides/115.gxl new file mode 100644 index 0000000..2633447 --- /dev/null +++ b/datasets/Monoterpenoides/115.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/116.ct b/datasets/Monoterpenoides/116.ct new file mode 100644 index 0000000..b3b878f --- /dev/null +++ b/datasets/Monoterpenoides/116.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/116.gxl b/datasets/Monoterpenoides/116.gxl new file mode 100644 index 0000000..0f7ecad --- /dev/null +++ b/datasets/Monoterpenoides/116.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/117.ct b/datasets/Monoterpenoides/117.ct new file mode 100644 index 0000000..69f4c0a --- /dev/null +++ b/datasets/Monoterpenoides/117.ct @@ -0,0 +1,27 @@ + + 12 13 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -5.8036 4.4402 0.0000 O + -5.4014 3.9723 0.0000 O + -7.6273 4.6293 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 + 1 12 1 1 diff --git a/datasets/Monoterpenoides/117.gxl b/datasets/Monoterpenoides/117.gxl new file mode 100644 index 0000000..57ab332 --- /dev/null +++ b/datasets/Monoterpenoides/117.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/118.ct b/datasets/Monoterpenoides/118.ct new file mode 100644 index 0000000..948c37a --- /dev/null +++ b/datasets/Monoterpenoides/118.ct @@ -0,0 +1,23 @@ + + 10 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/118.gxl b/datasets/Monoterpenoides/118.gxl new file mode 100644 index 0000000..a8aea06 --- /dev/null +++ b/datasets/Monoterpenoides/118.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/119.ct b/datasets/Monoterpenoides/119.ct new file mode 100644 index 0000000..d562b9f --- /dev/null +++ b/datasets/Monoterpenoides/119.ct @@ -0,0 +1,23 @@ + + 10 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/119.gxl b/datasets/Monoterpenoides/119.gxl new file mode 100644 index 0000000..f5eac91 --- /dev/null +++ b/datasets/Monoterpenoides/119.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/12.ct b/datasets/Monoterpenoides/12.ct new file mode 100644 index 0000000..fced556 --- /dev/null +++ b/datasets/Monoterpenoides/12.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -5.5581 2.2982 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 2 2 + 7 8 1 1 + 8 9 1 1 + 8 10 2 2 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/12.gxl b/datasets/Monoterpenoides/12.gxl new file mode 100644 index 0000000..788fd83 --- /dev/null +++ b/datasets/Monoterpenoides/12.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/120.ct b/datasets/Monoterpenoides/120.ct new file mode 100644 index 0000000..7087bda --- /dev/null +++ b/datasets/Monoterpenoides/120.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 2.3223 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/120.gxl b/datasets/Monoterpenoides/120.gxl new file mode 100644 index 0000000..1a03494 --- /dev/null +++ b/datasets/Monoterpenoides/120.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/121.ct b/datasets/Monoterpenoides/121.ct new file mode 100644 index 0000000..6ac0516 --- /dev/null +++ b/datasets/Monoterpenoides/121.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 2.3223 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/121.gxl b/datasets/Monoterpenoides/121.gxl new file mode 100644 index 0000000..4fa7a1a --- /dev/null +++ b/datasets/Monoterpenoides/121.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/122.ct b/datasets/Monoterpenoides/122.ct new file mode 100644 index 0000000..dde1781 --- /dev/null +++ b/datasets/Monoterpenoides/122.ct @@ -0,0 +1,23 @@ + + 10 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/122.gxl b/datasets/Monoterpenoides/122.gxl new file mode 100644 index 0000000..8b11eab --- /dev/null +++ b/datasets/Monoterpenoides/122.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/123.ct b/datasets/Monoterpenoides/123.ct new file mode 100644 index 0000000..4bcf49a --- /dev/null +++ b/datasets/Monoterpenoides/123.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 2.3223 0.0000 O + -8.2593 2.3223 0.0000 C + -8.2593 1.4973 0.0000 C + -8.9737 2.7348 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 5 8 2 2 + 3 9 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/123.gxl b/datasets/Monoterpenoides/123.gxl new file mode 100644 index 0000000..fa867b1 --- /dev/null +++ b/datasets/Monoterpenoides/123.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/124.ct b/datasets/Monoterpenoides/124.ct new file mode 100644 index 0000000..93ba426 --- /dev/null +++ b/datasets/Monoterpenoides/124.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 2.3223 0.0000 O + -8.2593 2.3223 0.0000 C + -8.2593 1.4973 0.0000 C + -8.9737 2.7348 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 5 8 2 2 + 3 9 1 1 + 9 10 2 2 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/124.gxl b/datasets/Monoterpenoides/124.gxl new file mode 100644 index 0000000..f6894a1 --- /dev/null +++ b/datasets/Monoterpenoides/124.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/125.ct b/datasets/Monoterpenoides/125.ct new file mode 100644 index 0000000..29ebce8 --- /dev/null +++ b/datasets/Monoterpenoides/125.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 2.3223 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/125.gxl b/datasets/Monoterpenoides/125.gxl new file mode 100644 index 0000000..de7961d --- /dev/null +++ b/datasets/Monoterpenoides/125.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/126.ct b/datasets/Monoterpenoides/126.ct new file mode 100644 index 0000000..1055176 --- /dev/null +++ b/datasets/Monoterpenoides/126.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/126.gxl b/datasets/Monoterpenoides/126.gxl new file mode 100644 index 0000000..d5b8787 --- /dev/null +++ b/datasets/Monoterpenoides/126.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/127.ct b/datasets/Monoterpenoides/127.ct new file mode 100644 index 0000000..4347723 --- /dev/null +++ b/datasets/Monoterpenoides/127.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/127.gxl b/datasets/Monoterpenoides/127.gxl new file mode 100644 index 0000000..f42eaa3 --- /dev/null +++ b/datasets/Monoterpenoides/127.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/128.ct b/datasets/Monoterpenoides/128.ct new file mode 100644 index 0000000..65ed07d --- /dev/null +++ b/datasets/Monoterpenoides/128.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -8.2593 2.3223 0.0000 C + -8.2593 1.4973 0.0000 C + -8.9737 2.7348 0.0000 C + -5.4014 2.3223 0.0000 O + -6.8304 4.7973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 7 8 1 1 + 7 9 1 1 + 5 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/128.gxl b/datasets/Monoterpenoides/128.gxl new file mode 100644 index 0000000..5ad1fbf --- /dev/null +++ b/datasets/Monoterpenoides/128.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/129.ct b/datasets/Monoterpenoides/129.ct new file mode 100644 index 0000000..d3687d0 --- /dev/null +++ b/datasets/Monoterpenoides/129.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -5.4014 2.3223 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/129.gxl b/datasets/Monoterpenoides/129.gxl new file mode 100644 index 0000000..04fa4cf --- /dev/null +++ b/datasets/Monoterpenoides/129.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/13.ct b/datasets/Monoterpenoides/13.ct new file mode 100644 index 0000000..4b179da --- /dev/null +++ b/datasets/Monoterpenoides/13.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 O + -5.5581 2.2982 0.0000 C + -5.5581 -0.1768 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 2 2 + 7 8 1 1 + 8 9 1 1 + 8 10 1 1 + 2 11 1 1 + 8 12 1 1 diff --git a/datasets/Monoterpenoides/13.gxl b/datasets/Monoterpenoides/13.gxl new file mode 100644 index 0000000..4d0d13b --- /dev/null +++ b/datasets/Monoterpenoides/13.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/130.ct b/datasets/Monoterpenoides/130.ct new file mode 100644 index 0000000..c040f24 --- /dev/null +++ b/datasets/Monoterpenoides/130.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/130.gxl b/datasets/Monoterpenoides/130.gxl new file mode 100644 index 0000000..2bfe8ac --- /dev/null +++ b/datasets/Monoterpenoides/130.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/131.ct b/datasets/Monoterpenoides/131.ct new file mode 100644 index 0000000..7483578 --- /dev/null +++ b/datasets/Monoterpenoides/131.ct @@ -0,0 +1,25 @@ + + 11 12 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -7.6343 2.0545 0.0000 C + -8.4312 1.8409 0.0000 C + -7.6343 1.2295 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 3.9723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 2 11 2 2 diff --git a/datasets/Monoterpenoides/131.gxl b/datasets/Monoterpenoides/131.gxl new file mode 100644 index 0000000..b208607 --- /dev/null +++ b/datasets/Monoterpenoides/131.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/132.ct b/datasets/Monoterpenoides/132.ct new file mode 100644 index 0000000..1b29d47 --- /dev/null +++ b/datasets/Monoterpenoides/132.ct @@ -0,0 +1,23 @@ + + 11 10 + -11.2054 5.6250 0.0000 C + -10.4909 6.0375 0.0000 C + -9.7764 5.6250 0.0000 C + -9.0619 6.0375 0.0000 C + -9.0688 5.2329 0.0000 C + -10.4909 5.2125 0.0000 C + -8.3475 5.6250 0.0000 C + -9.0619 6.8625 0.0000 O + -7.6330 6.0375 0.0000 C + -6.9185 5.6250 0.0000 C + -7.6330 6.8625 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 3 5 1 1 + 3 6 1 1 + 4 7 1 1 + 4 8 2 2 + 7 9 1 1 + 9 10 2 2 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/132.gxl b/datasets/Monoterpenoides/132.gxl new file mode 100644 index 0000000..f595441 --- /dev/null +++ b/datasets/Monoterpenoides/132.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/133.ct b/datasets/Monoterpenoides/133.ct new file mode 100644 index 0000000..ed11496 --- /dev/null +++ b/datasets/Monoterpenoides/133.ct @@ -0,0 +1,21 @@ + + 10 9 + -11.2054 5.6250 0.0000 C + -10.4909 6.0375 0.0000 C + -9.7764 5.6250 0.0000 C + -9.0619 6.0375 0.0000 C + -9.0688 5.2329 0.0000 C + -10.4909 5.2125 0.0000 C + -8.3475 5.6250 0.0000 C + -7.6330 6.0375 0.0000 C + -6.9185 5.6250 0.0000 C + -7.6330 6.8625 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 3 5 1 1 + 3 6 1 1 + 4 7 2 2 + 7 8 1 1 + 8 9 2 2 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/133.gxl b/datasets/Monoterpenoides/133.gxl new file mode 100644 index 0000000..982944b --- /dev/null +++ b/datasets/Monoterpenoides/133.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/134.ct b/datasets/Monoterpenoides/134.ct new file mode 100644 index 0000000..11f2efb --- /dev/null +++ b/datasets/Monoterpenoides/134.ct @@ -0,0 +1,24 @@ + + 11 11 + -8.9286 6.6956 0.0000 C + -9.6430 6.2830 0.0000 C + -9.6430 5.4580 0.0000 C + -8.9286 5.0455 0.0000 C + -8.2141 5.4580 0.0000 C + -8.2141 6.2830 0.0000 C + -10.3575 5.0455 0.0000 C + -7.4996 5.0455 0.0000 C + -8.2141 4.6330 0.0000 C + -10.3575 6.6955 0.0000 C + -11.0720 6.2830 0.0000 O + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 3 7 1 1 + 5 8 1 1 + 5 9 1 1 + 2 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/134.gxl b/datasets/Monoterpenoides/134.gxl new file mode 100644 index 0000000..8aaaa0a --- /dev/null +++ b/datasets/Monoterpenoides/134.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/135.ct b/datasets/Monoterpenoides/135.ct new file mode 100644 index 0000000..d203d68 --- /dev/null +++ b/datasets/Monoterpenoides/135.ct @@ -0,0 +1,25 @@ + + 12 11 + -8.9286 6.6956 0.0000 C + -9.6430 6.2830 0.0000 C + -9.6430 5.4580 0.0000 C + -8.9286 5.0455 0.0000 C + -8.2141 6.2830 0.0000 C + -10.3575 6.6955 0.0000 C + -11.0720 6.2830 0.0000 O + -8.9286 7.5206 0.0000 C + -8.9286 4.2205 0.0000 C + -8.2141 3.8080 0.0000 O + -9.6430 3.8080 0.0000 C + -8.9286 3.3955 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 1 5 1 1 + 2 6 1 1 + 6 7 1 1 + 1 8 2 2 + 4 9 1 1 + 9 10 1 1 + 9 11 1 1 + 9 12 1 1 diff --git a/datasets/Monoterpenoides/135.gxl b/datasets/Monoterpenoides/135.gxl new file mode 100644 index 0000000..1029b35 --- /dev/null +++ b/datasets/Monoterpenoides/135.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/136.ct b/datasets/Monoterpenoides/136.ct new file mode 100644 index 0000000..c5181d1 --- /dev/null +++ b/datasets/Monoterpenoides/136.ct @@ -0,0 +1,23 @@ + + 11 10 + -8.9286 6.6956 0.0000 C + -9.6430 6.2830 0.0000 C + -9.6430 5.4580 0.0000 C + -8.9286 5.0455 0.0000 C + -8.2141 6.2830 0.0000 C + -10.3575 6.6955 0.0000 C + -11.0720 6.2830 0.0000 O + -8.9286 7.5206 0.0000 C + -8.9286 4.2205 0.0000 C + -8.2141 3.8080 0.0000 C + -9.6430 3.8080 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 1 5 1 1 + 2 6 1 1 + 6 7 1 1 + 1 8 2 2 + 4 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/136.gxl b/datasets/Monoterpenoides/136.gxl new file mode 100644 index 0000000..dfc959e --- /dev/null +++ b/datasets/Monoterpenoides/136.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/137.ct b/datasets/Monoterpenoides/137.ct new file mode 100644 index 0000000..3dc56f1 --- /dev/null +++ b/datasets/Monoterpenoides/137.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.4687 7.4554 0.0000 C + -9.7543 7.8679 0.0000 C + -9.0398 7.4554 0.0000 C + -8.3253 7.8679 0.0000 C + -7.6109 7.4554 0.0000 C + -9.7543 7.0429 0.0000 C + -8.3253 7.0429 0.0000 C + -6.8964 7.8679 0.0000 C + -6.1819 7.4554 0.0000 C + -6.8964 8.6929 0.0000 C + -8.3253 6.2179 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 3 6 1 1 + 3 7 1 1 + 5 8 2 2 + 8 9 1 1 + 8 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/137.gxl b/datasets/Monoterpenoides/137.gxl new file mode 100644 index 0000000..ec9ef58 --- /dev/null +++ b/datasets/Monoterpenoides/137.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/138.ct b/datasets/Monoterpenoides/138.ct new file mode 100644 index 0000000..4ce231d --- /dev/null +++ b/datasets/Monoterpenoides/138.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.4687 7.4554 0.0000 C + -9.7543 7.8679 0.0000 C + -9.0398 7.4554 0.0000 C + -8.3253 7.8679 0.0000 C + -7.6109 7.4554 0.0000 C + -9.7543 7.0429 0.0000 C + -8.3253 7.0429 0.0000 C + -6.8964 7.8679 0.0000 C + -6.1819 7.4554 0.0000 C + -6.8964 8.6929 0.0000 C + -8.3253 8.6929 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 3 6 1 1 + 3 7 1 1 + 5 8 2 2 + 8 9 1 1 + 8 10 1 1 + 4 11 2 2 diff --git a/datasets/Monoterpenoides/138.gxl b/datasets/Monoterpenoides/138.gxl new file mode 100644 index 0000000..cf28cae --- /dev/null +++ b/datasets/Monoterpenoides/138.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/139.ct b/datasets/Monoterpenoides/139.ct new file mode 100644 index 0000000..6da5f7a --- /dev/null +++ b/datasets/Monoterpenoides/139.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.4687 7.4554 0.0000 C + -9.7543 7.8679 0.0000 C + -9.0398 7.4554 0.0000 C + -8.3253 7.8679 0.0000 C + -7.6109 7.4554 0.0000 C + -9.7543 7.0429 0.0000 C + -8.3253 7.0429 0.0000 C + -6.8964 7.8679 0.0000 C + -6.1819 7.4554 0.0000 C + -6.8964 8.6929 0.0000 C + -8.3253 8.6929 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 3 6 1 1 + 3 7 1 1 + 5 8 2 2 + 8 9 1 1 + 8 10 1 1 + 4 11 1 1 diff --git a/datasets/Monoterpenoides/139.gxl b/datasets/Monoterpenoides/139.gxl new file mode 100644 index 0000000..7f4d2cf --- /dev/null +++ b/datasets/Monoterpenoides/139.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/14.ct b/datasets/Monoterpenoides/14.ct new file mode 100644 index 0000000..0b9ec91 --- /dev/null +++ b/datasets/Monoterpenoides/14.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -5.5581 2.2982 0.0000 C + -4.1291 -1.0018 0.0000 C + -4.1291 -0.1768 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 2 10 1 1 + 8 11 2 2 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/14.gxl b/datasets/Monoterpenoides/14.gxl new file mode 100644 index 0000000..b442727 --- /dev/null +++ b/datasets/Monoterpenoides/14.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/140.ct b/datasets/Monoterpenoides/140.ct new file mode 100644 index 0000000..43e6a5a --- /dev/null +++ b/datasets/Monoterpenoides/140.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.4687 7.4554 0.0000 C + -9.7543 7.8679 0.0000 C + -9.0398 7.4554 0.0000 C + -8.3253 7.8679 0.0000 C + -7.6109 7.4554 0.0000 C + -9.7543 7.0429 0.0000 C + -8.3253 7.0429 0.0000 C + -6.8964 7.8679 0.0000 C + -6.1819 7.4554 0.0000 C + -6.8964 8.6929 0.0000 O + -6.1819 8.2804 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 3 6 1 1 + 3 7 1 1 + 5 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/140.gxl b/datasets/Monoterpenoides/140.gxl new file mode 100644 index 0000000..b7091e2 --- /dev/null +++ b/datasets/Monoterpenoides/140.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/141.ct b/datasets/Monoterpenoides/141.ct new file mode 100644 index 0000000..571fc1b --- /dev/null +++ b/datasets/Monoterpenoides/141.ct @@ -0,0 +1,24 @@ + + 11 11 + -7.9688 9.1964 0.0000 C + -8.5521 8.6131 0.0000 C + -7.3854 8.6131 0.0000 C + -8.6832 9.6089 0.0000 C + -7.2543 9.6089 0.0000 C + -8.9646 7.8986 0.0000 C + -9.7896 7.8986 0.0000 O + -6.9729 7.8986 0.0000 C + -6.1479 7.8986 0.0000 C + -5.7354 7.1841 0.0000 C + -5.7354 8.6131 0.0000 C + 1 2 1 1 + 1 3 1 1 + 2 3 1 1 + 1 4 1 1 + 1 5 1 1 + 2 6 1 1 + 6 7 1 1 + 3 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/141.gxl b/datasets/Monoterpenoides/141.gxl new file mode 100644 index 0000000..6513781 --- /dev/null +++ b/datasets/Monoterpenoides/141.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/142.ct b/datasets/Monoterpenoides/142.ct new file mode 100644 index 0000000..d95305a --- /dev/null +++ b/datasets/Monoterpenoides/142.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.9688 9.1964 0.0000 C + -8.5521 8.6131 0.0000 C + -7.3854 8.6131 0.0000 C + -8.6832 9.6089 0.0000 C + -7.2543 9.6089 0.0000 C + -8.9646 7.8986 0.0000 C + -9.7896 7.8986 0.0000 O + -6.9729 7.8986 0.0000 C + -6.1479 7.8986 0.0000 C + -5.7354 7.1841 0.0000 C + -5.7354 8.6131 0.0000 C + -9.1781 7.1017 0.0000 O + 1 2 1 1 + 1 3 1 1 + 2 3 1 1 + 1 4 1 1 + 1 5 1 1 + 2 6 1 1 + 6 7 1 1 + 3 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 + 6 12 2 2 diff --git a/datasets/Monoterpenoides/142.gxl b/datasets/Monoterpenoides/142.gxl new file mode 100644 index 0000000..5af60a9 --- /dev/null +++ b/datasets/Monoterpenoides/142.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/143.ct b/datasets/Monoterpenoides/143.ct new file mode 100644 index 0000000..c249b3c --- /dev/null +++ b/datasets/Monoterpenoides/143.ct @@ -0,0 +1,30 @@ + + 14 14 + -7.9688 9.1964 0.0000 C + -8.5521 8.6131 0.0000 C + -7.3854 8.6131 0.0000 C + -8.6832 9.6089 0.0000 C + -7.2543 9.6089 0.0000 C + -8.9646 7.8986 0.0000 C + -9.7896 7.8986 0.0000 O + -6.9729 7.8986 0.0000 C + -6.1479 7.8986 0.0000 C + -5.7354 7.1841 0.0000 C + -5.7354 8.6131 0.0000 C + -9.1781 7.1017 0.0000 O + -4.9104 7.1841 0.0000 O + -6.1479 6.4697 0.0000 O + 1 2 1 1 + 1 3 1 1 + 2 3 1 1 + 1 4 1 1 + 1 5 1 1 + 2 6 1 1 + 6 7 1 1 + 3 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 + 6 12 2 2 + 10 13 2 2 + 10 14 1 1 diff --git a/datasets/Monoterpenoides/143.gxl b/datasets/Monoterpenoides/143.gxl new file mode 100644 index 0000000..5ade368 --- /dev/null +++ b/datasets/Monoterpenoides/143.gxl @@ -0,0 +1,91 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/144.ct b/datasets/Monoterpenoides/144.ct new file mode 100644 index 0000000..818031e --- /dev/null +++ b/datasets/Monoterpenoides/144.ct @@ -0,0 +1,25 @@ + + 12 11 + -10.2455 8.4598 0.0000 C + -9.5311 8.8723 0.0000 C + -10.9600 8.8723 0.0000 C + -8.8166 8.4598 0.0000 C + -9.5311 9.6973 0.0000 C + -8.1021 8.8723 0.0000 C + -7.3877 8.4598 0.0000 C + -8.1021 9.6973 0.0000 C + -8.8166 10.1098 0.0000 C + -10.2455 10.1098 0.0000 C + -6.6732 8.8723 0.0000 O + -7.3877 7.6348 0.0000 O + 1 2 1 1 + 1 3 2 2 + 2 4 1 1 + 2 5 1 1 + 4 6 2 2 + 6 7 1 1 + 6 8 1 1 + 5 9 1 1 + 5 10 2 2 + 7 11 2 2 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/144.gxl b/datasets/Monoterpenoides/144.gxl new file mode 100644 index 0000000..097a2f8 --- /dev/null +++ b/datasets/Monoterpenoides/144.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/145.ct b/datasets/Monoterpenoides/145.ct new file mode 100644 index 0000000..f5ca6b4 --- /dev/null +++ b/datasets/Monoterpenoides/145.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.2455 8.4598 0.0000 C + -9.5311 8.8723 0.0000 C + -10.9600 8.8723 0.0000 C + -8.8166 8.4598 0.0000 C + -9.5311 9.6973 0.0000 C + -8.1021 8.8723 0.0000 C + -7.3877 8.4598 0.0000 C + -8.1021 9.6973 0.0000 C + -8.8166 10.1098 0.0000 C + -10.2455 10.1098 0.0000 C + -7.3877 7.6348 0.0000 O + 1 2 1 1 + 1 3 2 2 + 2 4 1 1 + 2 5 1 1 + 4 6 2 2 + 6 7 1 1 + 6 8 1 1 + 5 9 1 1 + 5 10 2 2 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/145.gxl b/datasets/Monoterpenoides/145.gxl new file mode 100644 index 0000000..0f60701 --- /dev/null +++ b/datasets/Monoterpenoides/145.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/146.ct b/datasets/Monoterpenoides/146.ct new file mode 100644 index 0000000..c4e5982 --- /dev/null +++ b/datasets/Monoterpenoides/146.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.2455 8.4598 0.0000 C + -9.5311 8.8723 0.0000 C + -10.9600 8.8723 0.0000 C + -8.8166 8.4598 0.0000 C + -9.5311 9.6973 0.0000 C + -8.1021 8.8723 0.0000 C + -7.3877 8.4598 0.0000 C + -8.1021 9.6973 0.0000 C + -8.8166 10.1098 0.0000 C + -10.2455 10.1098 0.0000 C + -9.5311 10.5223 0.0000 O + 1 2 1 1 + 1 3 2 2 + 2 4 1 1 + 2 5 1 1 + 4 6 2 2 + 6 7 1 1 + 6 8 1 1 + 5 9 1 1 + 5 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/146.gxl b/datasets/Monoterpenoides/146.gxl new file mode 100644 index 0000000..4ce78c2 --- /dev/null +++ b/datasets/Monoterpenoides/146.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/147.ct b/datasets/Monoterpenoides/147.ct new file mode 100644 index 0000000..9b7a0e8 --- /dev/null +++ b/datasets/Monoterpenoides/147.ct @@ -0,0 +1,21 @@ + + 10 9 + -10.2455 8.4598 0.0000 C + -9.5311 8.8723 0.0000 C + -10.9600 8.8723 0.0000 C + -8.8166 8.4598 0.0000 C + -9.5311 9.6973 0.0000 C + -8.1021 8.8723 0.0000 C + -7.3877 8.4598 0.0000 C + -8.1021 9.6973 0.0000 C + -8.8166 10.1098 0.0000 C + -10.2455 10.1098 0.0000 C + 1 2 1 1 + 1 3 2 2 + 2 4 1 1 + 2 5 1 1 + 4 6 2 2 + 6 7 1 1 + 6 8 1 1 + 5 9 2 2 + 5 10 1 1 diff --git a/datasets/Monoterpenoides/147.gxl b/datasets/Monoterpenoides/147.gxl new file mode 100644 index 0000000..ead5b86 --- /dev/null +++ b/datasets/Monoterpenoides/147.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/148.ct b/datasets/Monoterpenoides/148.ct new file mode 100644 index 0000000..ab2e9ce --- /dev/null +++ b/datasets/Monoterpenoides/148.ct @@ -0,0 +1,27 @@ + + 13 12 + -10.2455 8.4598 0.0000 C + -9.5311 8.8723 0.0000 C + -10.9600 8.8723 0.0000 C + -8.8166 8.4598 0.0000 C + -9.5311 9.6973 0.0000 C + -8.1021 8.8723 0.0000 C + -7.3877 8.4598 0.0000 C + -8.1021 9.6973 0.0000 C + -8.8166 10.1098 0.0000 C + -10.2455 10.1098 0.0000 C + -10.2455 10.9348 0.0000 O + -10.9600 9.6973 0.0000 O + -11.6745 10.1098 0.0000 C + 1 2 1 1 + 1 3 2 2 + 2 4 1 1 + 2 5 1 1 + 4 6 2 2 + 6 7 1 1 + 6 8 1 1 + 5 9 1 1 + 5 10 1 1 + 10 11 2 2 + 10 12 1 1 + 12 13 1 1 diff --git a/datasets/Monoterpenoides/148.gxl b/datasets/Monoterpenoides/148.gxl new file mode 100644 index 0000000..b36987a --- /dev/null +++ b/datasets/Monoterpenoides/148.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +6 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/149.ct b/datasets/Monoterpenoides/149.ct new file mode 100644 index 0000000..440a353 --- /dev/null +++ b/datasets/Monoterpenoides/149.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -8.5041 8.3473 0.0000 O + -9.9330 9.1723 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 6 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/149.gxl b/datasets/Monoterpenoides/149.gxl new file mode 100644 index 0000000..0b69957 --- /dev/null +++ b/datasets/Monoterpenoides/149.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/15.ct b/datasets/Monoterpenoides/15.ct new file mode 100644 index 0000000..1d759e3 --- /dev/null +++ b/datasets/Monoterpenoides/15.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 O + -5.5581 2.2982 0.0000 C + -5.5581 -0.1768 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 1 1 + 8 10 1 1 + 2 11 1 1 + 8 12 1 1 diff --git a/datasets/Monoterpenoides/15.gxl b/datasets/Monoterpenoides/15.gxl new file mode 100644 index 0000000..c2925b4 --- /dev/null +++ b/datasets/Monoterpenoides/15.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/150.ct b/datasets/Monoterpenoides/150.ct new file mode 100644 index 0000000..a80b4d7 --- /dev/null +++ b/datasets/Monoterpenoides/150.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 C + -8.5041 6.6973 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/150.gxl b/datasets/Monoterpenoides/150.gxl new file mode 100644 index 0000000..ec2fe5b --- /dev/null +++ b/datasets/Monoterpenoides/150.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/151.ct b/datasets/Monoterpenoides/151.ct new file mode 100644 index 0000000..226d282 --- /dev/null +++ b/datasets/Monoterpenoides/151.ct @@ -0,0 +1,23 @@ + + 10 11 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/151.gxl b/datasets/Monoterpenoides/151.gxl new file mode 100644 index 0000000..45902ef --- /dev/null +++ b/datasets/Monoterpenoides/151.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/152.ct b/datasets/Monoterpenoides/152.ct new file mode 100644 index 0000000..c3118c2 --- /dev/null +++ b/datasets/Monoterpenoides/152.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 C + -8.5041 8.3473 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/152.gxl b/datasets/Monoterpenoides/152.gxl new file mode 100644 index 0000000..ce4757b --- /dev/null +++ b/datasets/Monoterpenoides/152.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/153.ct b/datasets/Monoterpenoides/153.ct new file mode 100644 index 0000000..7005f38 --- /dev/null +++ b/datasets/Monoterpenoides/153.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 C + -8.5041 8.3473 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/153.gxl b/datasets/Monoterpenoides/153.gxl new file mode 100644 index 0000000..1cfc69e --- /dev/null +++ b/datasets/Monoterpenoides/153.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/154.ct b/datasets/Monoterpenoides/154.ct new file mode 100644 index 0000000..8dc0ea6 --- /dev/null +++ b/datasets/Monoterpenoides/154.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -10.5164 8.9307 0.0000 O + -9.3497 8.9307 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/154.gxl b/datasets/Monoterpenoides/154.gxl new file mode 100644 index 0000000..5b596fb --- /dev/null +++ b/datasets/Monoterpenoides/154.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/155.ct b/datasets/Monoterpenoides/155.ct new file mode 100644 index 0000000..53d4e1e --- /dev/null +++ b/datasets/Monoterpenoides/155.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -10.5164 8.9307 0.0000 O + -9.3497 8.9307 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/155.gxl b/datasets/Monoterpenoides/155.gxl new file mode 100644 index 0000000..a043734 --- /dev/null +++ b/datasets/Monoterpenoides/155.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/156.ct b/datasets/Monoterpenoides/156.ct new file mode 100644 index 0000000..8d8ecfa --- /dev/null +++ b/datasets/Monoterpenoides/156.ct @@ -0,0 +1,23 @@ + + 10 11 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/156.gxl b/datasets/Monoterpenoides/156.gxl new file mode 100644 index 0000000..00120d8 --- /dev/null +++ b/datasets/Monoterpenoides/156.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/157.ct b/datasets/Monoterpenoides/157.ct new file mode 100644 index 0000000..9667968 --- /dev/null +++ b/datasets/Monoterpenoides/157.ct @@ -0,0 +1,23 @@ + + 10 11 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 diff --git a/datasets/Monoterpenoides/157.gxl b/datasets/Monoterpenoides/157.gxl new file mode 100644 index 0000000..2e0340e --- /dev/null +++ b/datasets/Monoterpenoides/157.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/158.ct b/datasets/Monoterpenoides/158.ct new file mode 100644 index 0000000..5c33242 --- /dev/null +++ b/datasets/Monoterpenoides/158.ct @@ -0,0 +1,23 @@ + + 10 11 + -9.9330 8.3473 0.0000 C + -10.6475 7.9348 0.0000 C + -10.6475 7.1098 0.0000 C + -9.9330 6.6973 0.0000 C + -9.2186 7.1098 0.0000 C + -9.2186 7.9348 0.0000 C + -9.9330 5.8723 0.0000 C + -9.2186 5.4598 0.0000 C + -10.6475 5.4598 0.0000 C + -9.9330 9.1723 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 2 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 diff --git a/datasets/Monoterpenoides/158.gxl b/datasets/Monoterpenoides/158.gxl new file mode 100644 index 0000000..d8c192e --- /dev/null +++ b/datasets/Monoterpenoides/158.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/159.ct b/datasets/Monoterpenoides/159.ct new file mode 100644 index 0000000..6177b9a --- /dev/null +++ b/datasets/Monoterpenoides/159.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 2.1237 -1.9729 0.0000 O + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 6 8 1 1 + 4 9 1 1 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/159.gxl b/datasets/Monoterpenoides/159.gxl new file mode 100644 index 0000000..cbb4cba --- /dev/null +++ b/datasets/Monoterpenoides/159.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/16.ct b/datasets/Monoterpenoides/16.ct new file mode 100644 index 0000000..8b2779d --- /dev/null +++ b/datasets/Monoterpenoides/16.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 O + -5.5580 0.6482 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -5.5581 2.2982 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 6 7 1 1 + 7 8 2 2 + 8 9 1 1 + 8 10 1 1 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/16.gxl b/datasets/Monoterpenoides/16.gxl new file mode 100644 index 0000000..ad736ff --- /dev/null +++ b/datasets/Monoterpenoides/16.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/160.ct b/datasets/Monoterpenoides/160.ct new file mode 100644 index 0000000..7859966 --- /dev/null +++ b/datasets/Monoterpenoides/160.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 2.1237 -1.9729 0.0000 O + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 6 8 2 2 + 4 9 1 1 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/160.gxl b/datasets/Monoterpenoides/160.gxl new file mode 100644 index 0000000..0a24ece --- /dev/null +++ b/datasets/Monoterpenoides/160.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/161.ct b/datasets/Monoterpenoides/161.ct new file mode 100644 index 0000000..308410d --- /dev/null +++ b/datasets/Monoterpenoides/161.ct @@ -0,0 +1,23 @@ + + 10 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/161.gxl b/datasets/Monoterpenoides/161.gxl new file mode 100644 index 0000000..2237e0d --- /dev/null +++ b/datasets/Monoterpenoides/161.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/162.ct b/datasets/Monoterpenoides/162.ct new file mode 100644 index 0000000..d8fad10 --- /dev/null +++ b/datasets/Monoterpenoides/162.ct @@ -0,0 +1,23 @@ + + 10 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/162.gxl b/datasets/Monoterpenoides/162.gxl new file mode 100644 index 0000000..934e5c2 --- /dev/null +++ b/datasets/Monoterpenoides/162.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/163.ct b/datasets/Monoterpenoides/163.ct new file mode 100644 index 0000000..906f819 --- /dev/null +++ b/datasets/Monoterpenoides/163.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 2.1237 -1.9729 0.0000 O + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 2 2 + 6 8 1 1 + 4 9 1 1 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/163.gxl b/datasets/Monoterpenoides/163.gxl new file mode 100644 index 0000000..1d1ac24 --- /dev/null +++ b/datasets/Monoterpenoides/163.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/164.ct b/datasets/Monoterpenoides/164.ct new file mode 100644 index 0000000..421466c --- /dev/null +++ b/datasets/Monoterpenoides/164.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 2.1237 -1.9729 0.0000 O + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 2 2 + 6 8 2 2 + 4 9 1 1 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/164.gxl b/datasets/Monoterpenoides/164.gxl new file mode 100644 index 0000000..f4e6cc5 --- /dev/null +++ b/datasets/Monoterpenoides/164.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/165.ct b/datasets/Monoterpenoides/165.ct new file mode 100644 index 0000000..14a936a --- /dev/null +++ b/datasets/Monoterpenoides/165.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 0.2425 -1.5603 0.0000 C + 1.4093 -1.5603 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 4 7 1 1 + 2 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/165.gxl b/datasets/Monoterpenoides/165.gxl new file mode 100644 index 0000000..ae74b65 --- /dev/null +++ b/datasets/Monoterpenoides/165.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/166.ct b/datasets/Monoterpenoides/166.ct new file mode 100644 index 0000000..87922df --- /dev/null +++ b/datasets/Monoterpenoides/166.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 0.2425 -1.5603 0.0000 C + 1.4093 -1.5603 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 4 7 1 1 + 2 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/166.gxl b/datasets/Monoterpenoides/166.gxl new file mode 100644 index 0000000..66c307e --- /dev/null +++ b/datasets/Monoterpenoides/166.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/167.ct b/datasets/Monoterpenoides/167.ct new file mode 100644 index 0000000..b5b0677 --- /dev/null +++ b/datasets/Monoterpenoides/167.ct @@ -0,0 +1,23 @@ + + 10 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 7 2 2 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/167.gxl b/datasets/Monoterpenoides/167.gxl new file mode 100644 index 0000000..fd4832b --- /dev/null +++ b/datasets/Monoterpenoides/167.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/168.ct b/datasets/Monoterpenoides/168.ct new file mode 100644 index 0000000..f84e948 --- /dev/null +++ b/datasets/Monoterpenoides/168.ct @@ -0,0 +1,22 @@ + + 10 10 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + -0.6031 -2.1437 0.0000 C + -1.3175 -2.5562 0.0000 C + -0.6031 -1.3187 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 7 2 2 + 2 8 1 1 + 8 9 1 1 + 8 10 2 2 diff --git a/datasets/Monoterpenoides/168.gxl b/datasets/Monoterpenoides/168.gxl new file mode 100644 index 0000000..3e9c5fd --- /dev/null +++ b/datasets/Monoterpenoides/168.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/169.ct b/datasets/Monoterpenoides/169.ct new file mode 100644 index 0000000..b05fd5b --- /dev/null +++ b/datasets/Monoterpenoides/169.ct @@ -0,0 +1,24 @@ + + 11 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + -0.6031 -2.1437 0.0000 C + -1.3175 -2.5562 0.0000 C + -0.6031 -1.3187 0.0000 C + -0.6031 -3.7938 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 7 2 2 + 2 8 1 1 + 8 9 1 1 + 8 10 2 2 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/169.gxl b/datasets/Monoterpenoides/169.gxl new file mode 100644 index 0000000..67c37cc --- /dev/null +++ b/datasets/Monoterpenoides/169.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/17.ct b/datasets/Monoterpenoides/17.ct new file mode 100644 index 0000000..e889311 --- /dev/null +++ b/datasets/Monoterpenoides/17.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -3.4146 0.2357 0.0000 O + -4.1291 3.1232 0.0000 C + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 7 9 1 1 + 5 10 2 2 + 4 11 2 2 diff --git a/datasets/Monoterpenoides/17.gxl b/datasets/Monoterpenoides/17.gxl new file mode 100644 index 0000000..a221cf3 --- /dev/null +++ b/datasets/Monoterpenoides/17.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/170.ct b/datasets/Monoterpenoides/170.ct new file mode 100644 index 0000000..41e7492 --- /dev/null +++ b/datasets/Monoterpenoides/170.ct @@ -0,0 +1,26 @@ + + 12 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + -0.6031 -2.1437 0.0000 C + -1.3175 -2.5562 0.0000 C + -0.6031 -1.3187 0.0000 C + -0.6031 -3.7938 0.0000 O + 2.2549 -2.1437 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 7 2 2 + 2 8 1 1 + 8 9 1 1 + 8 10 2 2 + 3 11 1 1 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/170.gxl b/datasets/Monoterpenoides/170.gxl new file mode 100644 index 0000000..6011ab2 --- /dev/null +++ b/datasets/Monoterpenoides/170.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/171.ct b/datasets/Monoterpenoides/171.ct new file mode 100644 index 0000000..bb21880 --- /dev/null +++ b/datasets/Monoterpenoides/171.ct @@ -0,0 +1,24 @@ + + 11 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + -0.6031 -2.1437 0.0000 C + -1.3175 -2.5562 0.0000 C + -0.6031 -1.3187 0.0000 C + -1.3175 -1.7312 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 7 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/171.gxl b/datasets/Monoterpenoides/171.gxl new file mode 100644 index 0000000..34d40a6 --- /dev/null +++ b/datasets/Monoterpenoides/171.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/172.ct b/datasets/Monoterpenoides/172.ct new file mode 100644 index 0000000..4128ab1 --- /dev/null +++ b/datasets/Monoterpenoides/172.ct @@ -0,0 +1,24 @@ + + 11 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + -0.6031 -2.1437 0.0000 C + -1.3175 -2.5562 0.0000 C + -0.6031 -1.3187 0.0000 C + -1.3175 -1.7312 0.0000 O + 1 2 5 5 + 1 6 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 7 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/172.gxl b/datasets/Monoterpenoides/172.gxl new file mode 100644 index 0000000..7518a8e --- /dev/null +++ b/datasets/Monoterpenoides/172.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/173.ct b/datasets/Monoterpenoides/173.ct new file mode 100644 index 0000000..97893c5 --- /dev/null +++ b/datasets/Monoterpenoides/173.ct @@ -0,0 +1,23 @@ + + 10 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/173.gxl b/datasets/Monoterpenoides/173.gxl new file mode 100644 index 0000000..fbd6c0e --- /dev/null +++ b/datasets/Monoterpenoides/173.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/174.ct b/datasets/Monoterpenoides/174.ct new file mode 100644 index 0000000..adab5d2 --- /dev/null +++ b/datasets/Monoterpenoides/174.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 2.2549 -3.7938 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/174.gxl b/datasets/Monoterpenoides/174.gxl new file mode 100644 index 0000000..c808cca --- /dev/null +++ b/datasets/Monoterpenoides/174.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/175.ct b/datasets/Monoterpenoides/175.ct new file mode 100644 index 0000000..6d4c396 --- /dev/null +++ b/datasets/Monoterpenoides/175.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 2.2549 -3.7938 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/175.gxl b/datasets/Monoterpenoides/175.gxl new file mode 100644 index 0000000..0d598a8 --- /dev/null +++ b/datasets/Monoterpenoides/175.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/176.ct b/datasets/Monoterpenoides/176.ct new file mode 100644 index 0000000..f6ab68b --- /dev/null +++ b/datasets/Monoterpenoides/176.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 2.2549 -3.7938 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/176.gxl b/datasets/Monoterpenoides/176.gxl new file mode 100644 index 0000000..bde16fc --- /dev/null +++ b/datasets/Monoterpenoides/176.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/177.ct b/datasets/Monoterpenoides/177.ct new file mode 100644 index 0000000..d67ff5c --- /dev/null +++ b/datasets/Monoterpenoides/177.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 2.2549 -3.7938 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/177.gxl b/datasets/Monoterpenoides/177.gxl new file mode 100644 index 0000000..1a1bae9 --- /dev/null +++ b/datasets/Monoterpenoides/177.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/178.ct b/datasets/Monoterpenoides/178.ct new file mode 100644 index 0000000..21e329c --- /dev/null +++ b/datasets/Monoterpenoides/178.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + -0.6031 -3.7938 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/178.gxl b/datasets/Monoterpenoides/178.gxl new file mode 100644 index 0000000..aa3b39a --- /dev/null +++ b/datasets/Monoterpenoides/178.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/179.ct b/datasets/Monoterpenoides/179.ct new file mode 100644 index 0000000..c4d648c --- /dev/null +++ b/datasets/Monoterpenoides/179.ct @@ -0,0 +1,29 @@ + + 13 14 + -0.3125 -0.4784 0.0000 C + 0.4020 -0.8909 0.0000 C + 0.4020 -1.7159 0.0000 C + -1.0269 -1.7159 0.0000 C + -1.0269 -0.8909 0.0000 C + 1.2270 -1.7159 0.0000 C + 1.2270 -0.8909 0.0000 C + 2.0520 -1.7159 0.0000 C + 1.2270 -2.5409 0.0000 C + 1.8103 -0.3075 0.0000 O + 0.6155 -0.0940 0.0000 C + 0.4020 -2.5409 0.0000 C + -0.3125 0.3466 0.0000 C + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 2 2 + 3 4 1 1 + 3 6 1 1 + 2 7 1 1 + 6 7 1 1 + 6 8 1 1 + 6 9 1 1 + 7 10 2 2 + 2 11 1 1 + 3 12 1 1 + 1 13 1 1 diff --git a/datasets/Monoterpenoides/179.gxl b/datasets/Monoterpenoides/179.gxl new file mode 100644 index 0000000..d19e865 --- /dev/null +++ b/datasets/Monoterpenoides/179.gxl @@ -0,0 +1,88 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/18.ct b/datasets/Monoterpenoides/18.ct new file mode 100644 index 0000000..91ea178 --- /dev/null +++ b/datasets/Monoterpenoides/18.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -3.4146 0.2357 0.0000 O + -4.1291 3.1232 0.0000 C + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 7 9 1 1 + 5 10 2 2 + 4 11 2 2 diff --git a/datasets/Monoterpenoides/18.gxl b/datasets/Monoterpenoides/18.gxl new file mode 100644 index 0000000..ff8a5f0 --- /dev/null +++ b/datasets/Monoterpenoides/18.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/180.ct b/datasets/Monoterpenoides/180.ct new file mode 100644 index 0000000..b789157 --- /dev/null +++ b/datasets/Monoterpenoides/180.ct @@ -0,0 +1,24 @@ + + 11 11 + 0.4020 -0.8909 0.0000 C + 0.4020 -1.7159 0.0000 C + 1.2270 -1.7159 0.0000 C + 1.2270 -0.8909 0.0000 C + 0.4020 -0.0659 0.0000 C + -0.4230 -0.8909 0.0000 C + 1.8103 -0.3075 0.0000 C + 2.6072 -0.5211 0.0000 C + 3.1906 0.0623 0.0000 C + 3.9875 -0.1512 0.0000 C + 2.9770 0.8592 0.0000 O + 1 2 1 1 + 2 3 1 1 + 1 4 1 1 + 3 4 1 1 + 1 5 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 8 9 1 1 + 9 10 1 1 + 9 11 2 2 diff --git a/datasets/Monoterpenoides/180.gxl b/datasets/Monoterpenoides/180.gxl new file mode 100644 index 0000000..eec9147 --- /dev/null +++ b/datasets/Monoterpenoides/180.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/181.ct b/datasets/Monoterpenoides/181.ct new file mode 100644 index 0000000..1c49a9e --- /dev/null +++ b/datasets/Monoterpenoides/181.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + -0.6031 -3.7938 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/181.gxl b/datasets/Monoterpenoides/181.gxl new file mode 100644 index 0000000..fe57244 --- /dev/null +++ b/datasets/Monoterpenoides/181.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/182.ct b/datasets/Monoterpenoides/182.ct new file mode 100644 index 0000000..db9b90e --- /dev/null +++ b/datasets/Monoterpenoides/182.ct @@ -0,0 +1,24 @@ + + 11 11 + 0.4020 -0.8909 0.0000 C + 0.4020 -1.7159 0.0000 C + 1.2270 -1.7159 0.0000 C + 1.2270 -0.8909 0.0000 C + 1.2270 -0.0659 0.0000 C + 2.0520 -0.8909 0.0000 C + 1.8104 -2.2993 0.0000 C + 2.6073 -2.0857 0.0000 C + 1.5968 -3.0962 0.0000 C + 2.4645 -0.1764 0.0000 C + 3.2895 -0.1764 0.0000 O + 1 2 1 1 + 2 3 1 1 + 1 4 1 1 + 3 4 1 1 + 4 5 1 1 + 4 6 1 1 + 3 7 1 1 + 7 8 1 1 + 7 9 2 2 + 6 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/182.gxl b/datasets/Monoterpenoides/182.gxl new file mode 100644 index 0000000..d25b9a9 --- /dev/null +++ b/datasets/Monoterpenoides/182.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/183.ct b/datasets/Monoterpenoides/183.ct new file mode 100644 index 0000000..d45c8b3 --- /dev/null +++ b/datasets/Monoterpenoides/183.ct @@ -0,0 +1,23 @@ + + 10 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 2 2 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/183.gxl b/datasets/Monoterpenoides/183.gxl new file mode 100644 index 0000000..47f19d7 --- /dev/null +++ b/datasets/Monoterpenoides/183.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/184.ct b/datasets/Monoterpenoides/184.ct new file mode 100644 index 0000000..b240e94 --- /dev/null +++ b/datasets/Monoterpenoides/184.ct @@ -0,0 +1,23 @@ + + 10 11 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 O + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 2 2 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/184.gxl b/datasets/Monoterpenoides/184.gxl new file mode 100644 index 0000000..11dea7f --- /dev/null +++ b/datasets/Monoterpenoides/184.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/185.ct b/datasets/Monoterpenoides/185.ct new file mode 100644 index 0000000..fbbff3c --- /dev/null +++ b/datasets/Monoterpenoides/185.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1.5404 -0.9062 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/185.gxl b/datasets/Monoterpenoides/185.gxl new file mode 100644 index 0000000..8677a0e --- /dev/null +++ b/datasets/Monoterpenoides/185.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/186.ct b/datasets/Monoterpenoides/186.ct new file mode 100644 index 0000000..8058e9d --- /dev/null +++ b/datasets/Monoterpenoides/186.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1.5404 -0.9062 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/186.gxl b/datasets/Monoterpenoides/186.gxl new file mode 100644 index 0000000..0184c83 --- /dev/null +++ b/datasets/Monoterpenoides/186.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/187.ct b/datasets/Monoterpenoides/187.ct new file mode 100644 index 0000000..6d3f3d6 --- /dev/null +++ b/datasets/Monoterpenoides/187.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1.5404 -0.9062 0.0000 O + 1 2 1 1 + 1 6 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/187.gxl b/datasets/Monoterpenoides/187.gxl new file mode 100644 index 0000000..b821b80 --- /dev/null +++ b/datasets/Monoterpenoides/187.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/188.ct b/datasets/Monoterpenoides/188.ct new file mode 100644 index 0000000..cad8267 --- /dev/null +++ b/datasets/Monoterpenoides/188.ct @@ -0,0 +1,25 @@ + + 11 12 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -1.3187 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 1.5404 -0.9062 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 2 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/188.gxl b/datasets/Monoterpenoides/188.gxl new file mode 100644 index 0000000..dbb2f0a --- /dev/null +++ b/datasets/Monoterpenoides/188.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/189.ct b/datasets/Monoterpenoides/189.ct new file mode 100644 index 0000000..ed1772d --- /dev/null +++ b/datasets/Monoterpenoides/189.ct @@ -0,0 +1,26 @@ + + 11 13 + 0.8259 -2.1437 0.0000 C + 0.1114 -2.5562 0.0000 C + 0.1114 -3.3813 0.0000 C + 0.8259 -3.7938 0.0000 C + 1.5404 -3.3813 0.0000 C + 1.5404 -2.5562 0.0000 C + 0.8259 -2.9688 0.0000 C + 1.1491 -2.8797 0.0000 C + 0.4434 -3.1727 0.0000 C + 0.1114 -1.7312 0.0000 C + 1.5404 -1.7312 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 4 7 1 1 + 2 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/189.gxl b/datasets/Monoterpenoides/189.gxl new file mode 100644 index 0000000..8009805 --- /dev/null +++ b/datasets/Monoterpenoides/189.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/19.ct b/datasets/Monoterpenoides/19.ct new file mode 100644 index 0000000..5c8fe4a --- /dev/null +++ b/datasets/Monoterpenoides/19.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 O + -4.1291 3.1232 0.0000 C + -4.8436 -1.4143 0.0000 C + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 7 9 1 1 + 4 10 2 2 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/19.gxl b/datasets/Monoterpenoides/19.gxl new file mode 100644 index 0000000..af7e301 --- /dev/null +++ b/datasets/Monoterpenoides/19.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/190.ct b/datasets/Monoterpenoides/190.ct new file mode 100644 index 0000000..2965af6 --- /dev/null +++ b/datasets/Monoterpenoides/190.ct @@ -0,0 +1,24 @@ + + 11 11 + -0.6346 -0.7143 0.0000 C + -1.0471 -1.4287 0.0000 C + -1.8945 -1.1162 0.0000 C + -1.8721 -0.3570 0.0000 C + -1.0471 0.0002 0.0000 C + -0.7882 0.7835 0.0000 C + 0.1904 -0.7143 0.0000 C + -0.2221 -1.4288 0.0000 C + -0.7666 -2.2046 0.0000 C + -1.2983 -2.8354 0.0000 C + -1.0178 -3.6113 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 2 2 + 1 5 1 1 + 3 4 1 1 + 5 6 1 1 + 1 7 1 1 + 1 8 1 1 + 2 9 1 1 + 9 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/190.gxl b/datasets/Monoterpenoides/190.gxl new file mode 100644 index 0000000..ec3daa8 --- /dev/null +++ b/datasets/Monoterpenoides/190.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/191.ct b/datasets/Monoterpenoides/191.ct new file mode 100644 index 0000000..cefa60d --- /dev/null +++ b/datasets/Monoterpenoides/191.ct @@ -0,0 +1,24 @@ + + 11 11 + -0.6346 -0.7143 0.0000 C + -1.0471 -1.4287 0.0000 C + -1.8945 -1.1162 0.0000 C + -1.8721 -0.3570 0.0000 C + -1.0471 0.0002 0.0000 C + -0.7882 0.7835 0.0000 C + 0.1904 -0.7143 0.0000 C + -0.2221 -1.4288 0.0000 C + -0.7666 -2.2046 0.0000 C + -1.2983 -2.8354 0.0000 C + -1.0178 -3.6113 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 2 2 + 1 5 1 1 + 3 4 1 1 + 5 6 1 1 + 1 7 1 1 + 1 8 1 1 + 2 9 1 1 + 9 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/191.gxl b/datasets/Monoterpenoides/191.gxl new file mode 100644 index 0000000..45b773f --- /dev/null +++ b/datasets/Monoterpenoides/191.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/192.ct b/datasets/Monoterpenoides/192.ct new file mode 100644 index 0000000..5314bf9 --- /dev/null +++ b/datasets/Monoterpenoides/192.ct @@ -0,0 +1,27 @@ + + 12 13 + -0.6346 -0.7143 0.0000 C + -1.0471 -1.4287 0.0000 C + -1.8945 -1.1162 0.0000 C + -1.8721 -0.3570 0.0000 C + -1.0471 0.0002 0.0000 C + -0.7882 0.7835 0.0000 C + 0.1904 -0.7143 0.0000 C + -0.2221 -1.4288 0.0000 C + -0.7666 -2.2046 0.0000 C + -1.2983 -2.8354 0.0000 C + -1.0178 -3.6113 0.0000 O + -1.7616 0.4127 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 5 6 1 1 + 1 7 1 1 + 1 8 1 1 + 2 9 1 1 + 9 10 1 1 + 10 11 2 2 + 5 12 1 1 + 4 12 1 1 diff --git a/datasets/Monoterpenoides/192.gxl b/datasets/Monoterpenoides/192.gxl new file mode 100644 index 0000000..1f4a5c9 --- /dev/null +++ b/datasets/Monoterpenoides/192.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/193.ct b/datasets/Monoterpenoides/193.ct new file mode 100644 index 0000000..7358736 --- /dev/null +++ b/datasets/Monoterpenoides/193.ct @@ -0,0 +1,25 @@ + + 11 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -2.8659 0.6638 0.0000 C + -1.4615 0.6638 0.0000 C + -2.5000 2.3420 0.0000 C + -1.0711 1.5170 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/193.gxl b/datasets/Monoterpenoides/193.gxl new file mode 100644 index 0000000..0d9bc7d --- /dev/null +++ b/datasets/Monoterpenoides/193.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/194.ct b/datasets/Monoterpenoides/194.ct new file mode 100644 index 0000000..074dab4 --- /dev/null +++ b/datasets/Monoterpenoides/194.ct @@ -0,0 +1,25 @@ + + 11 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -3.1115 0.6638 0.0000 C + -1.4615 0.6638 0.0000 C + -2.5000 2.3420 0.0000 C + -1.0711 1.5170 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/194.gxl b/datasets/Monoterpenoides/194.gxl new file mode 100644 index 0000000..476f4a7 --- /dev/null +++ b/datasets/Monoterpenoides/194.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/195.ct b/datasets/Monoterpenoides/195.ct new file mode 100644 index 0000000..a347537 --- /dev/null +++ b/datasets/Monoterpenoides/195.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -3.1115 0.6638 0.0000 C + -2.8231 0.9763 0.0000 C + -2.5000 2.3420 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 6 2 2 diff --git a/datasets/Monoterpenoides/195.gxl b/datasets/Monoterpenoides/195.gxl new file mode 100644 index 0000000..f92bf12 --- /dev/null +++ b/datasets/Monoterpenoides/195.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/196.ct b/datasets/Monoterpenoides/196.ct new file mode 100644 index 0000000..5279a3e --- /dev/null +++ b/datasets/Monoterpenoides/196.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -3.1115 0.6638 0.0000 C + -2.8231 0.9763 0.0000 C + -2.5000 2.3420 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 6 1 1 diff --git a/datasets/Monoterpenoides/196.gxl b/datasets/Monoterpenoides/196.gxl new file mode 100644 index 0000000..a63e1cf --- /dev/null +++ b/datasets/Monoterpenoides/196.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/197.ct b/datasets/Monoterpenoides/197.ct new file mode 100644 index 0000000..610bdb7 --- /dev/null +++ b/datasets/Monoterpenoides/197.ct @@ -0,0 +1,24 @@ + + 10 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -3.1115 0.6638 0.0000 C + -2.8231 0.9763 0.0000 C + -2.5000 2.3420 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 6 1 1 + 2 6 1 1 diff --git a/datasets/Monoterpenoides/197.gxl b/datasets/Monoterpenoides/197.gxl new file mode 100644 index 0000000..9240b99 --- /dev/null +++ b/datasets/Monoterpenoides/197.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/198.ct b/datasets/Monoterpenoides/198.ct new file mode 100644 index 0000000..b65ee62 --- /dev/null +++ b/datasets/Monoterpenoides/198.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.0711 1.5170 0.0000 C + -0.9605 1.1045 0.0000 C + -1.0711 -0.1330 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 6 8 1 1 + 6 9 1 1 + 5 10 2 2 diff --git a/datasets/Monoterpenoides/198.gxl b/datasets/Monoterpenoides/198.gxl new file mode 100644 index 0000000..b13e5a8 --- /dev/null +++ b/datasets/Monoterpenoides/198.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/199.ct b/datasets/Monoterpenoides/199.ct new file mode 100644 index 0000000..30aeaed --- /dev/null +++ b/datasets/Monoterpenoides/199.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.0711 1.5170 0.0000 C + -0.9605 1.1045 0.0000 C + -1.0711 -0.1330 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 6 8 1 1 + 6 9 1 1 + 5 10 1 1 diff --git a/datasets/Monoterpenoides/199.gxl b/datasets/Monoterpenoides/199.gxl new file mode 100644 index 0000000..85eb7f0 --- /dev/null +++ b/datasets/Monoterpenoides/199.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/2.ct b/datasets/Monoterpenoides/2.ct new file mode 100644 index 0000000..37f303b --- /dev/null +++ b/datasets/Monoterpenoides/2.ct @@ -0,0 +1,26 @@ + + 12 12 + -5.0223 0.0320 0.0000 O + -5.7368 0.4445 0.0000 C + -5.7368 1.2695 0.0000 C + -4.3079 1.2695 0.0000 C + -4.3079 0.4445 0.0000 C + -3.5934 0.0320 0.0000 C + -3.5934 0.8570 0.0000 C + -2.8789 0.4445 0.0000 C + -6.4512 0.0320 0.0000 C + -7.1657 0.4445 0.0000 C + -6.4513 -0.7930 0.0000 C + -7.1657 -1.2055 0.0000 O + 1 2 1 1 + 1 5 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 5 7 1 1 + 7 8 2 2 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 + 11 12 2 2 diff --git a/datasets/Monoterpenoides/2.gxl b/datasets/Monoterpenoides/2.gxl new file mode 100644 index 0000000..0926854 --- /dev/null +++ b/datasets/Monoterpenoides/2.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/20.ct b/datasets/Monoterpenoides/20.ct new file mode 100644 index 0000000..121e5b3 --- /dev/null +++ b/datasets/Monoterpenoides/20.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -4.1291 3.1232 0.0000 C + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 7 9 1 1 + 4 10 2 2 diff --git a/datasets/Monoterpenoides/20.gxl b/datasets/Monoterpenoides/20.gxl new file mode 100644 index 0000000..2c622a3 --- /dev/null +++ b/datasets/Monoterpenoides/20.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/200.ct b/datasets/Monoterpenoides/200.ct new file mode 100644 index 0000000..10935d9 --- /dev/null +++ b/datasets/Monoterpenoides/200.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.0711 1.5170 0.0000 C + -0.9605 1.1045 0.0000 C + -1.0711 -0.1330 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 6 8 1 1 + 6 9 1 1 + 5 10 2 2 diff --git a/datasets/Monoterpenoides/200.gxl b/datasets/Monoterpenoides/200.gxl new file mode 100644 index 0000000..440f2ef --- /dev/null +++ b/datasets/Monoterpenoides/200.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/201.ct b/datasets/Monoterpenoides/201.ct new file mode 100644 index 0000000..5277400 --- /dev/null +++ b/datasets/Monoterpenoides/201.ct @@ -0,0 +1,25 @@ + + 11 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.0711 1.5170 0.0000 C + -0.9605 1.1045 0.0000 C + -1.0711 -0.1330 0.0000 O + -1.7855 -0.5455 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 6 8 1 1 + 6 9 1 1 + 5 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/201.gxl b/datasets/Monoterpenoides/201.gxl new file mode 100644 index 0000000..650fffb --- /dev/null +++ b/datasets/Monoterpenoides/201.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/202.ct b/datasets/Monoterpenoides/202.ct new file mode 100644 index 0000000..5c6d745 --- /dev/null +++ b/datasets/Monoterpenoides/202.ct @@ -0,0 +1,25 @@ + + 11 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.0711 1.5170 0.0000 C + -0.9605 1.1045 0.0000 C + -1.0711 -0.1330 0.0000 C + -3.9289 -0.1330 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 6 8 1 1 + 6 9 1 1 + 5 10 2 2 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/202.gxl b/datasets/Monoterpenoides/202.gxl new file mode 100644 index 0000000..d8d0e85 --- /dev/null +++ b/datasets/Monoterpenoides/202.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/203.ct b/datasets/Monoterpenoides/203.ct new file mode 100644 index 0000000..7dcf7e6 --- /dev/null +++ b/datasets/Monoterpenoides/203.ct @@ -0,0 +1,25 @@ + + 11 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -2.5000 2.3420 0.0000 C + -3.7978 1.6878 0.0000 O + -3.9289 0.6920 0.0000 C + -3.4280 -0.5174 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 1 8 1 1 + 2 9 1 1 + 3 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/203.gxl b/datasets/Monoterpenoides/203.gxl new file mode 100644 index 0000000..cfff31d --- /dev/null +++ b/datasets/Monoterpenoides/203.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/204.ct b/datasets/Monoterpenoides/204.ct new file mode 100644 index 0000000..c85173d --- /dev/null +++ b/datasets/Monoterpenoides/204.ct @@ -0,0 +1,25 @@ + + 11 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -2.5000 2.3420 0.0000 C + -3.7978 1.6878 0.0000 O + -3.9289 0.6920 0.0000 C + -3.4280 -0.5174 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 1 8 1 1 + 2 9 2 2 + 3 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/204.gxl b/datasets/Monoterpenoides/204.gxl new file mode 100644 index 0000000..cb61fb7 --- /dev/null +++ b/datasets/Monoterpenoides/204.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/205.ct b/datasets/Monoterpenoides/205.ct new file mode 100644 index 0000000..1cca239 --- /dev/null +++ b/datasets/Monoterpenoides/205.ct @@ -0,0 +1,24 @@ + + 10 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -2.5000 2.3420 0.0000 C + -3.9289 -0.1330 0.0000 C + -3.4280 -0.5174 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 1 8 1 1 + 2 6 1 1 + 3 9 1 1 + 3 10 1 1 diff --git a/datasets/Monoterpenoides/205.gxl b/datasets/Monoterpenoides/205.gxl new file mode 100644 index 0000000..1480aa1 --- /dev/null +++ b/datasets/Monoterpenoides/205.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/206.ct b/datasets/Monoterpenoides/206.ct new file mode 100644 index 0000000..e87f5b9 --- /dev/null +++ b/datasets/Monoterpenoides/206.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -2.5000 2.3420 0.0000 C + -3.9289 -0.1330 0.0000 C + -3.4280 -0.5174 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 2 2 + 1 8 1 1 + 3 9 1 1 + 3 10 1 1 diff --git a/datasets/Monoterpenoides/206.gxl b/datasets/Monoterpenoides/206.gxl new file mode 100644 index 0000000..1652610 --- /dev/null +++ b/datasets/Monoterpenoides/206.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/207.ct b/datasets/Monoterpenoides/207.ct new file mode 100644 index 0000000..703ef60 --- /dev/null +++ b/datasets/Monoterpenoides/207.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -3.9289 -0.1330 0.0000 C + -0.9886 0.8909 0.0000 C + -1.4698 1.8667 0.0000 C + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 3 8 1 1 + 6 9 1 1 + 6 10 1 1 diff --git a/datasets/Monoterpenoides/207.gxl b/datasets/Monoterpenoides/207.gxl new file mode 100644 index 0000000..e5a9256 --- /dev/null +++ b/datasets/Monoterpenoides/207.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/208.ct b/datasets/Monoterpenoides/208.ct new file mode 100644 index 0000000..ded2883 --- /dev/null +++ b/datasets/Monoterpenoides/208.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -3.9289 -0.1330 0.0000 C + -0.9886 0.8909 0.0000 C + -1.4698 1.8667 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 3 8 2 2 + 6 9 1 1 + 6 10 1 1 diff --git a/datasets/Monoterpenoides/208.gxl b/datasets/Monoterpenoides/208.gxl new file mode 100644 index 0000000..ab22133 --- /dev/null +++ b/datasets/Monoterpenoides/208.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/209.ct b/datasets/Monoterpenoides/209.ct new file mode 100644 index 0000000..b6725f8 --- /dev/null +++ b/datasets/Monoterpenoides/209.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.4698 1.8667 0.0000 C + -1.0711 -0.1330 0.0000 C + -2.5000 2.3420 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 2 2 + 6 8 1 1 + 5 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/209.gxl b/datasets/Monoterpenoides/209.gxl new file mode 100644 index 0000000..626bde1 --- /dev/null +++ b/datasets/Monoterpenoides/209.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/21.ct b/datasets/Monoterpenoides/21.ct new file mode 100644 index 0000000..9f40b8f --- /dev/null +++ b/datasets/Monoterpenoides/21.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -3.4146 0.2357 0.0000 C + -3.4146 -0.5893 0.0000 C + -2.7002 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -6.2725 1.8857 0.0000 C + -6.9869 1.4731 0.0000 O + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 2 2 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/21.gxl b/datasets/Monoterpenoides/21.gxl new file mode 100644 index 0000000..0b938d1 --- /dev/null +++ b/datasets/Monoterpenoides/21.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/210.ct b/datasets/Monoterpenoides/210.ct new file mode 100644 index 0000000..516b6ad --- /dev/null +++ b/datasets/Monoterpenoides/210.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.4698 1.8667 0.0000 C + -3.0009 1.0763 0.0000 C + -3.0834 0.4503 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 2 2 + 6 8 1 1 + 7 9 1 1 + 7 10 1 1 diff --git a/datasets/Monoterpenoides/210.gxl b/datasets/Monoterpenoides/210.gxl new file mode 100644 index 0000000..c7ae71c --- /dev/null +++ b/datasets/Monoterpenoides/210.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/211.ct b/datasets/Monoterpenoides/211.ct new file mode 100644 index 0000000..7d11e85 --- /dev/null +++ b/datasets/Monoterpenoides/211.ct @@ -0,0 +1,23 @@ + + 10 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.2865 0.6638 0.0000 C + -1.4698 1.8667 0.0000 C + -3.0009 1.0763 0.0000 C + -3.0834 0.4503 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 4 7 1 1 + 1 7 1 1 + 5 6 1 1 + 6 8 2 2 + 7 9 1 1 + 7 10 1 1 diff --git a/datasets/Monoterpenoides/211.gxl b/datasets/Monoterpenoides/211.gxl new file mode 100644 index 0000000..af3f912 --- /dev/null +++ b/datasets/Monoterpenoides/211.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/212.ct b/datasets/Monoterpenoides/212.ct new file mode 100644 index 0000000..fb1be94 --- /dev/null +++ b/datasets/Monoterpenoides/212.ct @@ -0,0 +1,24 @@ + + 11 11 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.5000 2.3420 0.0000 C + -2.5000 -0.9581 0.0000 C + -3.2969 -1.1716 0.0000 C + -1.7855 -1.3706 0.0000 C + -1.7031 -0.7445 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 2 2 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/212.gxl b/datasets/Monoterpenoides/212.gxl new file mode 100644 index 0000000..b1f3a33 --- /dev/null +++ b/datasets/Monoterpenoides/212.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/213.ct b/datasets/Monoterpenoides/213.ct new file mode 100644 index 0000000..7989543 --- /dev/null +++ b/datasets/Monoterpenoides/213.ct @@ -0,0 +1,26 @@ + + 12 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.5000 2.3420 0.0000 C + -2.5000 -0.9581 0.0000 C + -3.2969 -1.1716 0.0000 C + -1.7855 -1.3706 0.0000 C + -1.7031 -0.7445 0.0000 O + -1.0711 1.5170 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 + 6 12 2 2 diff --git a/datasets/Monoterpenoides/213.gxl b/datasets/Monoterpenoides/213.gxl new file mode 100644 index 0000000..4339f67 --- /dev/null +++ b/datasets/Monoterpenoides/213.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/214.ct b/datasets/Monoterpenoides/214.ct new file mode 100644 index 0000000..8010210 --- /dev/null +++ b/datasets/Monoterpenoides/214.ct @@ -0,0 +1,26 @@ + + 12 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.5000 2.3420 0.0000 C + -2.5000 -0.9581 0.0000 C + -3.2969 -1.1716 0.0000 C + -1.7855 -1.3706 0.0000 C + -1.7031 -0.7445 0.0000 O + -1.0711 1.5170 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/214.gxl b/datasets/Monoterpenoides/214.gxl new file mode 100644 index 0000000..1cb5f12 --- /dev/null +++ b/datasets/Monoterpenoides/214.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/215.ct b/datasets/Monoterpenoides/215.ct new file mode 100644 index 0000000..d0652e8 --- /dev/null +++ b/datasets/Monoterpenoides/215.ct @@ -0,0 +1,26 @@ + + 12 12 + -2.5000 1.5170 0.0000 C + -3.2145 1.1045 0.0000 C + -3.2145 0.2795 0.0000 C + -2.5000 -0.1331 0.0000 C + -1.7855 0.2795 0.0000 C + -1.7855 1.1045 0.0000 C + -2.5000 2.3420 0.0000 C + -2.5000 -0.9581 0.0000 C + -3.2969 -1.1716 0.0000 C + -1.7855 -1.3706 0.0000 C + -1.7031 -0.7445 0.0000 O + -1.0711 1.5170 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 5 6 1 1 + 1 7 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/215.gxl b/datasets/Monoterpenoides/215.gxl new file mode 100644 index 0000000..1096396 --- /dev/null +++ b/datasets/Monoterpenoides/215.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/216.ct b/datasets/Monoterpenoides/216.ct new file mode 100644 index 0000000..739f581 --- /dev/null +++ b/datasets/Monoterpenoides/216.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -0.8821 0.2445 0.0000 O + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 7 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/216.gxl b/datasets/Monoterpenoides/216.gxl new file mode 100644 index 0000000..53674bc --- /dev/null +++ b/datasets/Monoterpenoides/216.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/217.ct b/datasets/Monoterpenoides/217.ct new file mode 100644 index 0000000..285f1f8 --- /dev/null +++ b/datasets/Monoterpenoides/217.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -0.8821 0.2445 0.0000 O + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 7 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/217.gxl b/datasets/Monoterpenoides/217.gxl new file mode 100644 index 0000000..e624fc8 --- /dev/null +++ b/datasets/Monoterpenoides/217.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/218.ct b/datasets/Monoterpenoides/218.ct new file mode 100644 index 0000000..dfb221d --- /dev/null +++ b/datasets/Monoterpenoides/218.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -0.8821 0.2445 0.0000 O + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 7 1 1 + 1 11 1 1 + 7 6 1 1 diff --git a/datasets/Monoterpenoides/218.gxl b/datasets/Monoterpenoides/218.gxl new file mode 100644 index 0000000..5a57927 --- /dev/null +++ b/datasets/Monoterpenoides/218.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/219.ct b/datasets/Monoterpenoides/219.ct new file mode 100644 index 0000000..361e260 --- /dev/null +++ b/datasets/Monoterpenoides/219.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -0.8821 0.2445 0.0000 O + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 7 1 1 + 1 11 1 1 + 7 6 1 1 diff --git a/datasets/Monoterpenoides/219.gxl b/datasets/Monoterpenoides/219.gxl new file mode 100644 index 0000000..a0ba9bd --- /dev/null +++ b/datasets/Monoterpenoides/219.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/22.ct b/datasets/Monoterpenoides/22.ct new file mode 100644 index 0000000..e9fb8ad --- /dev/null +++ b/datasets/Monoterpenoides/22.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -3.4146 0.2357 0.0000 C + -3.4146 -0.5893 0.0000 C + -2.7002 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + -6.2725 1.8857 0.0000 C + -6.9869 1.4731 0.0000 O + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 2 2 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/22.gxl b/datasets/Monoterpenoides/22.gxl new file mode 100644 index 0000000..1d0eb38 --- /dev/null +++ b/datasets/Monoterpenoides/22.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/220.ct b/datasets/Monoterpenoides/220.ct new file mode 100644 index 0000000..a14eeb6 --- /dev/null +++ b/datasets/Monoterpenoides/220.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/220.gxl b/datasets/Monoterpenoides/220.gxl new file mode 100644 index 0000000..45b3a53 --- /dev/null +++ b/datasets/Monoterpenoides/220.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/221.ct b/datasets/Monoterpenoides/221.ct new file mode 100644 index 0000000..8ad8ceb --- /dev/null +++ b/datasets/Monoterpenoides/221.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -2.5893 2.8777 0.0000 C + -1.1603 2.6107 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 6 11 1 1 + 11 1 1 1 diff --git a/datasets/Monoterpenoides/221.gxl b/datasets/Monoterpenoides/221.gxl new file mode 100644 index 0000000..545d25f --- /dev/null +++ b/datasets/Monoterpenoides/221.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/222.ct b/datasets/Monoterpenoides/222.ct new file mode 100644 index 0000000..a66636c --- /dev/null +++ b/datasets/Monoterpenoides/222.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -2.5893 2.8777 0.0000 C + -1.1603 2.6107 0.0000 O + -3.3932 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 11 1 1 1 + 2 12 1 1 diff --git a/datasets/Monoterpenoides/222.gxl b/datasets/Monoterpenoides/222.gxl new file mode 100644 index 0000000..746ef2e --- /dev/null +++ b/datasets/Monoterpenoides/222.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/223.ct b/datasets/Monoterpenoides/223.ct new file mode 100644 index 0000000..945e004 --- /dev/null +++ b/datasets/Monoterpenoides/223.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -2.5893 2.8777 0.0000 C + -1.1603 2.6107 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 11 1 1 1 diff --git a/datasets/Monoterpenoides/223.gxl b/datasets/Monoterpenoides/223.gxl new file mode 100644 index 0000000..6206bc4 --- /dev/null +++ b/datasets/Monoterpenoides/223.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/224.ct b/datasets/Monoterpenoides/224.ct new file mode 100644 index 0000000..4a94266 --- /dev/null +++ b/datasets/Monoterpenoides/224.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 0.0794 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 7 11 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/224.gxl b/datasets/Monoterpenoides/224.gxl new file mode 100644 index 0000000..16d854d --- /dev/null +++ b/datasets/Monoterpenoides/224.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/225.ct b/datasets/Monoterpenoides/225.ct new file mode 100644 index 0000000..daabf93 --- /dev/null +++ b/datasets/Monoterpenoides/225.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.9643 -1.1581 0.0000 O + -0.4248 -0.7456 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 7 11 1 1 + 9 12 1 1 diff --git a/datasets/Monoterpenoides/225.gxl b/datasets/Monoterpenoides/225.gxl new file mode 100644 index 0000000..6aafaea --- /dev/null +++ b/datasets/Monoterpenoides/225.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/226.ct b/datasets/Monoterpenoides/226.ct new file mode 100644 index 0000000..16772dd --- /dev/null +++ b/datasets/Monoterpenoides/226.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.4248 -0.7456 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 9 11 2 2 diff --git a/datasets/Monoterpenoides/226.gxl b/datasets/Monoterpenoides/226.gxl new file mode 100644 index 0000000..07d12dc --- /dev/null +++ b/datasets/Monoterpenoides/226.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/227.ct b/datasets/Monoterpenoides/227.ct new file mode 100644 index 0000000..e92ac2e --- /dev/null +++ b/datasets/Monoterpenoides/227.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.4248 -0.7456 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/227.gxl b/datasets/Monoterpenoides/227.gxl new file mode 100644 index 0000000..b16f1c0 --- /dev/null +++ b/datasets/Monoterpenoides/227.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/228.ct b/datasets/Monoterpenoides/228.ct new file mode 100644 index 0000000..3e07648 --- /dev/null +++ b/datasets/Monoterpenoides/228.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.4248 -0.7456 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 2 2 + 7 9 1 1 + 1 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/228.gxl b/datasets/Monoterpenoides/228.gxl new file mode 100644 index 0000000..ca39aa0 --- /dev/null +++ b/datasets/Monoterpenoides/228.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/229.ct b/datasets/Monoterpenoides/229.ct new file mode 100644 index 0000000..c913edd --- /dev/null +++ b/datasets/Monoterpenoides/229.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/229.gxl b/datasets/Monoterpenoides/229.gxl new file mode 100644 index 0000000..0694757 --- /dev/null +++ b/datasets/Monoterpenoides/229.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/23.ct b/datasets/Monoterpenoides/23.ct new file mode 100644 index 0000000..3ac61c0 --- /dev/null +++ b/datasets/Monoterpenoides/23.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -4.2627 -1.0911 0.0000 C + -5.6916 -1.0911 0.0000 C + -6.2725 1.8857 0.0000 C + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 2 2 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/23.gxl b/datasets/Monoterpenoides/23.gxl new file mode 100644 index 0000000..3e0f4dc --- /dev/null +++ b/datasets/Monoterpenoides/23.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/230.ct b/datasets/Monoterpenoides/230.ct new file mode 100644 index 0000000..fdce98e --- /dev/null +++ b/datasets/Monoterpenoides/230.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/230.gxl b/datasets/Monoterpenoides/230.gxl new file mode 100644 index 0000000..6e5647b --- /dev/null +++ b/datasets/Monoterpenoides/230.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/231.ct b/datasets/Monoterpenoides/231.ct new file mode 100644 index 0000000..6bf0912 --- /dev/null +++ b/datasets/Monoterpenoides/231.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/231.gxl b/datasets/Monoterpenoides/231.gxl new file mode 100644 index 0000000..cf6ebbc --- /dev/null +++ b/datasets/Monoterpenoides/231.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/232.ct b/datasets/Monoterpenoides/232.ct new file mode 100644 index 0000000..dc5c0c8 --- /dev/null +++ b/datasets/Monoterpenoides/232.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/232.gxl b/datasets/Monoterpenoides/232.gxl new file mode 100644 index 0000000..4dcb44a --- /dev/null +++ b/datasets/Monoterpenoides/232.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/233.ct b/datasets/Monoterpenoides/233.ct new file mode 100644 index 0000000..024506a --- /dev/null +++ b/datasets/Monoterpenoides/233.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/233.gxl b/datasets/Monoterpenoides/233.gxl new file mode 100644 index 0000000..9c7f92e --- /dev/null +++ b/datasets/Monoterpenoides/233.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/234.ct b/datasets/Monoterpenoides/234.ct new file mode 100644 index 0000000..196204b --- /dev/null +++ b/datasets/Monoterpenoides/234.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/234.gxl b/datasets/Monoterpenoides/234.gxl new file mode 100644 index 0000000..89ee94c --- /dev/null +++ b/datasets/Monoterpenoides/234.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/235.ct b/datasets/Monoterpenoides/235.ct new file mode 100644 index 0000000..6e8fe82 --- /dev/null +++ b/datasets/Monoterpenoides/235.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/235.gxl b/datasets/Monoterpenoides/235.gxl new file mode 100644 index 0000000..e9db79f --- /dev/null +++ b/datasets/Monoterpenoides/235.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/236.ct b/datasets/Monoterpenoides/236.ct new file mode 100644 index 0000000..eed9898 --- /dev/null +++ b/datasets/Monoterpenoides/236.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/236.gxl b/datasets/Monoterpenoides/236.gxl new file mode 100644 index 0000000..cdf2dd9 --- /dev/null +++ b/datasets/Monoterpenoides/236.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/237.ct b/datasets/Monoterpenoides/237.ct new file mode 100644 index 0000000..b4ff769 --- /dev/null +++ b/datasets/Monoterpenoides/237.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -1.2498 3.4688 0.0000 O + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/237.gxl b/datasets/Monoterpenoides/237.gxl new file mode 100644 index 0000000..a49e90f --- /dev/null +++ b/datasets/Monoterpenoides/237.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/238.ct b/datasets/Monoterpenoides/238.ct new file mode 100644 index 0000000..6253fea --- /dev/null +++ b/datasets/Monoterpenoides/238.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/238.gxl b/datasets/Monoterpenoides/238.gxl new file mode 100644 index 0000000..c891593 --- /dev/null +++ b/datasets/Monoterpenoides/238.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/239.ct b/datasets/Monoterpenoides/239.ct new file mode 100644 index 0000000..600ac29 --- /dev/null +++ b/datasets/Monoterpenoides/239.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/239.gxl b/datasets/Monoterpenoides/239.gxl new file mode 100644 index 0000000..181f9ca --- /dev/null +++ b/datasets/Monoterpenoides/239.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/24.ct b/datasets/Monoterpenoides/24.ct new file mode 100644 index 0000000..363aacc --- /dev/null +++ b/datasets/Monoterpenoides/24.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -4.2627 -1.0911 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -3.4124 0.2395 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/24.gxl b/datasets/Monoterpenoides/24.gxl new file mode 100644 index 0000000..976f7b8 --- /dev/null +++ b/datasets/Monoterpenoides/24.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/240.ct b/datasets/Monoterpenoides/240.ct new file mode 100644 index 0000000..7697731 --- /dev/null +++ b/datasets/Monoterpenoides/240.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/240.gxl b/datasets/Monoterpenoides/240.gxl new file mode 100644 index 0000000..6920f0d --- /dev/null +++ b/datasets/Monoterpenoides/240.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/241.ct b/datasets/Monoterpenoides/241.ct new file mode 100644 index 0000000..1a7561b --- /dev/null +++ b/datasets/Monoterpenoides/241.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/241.gxl b/datasets/Monoterpenoides/241.gxl new file mode 100644 index 0000000..1924b1a --- /dev/null +++ b/datasets/Monoterpenoides/241.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/242.ct b/datasets/Monoterpenoides/242.ct new file mode 100644 index 0000000..d6c9e54 --- /dev/null +++ b/datasets/Monoterpenoides/242.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/242.gxl b/datasets/Monoterpenoides/242.gxl new file mode 100644 index 0000000..63d2b0d --- /dev/null +++ b/datasets/Monoterpenoides/242.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/243.ct b/datasets/Monoterpenoides/243.ct new file mode 100644 index 0000000..483088e --- /dev/null +++ b/datasets/Monoterpenoides/243.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/243.gxl b/datasets/Monoterpenoides/243.gxl new file mode 100644 index 0000000..a1848cb --- /dev/null +++ b/datasets/Monoterpenoides/243.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/244.ct b/datasets/Monoterpenoides/244.ct new file mode 100644 index 0000000..35584d2 --- /dev/null +++ b/datasets/Monoterpenoides/244.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/244.gxl b/datasets/Monoterpenoides/244.gxl new file mode 100644 index 0000000..72c08c8 --- /dev/null +++ b/datasets/Monoterpenoides/244.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/245.ct b/datasets/Monoterpenoides/245.ct new file mode 100644 index 0000000..1bddf8a --- /dev/null +++ b/datasets/Monoterpenoides/245.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/245.gxl b/datasets/Monoterpenoides/245.gxl new file mode 100644 index 0000000..a00bb18 --- /dev/null +++ b/datasets/Monoterpenoides/245.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/246.ct b/datasets/Monoterpenoides/246.ct new file mode 100644 index 0000000..7136a63 --- /dev/null +++ b/datasets/Monoterpenoides/246.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 3.0563 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/246.gxl b/datasets/Monoterpenoides/246.gxl new file mode 100644 index 0000000..8353c20 --- /dev/null +++ b/datasets/Monoterpenoides/246.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/247.ct b/datasets/Monoterpenoides/247.ct new file mode 100644 index 0000000..e1cb06d --- /dev/null +++ b/datasets/Monoterpenoides/247.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -2.7679 2.9000 0.0000 C + -1.3809 2.7253 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/247.gxl b/datasets/Monoterpenoides/247.gxl new file mode 100644 index 0000000..e442900 --- /dev/null +++ b/datasets/Monoterpenoides/247.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/248.ct b/datasets/Monoterpenoides/248.ct new file mode 100644 index 0000000..29086ad --- /dev/null +++ b/datasets/Monoterpenoides/248.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3932 0.4920 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/248.gxl b/datasets/Monoterpenoides/248.gxl new file mode 100644 index 0000000..57a4ba1 --- /dev/null +++ b/datasets/Monoterpenoides/248.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/249.ct b/datasets/Monoterpenoides/249.ct new file mode 100644 index 0000000..76bba24 --- /dev/null +++ b/datasets/Monoterpenoides/249.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3932 0.4920 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/249.gxl b/datasets/Monoterpenoides/249.gxl new file mode 100644 index 0000000..51057a3 --- /dev/null +++ b/datasets/Monoterpenoides/249.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/25.ct b/datasets/Monoterpenoides/25.ct new file mode 100644 index 0000000..98fb832 --- /dev/null +++ b/datasets/Monoterpenoides/25.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -4.2627 -1.0911 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -3.4124 0.2395 0.0000 O + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/25.gxl b/datasets/Monoterpenoides/25.gxl new file mode 100644 index 0000000..58fd268 --- /dev/null +++ b/datasets/Monoterpenoides/25.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/250.ct b/datasets/Monoterpenoides/250.ct new file mode 100644 index 0000000..717a443 --- /dev/null +++ b/datasets/Monoterpenoides/250.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 2 2 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/250.gxl b/datasets/Monoterpenoides/250.gxl new file mode 100644 index 0000000..1763d1c --- /dev/null +++ b/datasets/Monoterpenoides/250.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/251.ct b/datasets/Monoterpenoides/251.ct new file mode 100644 index 0000000..652b77a --- /dev/null +++ b/datasets/Monoterpenoides/251.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/251.gxl b/datasets/Monoterpenoides/251.gxl new file mode 100644 index 0000000..389eb99 --- /dev/null +++ b/datasets/Monoterpenoides/251.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/252.ct b/datasets/Monoterpenoides/252.ct new file mode 100644 index 0000000..d9be8e1 --- /dev/null +++ b/datasets/Monoterpenoides/252.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.2498 2.5545 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/252.gxl b/datasets/Monoterpenoides/252.gxl new file mode 100644 index 0000000..40706b0 --- /dev/null +++ b/datasets/Monoterpenoides/252.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/253.ct b/datasets/Monoterpenoides/253.ct new file mode 100644 index 0000000..cf147ce --- /dev/null +++ b/datasets/Monoterpenoides/253.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/253.gxl b/datasets/Monoterpenoides/253.gxl new file mode 100644 index 0000000..4593180 --- /dev/null +++ b/datasets/Monoterpenoides/253.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/254.ct b/datasets/Monoterpenoides/254.ct new file mode 100644 index 0000000..33393b3 --- /dev/null +++ b/datasets/Monoterpenoides/254.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 diff --git a/datasets/Monoterpenoides/254.gxl b/datasets/Monoterpenoides/254.gxl new file mode 100644 index 0000000..75dcfd9 --- /dev/null +++ b/datasets/Monoterpenoides/254.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/255.ct b/datasets/Monoterpenoides/255.ct new file mode 100644 index 0000000..7aeda52 --- /dev/null +++ b/datasets/Monoterpenoides/255.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 diff --git a/datasets/Monoterpenoides/255.gxl b/datasets/Monoterpenoides/255.gxl new file mode 100644 index 0000000..9a01b75 --- /dev/null +++ b/datasets/Monoterpenoides/255.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/256.ct b/datasets/Monoterpenoides/256.ct new file mode 100644 index 0000000..9eac7b2 --- /dev/null +++ b/datasets/Monoterpenoides/256.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3932 0.4920 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/256.gxl b/datasets/Monoterpenoides/256.gxl new file mode 100644 index 0000000..a09390a --- /dev/null +++ b/datasets/Monoterpenoides/256.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/257.ct b/datasets/Monoterpenoides/257.ct new file mode 100644 index 0000000..42acbdb --- /dev/null +++ b/datasets/Monoterpenoides/257.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.2723 2.7661 0.0000 C + -2.5476 2.7253 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/257.gxl b/datasets/Monoterpenoides/257.gxl new file mode 100644 index 0000000..db861fe --- /dev/null +++ b/datasets/Monoterpenoides/257.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/258.ct b/datasets/Monoterpenoides/258.ct new file mode 100644 index 0000000..40ea361 --- /dev/null +++ b/datasets/Monoterpenoides/258.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.2723 2.7661 0.0000 C + -2.5476 2.7253 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 2 11 1 1 diff --git a/datasets/Monoterpenoides/258.gxl b/datasets/Monoterpenoides/258.gxl new file mode 100644 index 0000000..c2641dd --- /dev/null +++ b/datasets/Monoterpenoides/258.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/259.ct b/datasets/Monoterpenoides/259.ct new file mode 100644 index 0000000..737a15e --- /dev/null +++ b/datasets/Monoterpenoides/259.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3932 0.4920 0.0000 O + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/259.gxl b/datasets/Monoterpenoides/259.gxl new file mode 100644 index 0000000..7ca6f85 --- /dev/null +++ b/datasets/Monoterpenoides/259.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/26.ct b/datasets/Monoterpenoides/26.ct new file mode 100644 index 0000000..0430e28 --- /dev/null +++ b/datasets/Monoterpenoides/26.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -4.2627 -1.0911 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -3.4124 0.2395 0.0000 O + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/26.gxl b/datasets/Monoterpenoides/26.gxl new file mode 100644 index 0000000..0b44801 --- /dev/null +++ b/datasets/Monoterpenoides/26.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/260.ct b/datasets/Monoterpenoides/260.ct new file mode 100644 index 0000000..85c2326 --- /dev/null +++ b/datasets/Monoterpenoides/260.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/260.gxl b/datasets/Monoterpenoides/260.gxl new file mode 100644 index 0000000..1e3c293 --- /dev/null +++ b/datasets/Monoterpenoides/260.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/261.ct b/datasets/Monoterpenoides/261.ct new file mode 100644 index 0000000..af0cbbe --- /dev/null +++ b/datasets/Monoterpenoides/261.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 O + -1.9643 2.9670 0.0000 C + -1.9643 -1.1581 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/261.gxl b/datasets/Monoterpenoides/261.gxl new file mode 100644 index 0000000..7945fe8 --- /dev/null +++ b/datasets/Monoterpenoides/261.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/262.ct b/datasets/Monoterpenoides/262.ct new file mode 100644 index 0000000..2e8bdff --- /dev/null +++ b/datasets/Monoterpenoides/262.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 0.4920 0.0000 O + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 2 2 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/262.gxl b/datasets/Monoterpenoides/262.gxl new file mode 100644 index 0000000..b8b6003 --- /dev/null +++ b/datasets/Monoterpenoides/262.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/263.ct b/datasets/Monoterpenoides/263.ct new file mode 100644 index 0000000..1e9280d --- /dev/null +++ b/datasets/Monoterpenoides/263.ct @@ -0,0 +1,27 @@ + + 12 13 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.2500 2.6545 0.0000 C + -2.5476 2.7253 0.0000 O + -3.3932 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 2 11 1 1 + 3 12 1 1 diff --git a/datasets/Monoterpenoides/263.gxl b/datasets/Monoterpenoides/263.gxl new file mode 100644 index 0000000..854a4d2 --- /dev/null +++ b/datasets/Monoterpenoides/263.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/264.ct b/datasets/Monoterpenoides/264.ct new file mode 100644 index 0000000..0f63aff --- /dev/null +++ b/datasets/Monoterpenoides/264.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -3.3932 0.4920 0.0000 O + -1.9643 2.9670 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 3 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/264.gxl b/datasets/Monoterpenoides/264.gxl new file mode 100644 index 0000000..471fa38 --- /dev/null +++ b/datasets/Monoterpenoides/264.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/265.ct b/datasets/Monoterpenoides/265.ct new file mode 100644 index 0000000..667d29b --- /dev/null +++ b/datasets/Monoterpenoides/265.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -3.3932 0.4920 0.0000 O + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 3 10 2 2 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/265.gxl b/datasets/Monoterpenoides/265.gxl new file mode 100644 index 0000000..49d5444 --- /dev/null +++ b/datasets/Monoterpenoides/265.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/266.ct b/datasets/Monoterpenoides/266.ct new file mode 100644 index 0000000..a6bdcde --- /dev/null +++ b/datasets/Monoterpenoides/266.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/266.gxl b/datasets/Monoterpenoides/266.gxl new file mode 100644 index 0000000..811eacd --- /dev/null +++ b/datasets/Monoterpenoides/266.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/267.ct b/datasets/Monoterpenoides/267.ct new file mode 100644 index 0000000..41427d1 --- /dev/null +++ b/datasets/Monoterpenoides/267.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -3.3932 0.4920 0.0000 O + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 5 5 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 5 5 + 7 8 5 5 + 7 9 1 1 + 3 10 5 5 + 1 11 1 1 + 8 10 5 5 diff --git a/datasets/Monoterpenoides/267.gxl b/datasets/Monoterpenoides/267.gxl new file mode 100644 index 0000000..a60e011 --- /dev/null +++ b/datasets/Monoterpenoides/267.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +5 + + +1 + + +1 + + +1 + + +5 + + +5 + + +1 + + +5 + + +1 + + +5 + + + diff --git a/datasets/Monoterpenoides/268.ct b/datasets/Monoterpenoides/268.ct new file mode 100644 index 0000000..2986d0f --- /dev/null +++ b/datasets/Monoterpenoides/268.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 0.4920 0.0000 O + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 2 2 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/268.gxl b/datasets/Monoterpenoides/268.gxl new file mode 100644 index 0000000..b78f4f3 --- /dev/null +++ b/datasets/Monoterpenoides/268.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/269.ct b/datasets/Monoterpenoides/269.ct new file mode 100644 index 0000000..a4ed533 --- /dev/null +++ b/datasets/Monoterpenoides/269.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 0.4920 0.0000 O + -0.5353 2.1420 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 1 1 + 6 12 2 2 diff --git a/datasets/Monoterpenoides/269.gxl b/datasets/Monoterpenoides/269.gxl new file mode 100644 index 0000000..60a6d03 --- /dev/null +++ b/datasets/Monoterpenoides/269.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/27.ct b/datasets/Monoterpenoides/27.ct new file mode 100644 index 0000000..096c047 --- /dev/null +++ b/datasets/Monoterpenoides/27.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -4.2627 -1.0911 0.0000 O + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.7636 -1.4755 0.0000 C + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 2 2 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/27.gxl b/datasets/Monoterpenoides/27.gxl new file mode 100644 index 0000000..60013e9 --- /dev/null +++ b/datasets/Monoterpenoides/27.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/270.ct b/datasets/Monoterpenoides/270.ct new file mode 100644 index 0000000..5235807 --- /dev/null +++ b/datasets/Monoterpenoides/270.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3932 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/270.gxl b/datasets/Monoterpenoides/270.gxl new file mode 100644 index 0000000..e7fc06d --- /dev/null +++ b/datasets/Monoterpenoides/270.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/271.ct b/datasets/Monoterpenoides/271.ct new file mode 100644 index 0000000..c88f194 --- /dev/null +++ b/datasets/Monoterpenoides/271.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/271.gxl b/datasets/Monoterpenoides/271.gxl new file mode 100644 index 0000000..397f22d --- /dev/null +++ b/datasets/Monoterpenoides/271.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/272.ct b/datasets/Monoterpenoides/272.ct new file mode 100644 index 0000000..1f0a5f9 --- /dev/null +++ b/datasets/Monoterpenoides/272.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/272.gxl b/datasets/Monoterpenoides/272.gxl new file mode 100644 index 0000000..be3ea9a --- /dev/null +++ b/datasets/Monoterpenoides/272.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/273.ct b/datasets/Monoterpenoides/273.ct new file mode 100644 index 0000000..4d78836 --- /dev/null +++ b/datasets/Monoterpenoides/273.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/273.gxl b/datasets/Monoterpenoides/273.gxl new file mode 100644 index 0000000..72e94e4 --- /dev/null +++ b/datasets/Monoterpenoides/273.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/274.ct b/datasets/Monoterpenoides/274.ct new file mode 100644 index 0000000..8688846 --- /dev/null +++ b/datasets/Monoterpenoides/274.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/274.gxl b/datasets/Monoterpenoides/274.gxl new file mode 100644 index 0000000..bf77c42 --- /dev/null +++ b/datasets/Monoterpenoides/274.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/275.ct b/datasets/Monoterpenoides/275.ct new file mode 100644 index 0000000..12dc594 --- /dev/null +++ b/datasets/Monoterpenoides/275.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/275.gxl b/datasets/Monoterpenoides/275.gxl new file mode 100644 index 0000000..0adbe42 --- /dev/null +++ b/datasets/Monoterpenoides/275.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/276.ct b/datasets/Monoterpenoides/276.ct new file mode 100644 index 0000000..6554f12 --- /dev/null +++ b/datasets/Monoterpenoides/276.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + -1.9643 -1.1581 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/276.gxl b/datasets/Monoterpenoides/276.gxl new file mode 100644 index 0000000..c3e4efa --- /dev/null +++ b/datasets/Monoterpenoides/276.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/277.ct b/datasets/Monoterpenoides/277.ct new file mode 100644 index 0000000..3f7ef44 --- /dev/null +++ b/datasets/Monoterpenoides/277.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + -1.9643 -1.1581 0.0000 S + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/277.gxl b/datasets/Monoterpenoides/277.gxl new file mode 100644 index 0000000..eb2ce94 --- /dev/null +++ b/datasets/Monoterpenoides/277.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +16 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/278.ct b/datasets/Monoterpenoides/278.ct new file mode 100644 index 0000000..7772e87 --- /dev/null +++ b/datasets/Monoterpenoides/278.ct @@ -0,0 +1,27 @@ + + 12 13 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + -2.6788 0.0794 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 + 7 12 1 1 + 4 12 1 1 diff --git a/datasets/Monoterpenoides/278.gxl b/datasets/Monoterpenoides/278.gxl new file mode 100644 index 0000000..57697cc --- /dev/null +++ b/datasets/Monoterpenoides/278.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/279.ct b/datasets/Monoterpenoides/279.ct new file mode 100644 index 0000000..4a1f12f --- /dev/null +++ b/datasets/Monoterpenoides/279.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/279.gxl b/datasets/Monoterpenoides/279.gxl new file mode 100644 index 0000000..9e1c873 --- /dev/null +++ b/datasets/Monoterpenoides/279.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/28.ct b/datasets/Monoterpenoides/28.ct new file mode 100644 index 0000000..29bd3e3 --- /dev/null +++ b/datasets/Monoterpenoides/28.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.7636 -1.4755 0.0000 C + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 diff --git a/datasets/Monoterpenoides/28.gxl b/datasets/Monoterpenoides/28.gxl new file mode 100644 index 0000000..088ba67 --- /dev/null +++ b/datasets/Monoterpenoides/28.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/280.ct b/datasets/Monoterpenoides/280.ct new file mode 100644 index 0000000..cae43c3 --- /dev/null +++ b/datasets/Monoterpenoides/280.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -3.3933 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/280.gxl b/datasets/Monoterpenoides/280.gxl new file mode 100644 index 0000000..29158d7 --- /dev/null +++ b/datasets/Monoterpenoides/280.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/281.ct b/datasets/Monoterpenoides/281.ct new file mode 100644 index 0000000..9a22a5b --- /dev/null +++ b/datasets/Monoterpenoides/281.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.9643 -1.1581 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/281.gxl b/datasets/Monoterpenoides/281.gxl new file mode 100644 index 0000000..f3df046 --- /dev/null +++ b/datasets/Monoterpenoides/281.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/282.ct b/datasets/Monoterpenoides/282.ct new file mode 100644 index 0000000..bcdbca8 --- /dev/null +++ b/datasets/Monoterpenoides/282.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/282.gxl b/datasets/Monoterpenoides/282.gxl new file mode 100644 index 0000000..e2966b4 --- /dev/null +++ b/datasets/Monoterpenoides/282.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/283.ct b/datasets/Monoterpenoides/283.ct new file mode 100644 index 0000000..f9632cf --- /dev/null +++ b/datasets/Monoterpenoides/283.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/283.gxl b/datasets/Monoterpenoides/283.gxl new file mode 100644 index 0000000..7ea2b98 --- /dev/null +++ b/datasets/Monoterpenoides/283.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/284.ct b/datasets/Monoterpenoides/284.ct new file mode 100644 index 0000000..69cb897 --- /dev/null +++ b/datasets/Monoterpenoides/284.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.2498 0.0794 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 4 11 1 1 diff --git a/datasets/Monoterpenoides/284.gxl b/datasets/Monoterpenoides/284.gxl new file mode 100644 index 0000000..0173ca3 --- /dev/null +++ b/datasets/Monoterpenoides/284.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/285.ct b/datasets/Monoterpenoides/285.ct new file mode 100644 index 0000000..7ff0e90 --- /dev/null +++ b/datasets/Monoterpenoides/285.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/285.gxl b/datasets/Monoterpenoides/285.gxl new file mode 100644 index 0000000..0d22223 --- /dev/null +++ b/datasets/Monoterpenoides/285.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/286.ct b/datasets/Monoterpenoides/286.ct new file mode 100644 index 0000000..e5bc0d5 --- /dev/null +++ b/datasets/Monoterpenoides/286.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/286.gxl b/datasets/Monoterpenoides/286.gxl new file mode 100644 index 0000000..400660b --- /dev/null +++ b/datasets/Monoterpenoides/286.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/287.ct b/datasets/Monoterpenoides/287.ct new file mode 100644 index 0000000..ed65c50 --- /dev/null +++ b/datasets/Monoterpenoides/287.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/287.gxl b/datasets/Monoterpenoides/287.gxl new file mode 100644 index 0000000..cad862c --- /dev/null +++ b/datasets/Monoterpenoides/287.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/288.ct b/datasets/Monoterpenoides/288.ct new file mode 100644 index 0000000..c84c15e --- /dev/null +++ b/datasets/Monoterpenoides/288.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/288.gxl b/datasets/Monoterpenoides/288.gxl new file mode 100644 index 0000000..bac4cd3 --- /dev/null +++ b/datasets/Monoterpenoides/288.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/289.ct b/datasets/Monoterpenoides/289.ct new file mode 100644 index 0000000..51fa46f --- /dev/null +++ b/datasets/Monoterpenoides/289.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 2.1420 0.0000 O + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/289.gxl b/datasets/Monoterpenoides/289.gxl new file mode 100644 index 0000000..78013be --- /dev/null +++ b/datasets/Monoterpenoides/289.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/29.ct b/datasets/Monoterpenoides/29.ct new file mode 100644 index 0000000..52071d4 --- /dev/null +++ b/datasets/Monoterpenoides/29.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 2 2 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 2 2 diff --git a/datasets/Monoterpenoides/29.gxl b/datasets/Monoterpenoides/29.gxl new file mode 100644 index 0000000..0abd259 --- /dev/null +++ b/datasets/Monoterpenoides/29.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/290.ct b/datasets/Monoterpenoides/290.ct new file mode 100644 index 0000000..66a0941 --- /dev/null +++ b/datasets/Monoterpenoides/290.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 0.4920 0.0000 O + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/290.gxl b/datasets/Monoterpenoides/290.gxl new file mode 100644 index 0000000..f4c370f --- /dev/null +++ b/datasets/Monoterpenoides/290.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/291.ct b/datasets/Monoterpenoides/291.ct new file mode 100644 index 0000000..8e410ad --- /dev/null +++ b/datasets/Monoterpenoides/291.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.9643 -1.1581 0.0000 O + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/291.gxl b/datasets/Monoterpenoides/291.gxl new file mode 100644 index 0000000..a89a69a --- /dev/null +++ b/datasets/Monoterpenoides/291.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/292.ct b/datasets/Monoterpenoides/292.ct new file mode 100644 index 0000000..106630b --- /dev/null +++ b/datasets/Monoterpenoides/292.ct @@ -0,0 +1,22 @@ + + 10 10 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 diff --git a/datasets/Monoterpenoides/292.gxl b/datasets/Monoterpenoides/292.gxl new file mode 100644 index 0000000..367a3f4 --- /dev/null +++ b/datasets/Monoterpenoides/292.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/293.ct b/datasets/Monoterpenoides/293.ct new file mode 100644 index 0000000..16c1bfa --- /dev/null +++ b/datasets/Monoterpenoides/293.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.2498 0.0794 0.0000 O + -0.5353 0.4920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 4 11 1 1 + 5 12 2 2 diff --git a/datasets/Monoterpenoides/293.gxl b/datasets/Monoterpenoides/293.gxl new file mode 100644 index 0000000..5c2290d --- /dev/null +++ b/datasets/Monoterpenoides/293.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/294.ct b/datasets/Monoterpenoides/294.ct new file mode 100644 index 0000000..d3fad6a --- /dev/null +++ b/datasets/Monoterpenoides/294.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.2498 0.0794 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 4 11 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/294.gxl b/datasets/Monoterpenoides/294.gxl new file mode 100644 index 0000000..520ee70 --- /dev/null +++ b/datasets/Monoterpenoides/294.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/295.ct b/datasets/Monoterpenoides/295.ct new file mode 100644 index 0000000..e87bdef --- /dev/null +++ b/datasets/Monoterpenoides/295.ct @@ -0,0 +1,24 @@ + + 11 11 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.2498 0.0794 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 2 2 + 1 10 1 1 + 4 11 1 1 diff --git a/datasets/Monoterpenoides/295.gxl b/datasets/Monoterpenoides/295.gxl new file mode 100644 index 0000000..278bc8a --- /dev/null +++ b/datasets/Monoterpenoides/295.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/296.ct b/datasets/Monoterpenoides/296.ct new file mode 100644 index 0000000..89044cf --- /dev/null +++ b/datasets/Monoterpenoides/296.ct @@ -0,0 +1,27 @@ + + 12 13 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.8527 1.6741 0.0000 O + -2.4361 1.0908 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 11 12 1 1 + 4 12 1 1 diff --git a/datasets/Monoterpenoides/296.gxl b/datasets/Monoterpenoides/296.gxl new file mode 100644 index 0000000..c83a687 --- /dev/null +++ b/datasets/Monoterpenoides/296.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/297.ct b/datasets/Monoterpenoides/297.ct new file mode 100644 index 0000000..1d1a2cb --- /dev/null +++ b/datasets/Monoterpenoides/297.ct @@ -0,0 +1,25 @@ + + 11 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -1.9643 1.3170 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 4 11 1 1 diff --git a/datasets/Monoterpenoides/297.gxl b/datasets/Monoterpenoides/297.gxl new file mode 100644 index 0000000..dff195b --- /dev/null +++ b/datasets/Monoterpenoides/297.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/298.ct b/datasets/Monoterpenoides/298.ct new file mode 100644 index 0000000..493ba91 --- /dev/null +++ b/datasets/Monoterpenoides/298.ct @@ -0,0 +1,26 @@ + + 12 12 + -1.9643 2.1420 0.0000 C + -2.6788 1.7295 0.0000 C + -2.6788 0.9045 0.0000 C + -1.9643 0.4919 0.0000 C + -1.2498 0.9045 0.0000 C + -1.2498 1.7295 0.0000 C + -1.9643 -0.3331 0.0000 C + -2.6788 -0.7456 0.0000 C + -1.2498 -0.7456 0.0000 C + -1.9643 2.9670 0.0000 C + -0.5353 -0.3331 0.0000 C + -1.2498 -1.5706 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 4 7 1 1 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 9 11 1 1 + 9 12 2 2 diff --git a/datasets/Monoterpenoides/298.gxl b/datasets/Monoterpenoides/298.gxl new file mode 100644 index 0000000..5b409bc --- /dev/null +++ b/datasets/Monoterpenoides/298.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/299.ct b/datasets/Monoterpenoides/299.ct new file mode 100644 index 0000000..d8673bd --- /dev/null +++ b/datasets/Monoterpenoides/299.ct @@ -0,0 +1,24 @@ + + 11 11 + -4.0625 3.4598 0.0000 C + -3.3480 3.8723 0.0000 C + -2.6336 3.4598 0.0000 C + -3.3480 4.6973 0.0000 C + -2.6336 2.6348 0.0000 C + -3.2169 2.0515 0.0000 C + -4.0653 2.1961 0.0000 C + -3.1092 1.2335 0.0000 C + -2.4200 1.8379 0.0000 C + -4.3585 2.9580 0.0000 C + -4.5880 1.5578 0.0000 O + 1 2 1 1 + 2 3 2 2 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 6 8 1 1 + 6 9 1 1 + 7 10 1 1 + 1 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/299.gxl b/datasets/Monoterpenoides/299.gxl new file mode 100644 index 0000000..0075456 --- /dev/null +++ b/datasets/Monoterpenoides/299.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/3.ct b/datasets/Monoterpenoides/3.ct new file mode 100644 index 0000000..2c0542a --- /dev/null +++ b/datasets/Monoterpenoides/3.ct @@ -0,0 +1,24 @@ + + 11 11 + -5.0223 0.0320 0.0000 O + -5.7368 0.4445 0.0000 C + -5.7368 1.2695 0.0000 C + -4.3079 1.2695 0.0000 C + -4.3079 0.4445 0.0000 C + -3.5934 0.0320 0.0000 C + -3.5934 0.8570 0.0000 C + -2.8789 0.4445 0.0000 C + -6.4512 0.0320 0.0000 C + -7.1657 0.4445 0.0000 C + -6.4513 -0.7930 0.0000 C + 1 2 1 1 + 1 5 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 5 7 1 1 + 7 8 2 2 + 2 9 1 1 + 9 10 1 1 + 9 11 2 2 diff --git a/datasets/Monoterpenoides/3.gxl b/datasets/Monoterpenoides/3.gxl new file mode 100644 index 0000000..afb062d --- /dev/null +++ b/datasets/Monoterpenoides/3.gxl @@ -0,0 +1,73 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/30.ct b/datasets/Monoterpenoides/30.ct new file mode 100644 index 0000000..a843c75 --- /dev/null +++ b/datasets/Monoterpenoides/30.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 O + -4.7636 -1.4755 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 2 2 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/30.gxl b/datasets/Monoterpenoides/30.gxl new file mode 100644 index 0000000..b4a7a12 --- /dev/null +++ b/datasets/Monoterpenoides/30.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/300.ct b/datasets/Monoterpenoides/300.ct new file mode 100644 index 0000000..f7dd1b3 --- /dev/null +++ b/datasets/Monoterpenoides/300.ct @@ -0,0 +1,24 @@ + + 11 11 + -3.2366 4.7536 0.0000 C + -3.9511 4.3411 0.0000 C + -3.9511 3.5161 0.0000 C + -3.2366 3.1036 0.0000 C + -2.5221 3.5161 0.0000 C + -2.5221 4.3411 0.0000 C + -3.2366 5.5786 0.0000 C + -3.2366 2.2786 0.0000 C + -2.5221 1.8661 0.0000 C + -3.9511 1.8661 0.0000 C + -2.5221 1.0411 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 4 8 2 2 + 8 9 1 1 + 8 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/300.gxl b/datasets/Monoterpenoides/300.gxl new file mode 100644 index 0000000..e122294 --- /dev/null +++ b/datasets/Monoterpenoides/300.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/301.ct b/datasets/Monoterpenoides/301.ct new file mode 100644 index 0000000..ae8a482 --- /dev/null +++ b/datasets/Monoterpenoides/301.ct @@ -0,0 +1,22 @@ + + 10 10 + -3.2366 4.7536 0.0000 C + -3.9511 4.3411 0.0000 C + -3.9511 3.5161 0.0000 C + -3.2366 3.1036 0.0000 C + -2.5221 3.5161 0.0000 C + -2.5221 4.3411 0.0000 C + -3.2366 5.5786 0.0000 C + -3.2366 2.2786 0.0000 C + -2.5221 1.8661 0.0000 C + -3.9511 1.8661 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 4 8 1 1 + 8 9 2 2 + 8 10 1 1 diff --git a/datasets/Monoterpenoides/301.gxl b/datasets/Monoterpenoides/301.gxl new file mode 100644 index 0000000..1d3efa7 --- /dev/null +++ b/datasets/Monoterpenoides/301.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/302.ct b/datasets/Monoterpenoides/302.ct new file mode 100644 index 0000000..86c336b --- /dev/null +++ b/datasets/Monoterpenoides/302.ct @@ -0,0 +1,24 @@ + + 11 11 + -4.0625 3.4598 0.0000 C + -3.3480 3.8723 0.0000 C + -2.6336 3.4598 0.0000 C + -3.3480 4.6973 0.0000 C + -2.6336 2.6348 0.0000 C + -3.2169 2.0515 0.0000 C + -4.0653 2.1961 0.0000 C + -3.1092 1.2335 0.0000 C + -2.4200 1.8379 0.0000 C + -4.3585 2.9580 0.0000 C + -4.5880 1.5578 0.0000 O + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 6 8 1 1 + 6 9 1 1 + 7 10 1 1 + 1 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/302.gxl b/datasets/Monoterpenoides/302.gxl new file mode 100644 index 0000000..1238fbb --- /dev/null +++ b/datasets/Monoterpenoides/302.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/31.ct b/datasets/Monoterpenoides/31.ct new file mode 100644 index 0000000..9da15fc --- /dev/null +++ b/datasets/Monoterpenoides/31.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 2 2 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 diff --git a/datasets/Monoterpenoides/31.gxl b/datasets/Monoterpenoides/31.gxl new file mode 100644 index 0000000..581291c --- /dev/null +++ b/datasets/Monoterpenoides/31.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/32.ct b/datasets/Monoterpenoides/32.ct new file mode 100644 index 0000000..e03face --- /dev/null +++ b/datasets/Monoterpenoides/32.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -4.1641 -1.8976 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/32.gxl b/datasets/Monoterpenoides/32.gxl new file mode 100644 index 0000000..4111c79 --- /dev/null +++ b/datasets/Monoterpenoides/32.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/33.ct b/datasets/Monoterpenoides/33.ct new file mode 100644 index 0000000..db003c8 --- /dev/null +++ b/datasets/Monoterpenoides/33.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -3.5457 0.0648 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/33.gxl b/datasets/Monoterpenoides/33.gxl new file mode 100644 index 0000000..253e4fa --- /dev/null +++ b/datasets/Monoterpenoides/33.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/34.ct b/datasets/Monoterpenoides/34.ct new file mode 100644 index 0000000..8952d3d --- /dev/null +++ b/datasets/Monoterpenoides/34.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -3.5457 0.0648 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/34.gxl b/datasets/Monoterpenoides/34.gxl new file mode 100644 index 0000000..a249c9f --- /dev/null +++ b/datasets/Monoterpenoides/34.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/35.ct b/datasets/Monoterpenoides/35.ct new file mode 100644 index 0000000..936f8be --- /dev/null +++ b/datasets/Monoterpenoides/35.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -4.2627 -0.2661 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 2 2 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/35.gxl b/datasets/Monoterpenoides/35.gxl new file mode 100644 index 0000000..1dc23bd --- /dev/null +++ b/datasets/Monoterpenoides/35.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/36.ct b/datasets/Monoterpenoides/36.ct new file mode 100644 index 0000000..5be3369 --- /dev/null +++ b/datasets/Monoterpenoides/36.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -4.2627 -0.2661 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 2 2 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/36.gxl b/datasets/Monoterpenoides/36.gxl new file mode 100644 index 0000000..15104b3 --- /dev/null +++ b/datasets/Monoterpenoides/36.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/37.ct b/datasets/Monoterpenoides/37.ct new file mode 100644 index 0000000..ea45b35 --- /dev/null +++ b/datasets/Monoterpenoides/37.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 2 2 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/37.gxl b/datasets/Monoterpenoides/37.gxl new file mode 100644 index 0000000..3a627a9 --- /dev/null +++ b/datasets/Monoterpenoides/37.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/38.ct b/datasets/Monoterpenoides/38.ct new file mode 100644 index 0000000..e1b46e8 --- /dev/null +++ b/datasets/Monoterpenoides/38.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/38.gxl b/datasets/Monoterpenoides/38.gxl new file mode 100644 index 0000000..3d89226 --- /dev/null +++ b/datasets/Monoterpenoides/38.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/39.ct b/datasets/Monoterpenoides/39.ct new file mode 100644 index 0000000..5d9ba15 --- /dev/null +++ b/datasets/Monoterpenoides/39.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 diff --git a/datasets/Monoterpenoides/39.gxl b/datasets/Monoterpenoides/39.gxl new file mode 100644 index 0000000..69997cb --- /dev/null +++ b/datasets/Monoterpenoides/39.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/4.ct b/datasets/Monoterpenoides/4.ct new file mode 100644 index 0000000..d1e509a --- /dev/null +++ b/datasets/Monoterpenoides/4.ct @@ -0,0 +1,24 @@ + + 11 11 + -5.4241 0.7804 0.0000 C + -6.1386 0.3679 0.0000 C + -6.1386 -0.4572 0.0000 C + -5.4241 -0.8697 0.0000 O + -4.7096 -0.4572 0.0000 C + -4.7096 0.3679 0.0000 C + -6.8530 -0.8696 0.0000 C + -6.8530 -0.0447 0.0000 C + -4.4639 -1.1821 0.0000 C + -3.7947 -0.3572 0.0000 C + -3.1497 -0.9414 0.0000 C + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 3 7 1 1 + 3 8 1 1 + 5 9 1 1 + 5 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/4.gxl b/datasets/Monoterpenoides/4.gxl new file mode 100644 index 0000000..b7ae3e2 --- /dev/null +++ b/datasets/Monoterpenoides/4.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/40.ct b/datasets/Monoterpenoides/40.ct new file mode 100644 index 0000000..53047e9 --- /dev/null +++ b/datasets/Monoterpenoides/40.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 2 2 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 2 2 diff --git a/datasets/Monoterpenoides/40.gxl b/datasets/Monoterpenoides/40.gxl new file mode 100644 index 0000000..ff35571 --- /dev/null +++ b/datasets/Monoterpenoides/40.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/41.ct b/datasets/Monoterpenoides/41.ct new file mode 100644 index 0000000..f83c843 --- /dev/null +++ b/datasets/Monoterpenoides/41.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -3.4124 0.2395 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 5 11 1 1 diff --git a/datasets/Monoterpenoides/41.gxl b/datasets/Monoterpenoides/41.gxl new file mode 100644 index 0000000..5c14957 --- /dev/null +++ b/datasets/Monoterpenoides/41.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/42.ct b/datasets/Monoterpenoides/42.ct new file mode 100644 index 0000000..3c352d0 --- /dev/null +++ b/datasets/Monoterpenoides/42.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -3.4124 0.2395 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 5 11 2 2 diff --git a/datasets/Monoterpenoides/42.gxl b/datasets/Monoterpenoides/42.gxl new file mode 100644 index 0000000..285b80d --- /dev/null +++ b/datasets/Monoterpenoides/42.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/43.ct b/datasets/Monoterpenoides/43.ct new file mode 100644 index 0000000..f62da0c --- /dev/null +++ b/datasets/Monoterpenoides/43.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 2 2 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/43.gxl b/datasets/Monoterpenoides/43.gxl new file mode 100644 index 0000000..d0441f5 --- /dev/null +++ b/datasets/Monoterpenoides/43.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/44.ct b/datasets/Monoterpenoides/44.ct new file mode 100644 index 0000000..fd034b6 --- /dev/null +++ b/datasets/Monoterpenoides/44.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -4.2388 -1.9268 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/44.gxl b/datasets/Monoterpenoides/44.gxl new file mode 100644 index 0000000..4a20c97 --- /dev/null +++ b/datasets/Monoterpenoides/44.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/45.ct b/datasets/Monoterpenoides/45.ct new file mode 100644 index 0000000..782b249 --- /dev/null +++ b/datasets/Monoterpenoides/45.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -4.2627 -0.2661 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 2 2 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/45.gxl b/datasets/Monoterpenoides/45.gxl new file mode 100644 index 0000000..7d9380a --- /dev/null +++ b/datasets/Monoterpenoides/45.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/46.ct b/datasets/Monoterpenoides/46.ct new file mode 100644 index 0000000..cd1617e --- /dev/null +++ b/datasets/Monoterpenoides/46.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 C + -4.2627 -0.2661 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 2 2 + 6 11 1 1 diff --git a/datasets/Monoterpenoides/46.gxl b/datasets/Monoterpenoides/46.gxl new file mode 100644 index 0000000..7f3810a --- /dev/null +++ b/datasets/Monoterpenoides/46.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/47.ct b/datasets/Monoterpenoides/47.ct new file mode 100644 index 0000000..2e86064 --- /dev/null +++ b/datasets/Monoterpenoides/47.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2056 -1.0737 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/47.gxl b/datasets/Monoterpenoides/47.gxl new file mode 100644 index 0000000..5bad096 --- /dev/null +++ b/datasets/Monoterpenoides/47.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/48.ct b/datasets/Monoterpenoides/48.ct new file mode 100644 index 0000000..9e0fca5 --- /dev/null +++ b/datasets/Monoterpenoides/48.ct @@ -0,0 +1,21 @@ + + 10 9 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 2 2 + 7 10 1 1 diff --git a/datasets/Monoterpenoides/48.gxl b/datasets/Monoterpenoides/48.gxl new file mode 100644 index 0000000..e513df1 --- /dev/null +++ b/datasets/Monoterpenoides/48.gxl @@ -0,0 +1,64 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/49.ct b/datasets/Monoterpenoides/49.ct new file mode 100644 index 0000000..5414616 --- /dev/null +++ b/datasets/Monoterpenoides/49.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 O + -6.2725 0.2357 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 2 2 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/49.gxl b/datasets/Monoterpenoides/49.gxl new file mode 100644 index 0000000..d681a3b --- /dev/null +++ b/datasets/Monoterpenoides/49.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/5.ct b/datasets/Monoterpenoides/5.ct new file mode 100644 index 0000000..8ca0205 --- /dev/null +++ b/datasets/Monoterpenoides/5.ct @@ -0,0 +1,26 @@ + + 12 12 + -5.4241 0.7804 0.0000 C + -6.1386 0.3679 0.0000 C + -6.1386 -0.4572 0.0000 C + -5.4241 -0.8697 0.0000 O + -4.7096 -0.4572 0.0000 C + -4.7096 0.3679 0.0000 C + -6.8530 -0.8696 0.0000 C + -6.8530 -0.0447 0.0000 C + -4.4639 -1.1821 0.0000 C + -3.7947 -0.3572 0.0000 C + -3.1497 -0.9414 0.0000 C + -6.8530 0.7804 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 3 7 1 1 + 3 8 1 1 + 5 9 1 1 + 5 10 1 1 + 10 11 2 2 + 2 12 2 2 diff --git a/datasets/Monoterpenoides/5.gxl b/datasets/Monoterpenoides/5.gxl new file mode 100644 index 0000000..c65e267 --- /dev/null +++ b/datasets/Monoterpenoides/5.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/50.ct b/datasets/Monoterpenoides/50.ct new file mode 100644 index 0000000..c1117ac --- /dev/null +++ b/datasets/Monoterpenoides/50.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 O + -6.2725 0.2357 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/50.gxl b/datasets/Monoterpenoides/50.gxl new file mode 100644 index 0000000..11de708 --- /dev/null +++ b/datasets/Monoterpenoides/50.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/51.ct b/datasets/Monoterpenoides/51.ct new file mode 100644 index 0000000..b65981b --- /dev/null +++ b/datasets/Monoterpenoides/51.ct @@ -0,0 +1,27 @@ + + 13 12 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.2725 0.2357 0.0000 O + -6.3549 0.8617 0.0000 O + -4.1802 -0.0671 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 + 9 12 2 2 + 6 13 2 2 diff --git a/datasets/Monoterpenoides/51.gxl b/datasets/Monoterpenoides/51.gxl new file mode 100644 index 0000000..e435332 --- /dev/null +++ b/datasets/Monoterpenoides/51.gxl @@ -0,0 +1,82 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/52.ct b/datasets/Monoterpenoides/52.ct new file mode 100644 index 0000000..7e0cf5c --- /dev/null +++ b/datasets/Monoterpenoides/52.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.2725 0.2357 0.0000 O + -6.3549 0.8617 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 + 9 12 2 2 diff --git a/datasets/Monoterpenoides/52.gxl b/datasets/Monoterpenoides/52.gxl new file mode 100644 index 0000000..9475cf5 --- /dev/null +++ b/datasets/Monoterpenoides/52.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/53.ct b/datasets/Monoterpenoides/53.ct new file mode 100644 index 0000000..6686f04 --- /dev/null +++ b/datasets/Monoterpenoides/53.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.3102 0.0135 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 2 2 diff --git a/datasets/Monoterpenoides/53.gxl b/datasets/Monoterpenoides/53.gxl new file mode 100644 index 0000000..be72f7a --- /dev/null +++ b/datasets/Monoterpenoides/53.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/54.ct b/datasets/Monoterpenoides/54.ct new file mode 100644 index 0000000..d3b200e --- /dev/null +++ b/datasets/Monoterpenoides/54.ct @@ -0,0 +1,24 @@ + + 11 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -5.5580 0.6482 0.0000 C + -3.4146 0.2357 0.0000 C + -4.8435 0.2357 0.0000 O + -3.4146 -0.5893 0.0000 C + -2.7002 -1.0018 0.0000 O + -4.1291 -1.0018 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 1 6 1 1 + 5 7 1 1 + 6 8 1 1 + 5 8 1 1 + 7 9 1 1 + 9 10 2 2 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/54.gxl b/datasets/Monoterpenoides/54.gxl new file mode 100644 index 0000000..9e5c231 --- /dev/null +++ b/datasets/Monoterpenoides/54.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/55.ct b/datasets/Monoterpenoides/55.ct new file mode 100644 index 0000000..bb1d70d --- /dev/null +++ b/datasets/Monoterpenoides/55.ct @@ -0,0 +1,24 @@ + + 11 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -5.5580 0.6482 0.0000 C + -3.4146 0.2357 0.0000 C + -4.8435 0.2357 0.0000 O + -3.4146 -0.5893 0.0000 C + -2.7002 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 1 6 1 1 + 5 7 1 1 + 6 8 1 1 + 5 8 1 1 + 7 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/55.gxl b/datasets/Monoterpenoides/55.gxl new file mode 100644 index 0000000..461cd15 --- /dev/null +++ b/datasets/Monoterpenoides/55.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/56.ct b/datasets/Monoterpenoides/56.ct new file mode 100644 index 0000000..2ddcc2b --- /dev/null +++ b/datasets/Monoterpenoides/56.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 O + -6.2725 0.2357 0.0000 O + -4.9771 -1.5036 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 2 2 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/56.gxl b/datasets/Monoterpenoides/56.gxl new file mode 100644 index 0000000..0b5727a --- /dev/null +++ b/datasets/Monoterpenoides/56.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/57.ct b/datasets/Monoterpenoides/57.ct new file mode 100644 index 0000000..28becdb --- /dev/null +++ b/datasets/Monoterpenoides/57.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.2725 0.2357 0.0000 O + -4.1802 -0.0671 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 2 2 + 9 11 1 1 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/57.gxl b/datasets/Monoterpenoides/57.gxl new file mode 100644 index 0000000..5f444ce --- /dev/null +++ b/datasets/Monoterpenoides/57.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/58.ct b/datasets/Monoterpenoides/58.ct new file mode 100644 index 0000000..16f62d3 --- /dev/null +++ b/datasets/Monoterpenoides/58.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.2725 0.2357 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/58.gxl b/datasets/Monoterpenoides/58.gxl new file mode 100644 index 0000000..ffe6372 --- /dev/null +++ b/datasets/Monoterpenoides/58.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/59.ct b/datasets/Monoterpenoides/59.ct new file mode 100644 index 0000000..ba43d6b --- /dev/null +++ b/datasets/Monoterpenoides/59.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.2725 0.2357 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/59.gxl b/datasets/Monoterpenoides/59.gxl new file mode 100644 index 0000000..402a478 --- /dev/null +++ b/datasets/Monoterpenoides/59.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/6.ct b/datasets/Monoterpenoides/6.ct new file mode 100644 index 0000000..04467fb --- /dev/null +++ b/datasets/Monoterpenoides/6.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -5.5580 0.6482 0.0000 C + -3.4146 1.8857 0.0000 O + -4.1291 0.6482 0.0000 C + -4.8436 0.2357 0.0000 C + -4.8436 -0.5893 0.0000 C + -5.5580 -1.0018 0.0000 C + -4.1291 -1.0018 0.0000 C + 1 2 1 1 + 2 3 1 1 + 2 4 1 1 + 1 5 2 2 + 3 6 1 1 + 3 7 1 1 + 7 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/6.gxl b/datasets/Monoterpenoides/6.gxl new file mode 100644 index 0000000..1265e51 --- /dev/null +++ b/datasets/Monoterpenoides/6.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/60.ct b/datasets/Monoterpenoides/60.ct new file mode 100644 index 0000000..1603fc0 --- /dev/null +++ b/datasets/Monoterpenoides/60.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.3437 3.5706 0.0000 C + -8.0582 3.1580 0.0000 C + -8.0582 2.3330 0.0000 C + -7.3437 1.9205 0.0000 C + -6.6293 2.3330 0.0000 C + -6.6293 3.1580 0.0000 C + -7.9271 4.1539 0.0000 C + -6.7604 4.1539 0.0000 C + -5.9148 1.9205 0.0000 C + -7.3437 1.0955 0.0000 O + -8.7727 3.5705 0.0000 C + -8.7757 4.5720 0.0000 O + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 1 7 1 1 + 1 8 1 1 + 5 9 1 1 + 4 10 1 1 + 2 11 1 1 + 11 12 2 2 diff --git a/datasets/Monoterpenoides/60.gxl b/datasets/Monoterpenoides/60.gxl new file mode 100644 index 0000000..fec54de --- /dev/null +++ b/datasets/Monoterpenoides/60.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/61.ct b/datasets/Monoterpenoides/61.ct new file mode 100644 index 0000000..661c4f4 --- /dev/null +++ b/datasets/Monoterpenoides/61.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -8.6829 2.4902 0.0000 C + -10.1105 2.4678 0.0000 O + -9.8098 3.2150 0.0000 C + -9.1838 3.1326 0.0000 C + -7.9684 5.5795 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 5 7 1 1 + 7 8 1 1 + 3 8 1 1 + 4 9 1 1 + 4 10 1 1 + 6 11 2 2 diff --git a/datasets/Monoterpenoides/61.gxl b/datasets/Monoterpenoides/61.gxl new file mode 100644 index 0000000..6c55f09 --- /dev/null +++ b/datasets/Monoterpenoides/61.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/62.ct b/datasets/Monoterpenoides/62.ct new file mode 100644 index 0000000..4594a16 --- /dev/null +++ b/datasets/Monoterpenoides/62.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 2 2 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 2 2 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/62.gxl b/datasets/Monoterpenoides/62.gxl new file mode 100644 index 0000000..000a173 --- /dev/null +++ b/datasets/Monoterpenoides/62.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/63.ct b/datasets/Monoterpenoides/63.ct new file mode 100644 index 0000000..de40cad --- /dev/null +++ b/datasets/Monoterpenoides/63.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 2 2 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/63.gxl b/datasets/Monoterpenoides/63.gxl new file mode 100644 index 0000000..442888a --- /dev/null +++ b/datasets/Monoterpenoides/63.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/64.ct b/datasets/Monoterpenoides/64.ct new file mode 100644 index 0000000..f6ca726 --- /dev/null +++ b/datasets/Monoterpenoides/64.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/64.gxl b/datasets/Monoterpenoides/64.gxl new file mode 100644 index 0000000..fee4dfe --- /dev/null +++ b/datasets/Monoterpenoides/64.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/65.ct b/datasets/Monoterpenoides/65.ct new file mode 100644 index 0000000..66bcbdf --- /dev/null +++ b/datasets/Monoterpenoides/65.ct @@ -0,0 +1,26 @@ + + 12 12 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + -7.2539 5.1670 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 7 12 2 2 diff --git a/datasets/Monoterpenoides/65.gxl b/datasets/Monoterpenoides/65.gxl new file mode 100644 index 0000000..a85889c --- /dev/null +++ b/datasets/Monoterpenoides/65.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/66.ct b/datasets/Monoterpenoides/66.ct new file mode 100644 index 0000000..2ce338c --- /dev/null +++ b/datasets/Monoterpenoides/66.ct @@ -0,0 +1,25 @@ + + 12 11 + -10.8705 10.0438 0.0000 C + -11.5850 9.6313 0.0000 C + -12.4332 10.2348 0.0000 C + -10.8705 8.3937 0.0000 C + -10.1561 8.8062 0.0000 C + -10.1561 9.6313 0.0000 C + -10.8705 7.5687 0.0000 C + -11.5850 7.1562 0.0000 C + -10.1560 7.1562 0.0000 C + -10.8705 10.8688 0.0000 C + -13.1835 9.8918 0.0000 O + -12.3551 11.0561 0.0000 O + 1 2 2 2 + 2 3 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 1 1 + 3 12 2 2 diff --git a/datasets/Monoterpenoides/66.gxl b/datasets/Monoterpenoides/66.gxl new file mode 100644 index 0000000..a0049a9 --- /dev/null +++ b/datasets/Monoterpenoides/66.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/67.ct b/datasets/Monoterpenoides/67.ct new file mode 100644 index 0000000..0ccb05e --- /dev/null +++ b/datasets/Monoterpenoides/67.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.8705 10.0438 0.0000 C + -11.5850 9.6313 0.0000 C + -12.4332 10.2348 0.0000 C + -10.8705 8.3937 0.0000 C + -10.1561 8.8062 0.0000 C + -10.1561 9.6313 0.0000 C + -10.8705 7.5687 0.0000 C + -11.5850 7.1562 0.0000 C + -10.1560 7.1562 0.0000 C + -10.8705 10.8688 0.0000 C + -13.1835 9.8918 0.0000 O + 1 2 2 2 + 2 3 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 2 2 diff --git a/datasets/Monoterpenoides/67.gxl b/datasets/Monoterpenoides/67.gxl new file mode 100644 index 0000000..a2722bc --- /dev/null +++ b/datasets/Monoterpenoides/67.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/68.ct b/datasets/Monoterpenoides/68.ct new file mode 100644 index 0000000..ca39f4f --- /dev/null +++ b/datasets/Monoterpenoides/68.ct @@ -0,0 +1,25 @@ + + 12 11 + -10.8705 10.0438 0.0000 C + -11.5850 9.6313 0.0000 C + -12.4332 10.2348 0.0000 C + -10.8705 8.3937 0.0000 C + -10.1561 8.8062 0.0000 C + -10.1561 9.6313 0.0000 C + -10.8705 7.5687 0.0000 C + -11.5850 7.1562 0.0000 C + -10.1560 7.1562 0.0000 C + -10.8705 10.8688 0.0000 C + -13.1835 9.8918 0.0000 O + -10.1560 6.3312 0.0000 O + 1 2 2 2 + 2 3 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 1 1 + 9 12 1 1 diff --git a/datasets/Monoterpenoides/68.gxl b/datasets/Monoterpenoides/68.gxl new file mode 100644 index 0000000..56639c3 --- /dev/null +++ b/datasets/Monoterpenoides/68.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/69.ct b/datasets/Monoterpenoides/69.ct new file mode 100644 index 0000000..401d607 --- /dev/null +++ b/datasets/Monoterpenoides/69.ct @@ -0,0 +1,23 @@ + + 11 10 + -10.8705 10.0438 0.0000 C + -11.5850 9.6313 0.0000 C + -12.4332 10.2348 0.0000 C + -10.8705 8.3937 0.0000 C + -10.1561 8.8062 0.0000 C + -10.1561 9.6313 0.0000 C + -10.8705 7.5687 0.0000 C + -11.5850 7.1562 0.0000 C + -10.1560 7.1562 0.0000 C + -10.8705 10.8688 0.0000 C + -13.1835 9.8918 0.0000 O + 1 2 2 2 + 2 3 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 4 7 2 2 + 7 8 1 1 + 7 9 1 1 + 1 10 1 1 + 3 11 1 1 diff --git a/datasets/Monoterpenoides/69.gxl b/datasets/Monoterpenoides/69.gxl new file mode 100644 index 0000000..1b27143 --- /dev/null +++ b/datasets/Monoterpenoides/69.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/7.ct b/datasets/Monoterpenoides/7.ct new file mode 100644 index 0000000..8a7f8a2 --- /dev/null +++ b/datasets/Monoterpenoides/7.ct @@ -0,0 +1,24 @@ + + 11 11 + -3.8616 1.4859 0.0000 C + -3.1472 1.0734 0.0000 C + -3.1472 0.2484 0.0000 C + -4.5761 0.2484 0.0000 C + -4.5761 1.0734 0.0000 C + -3.8616 2.3109 0.0000 O + -4.5761 1.8984 0.0000 C + -2.4327 1.4859 0.0000 C + -2.5638 -0.3350 0.0000 C + -2.7773 -1.1319 0.0000 C + -1.7669 -0.1214 0.0000 C + 1 2 1 1 + 1 5 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 1 6 1 1 + 1 7 1 1 + 2 8 1 1 + 3 9 1 1 + 9 10 2 2 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/7.gxl b/datasets/Monoterpenoides/7.gxl new file mode 100644 index 0000000..cfc1d9a --- /dev/null +++ b/datasets/Monoterpenoides/7.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/70.ct b/datasets/Monoterpenoides/70.ct new file mode 100644 index 0000000..53a8568 --- /dev/null +++ b/datasets/Monoterpenoides/70.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.3437 3.5706 0.0000 C + -8.0582 3.1580 0.0000 C + -8.0582 2.3330 0.0000 C + -7.3437 1.9205 0.0000 C + -6.6293 2.3330 0.0000 C + -6.6293 3.1580 0.0000 C + -7.9271 4.1539 0.0000 C + -6.7604 4.1539 0.0000 C + -5.9148 1.9205 0.0000 C + -7.3437 1.0955 0.0000 O + -5.9148 3.5704 0.0000 C + -5.9147 4.3954 0.0000 O + 1 2 1 1 + 2 3 2 2 + 3 4 1 1 + 4 5 1 1 + 5 6 2 2 + 1 6 1 1 + 1 7 1 1 + 1 8 1 1 + 5 9 1 1 + 4 10 1 1 + 6 11 1 1 + 11 12 2 2 diff --git a/datasets/Monoterpenoides/70.gxl b/datasets/Monoterpenoides/70.gxl new file mode 100644 index 0000000..a6cdf8e --- /dev/null +++ b/datasets/Monoterpenoides/70.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +8 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/71.ct b/datasets/Monoterpenoides/71.ct new file mode 100644 index 0000000..2141204 --- /dev/null +++ b/datasets/Monoterpenoides/71.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 2 2 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/71.gxl b/datasets/Monoterpenoides/71.gxl new file mode 100644 index 0000000..d3d014e --- /dev/null +++ b/datasets/Monoterpenoides/71.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/72.ct b/datasets/Monoterpenoides/72.ct new file mode 100644 index 0000000..246bb91 --- /dev/null +++ b/datasets/Monoterpenoides/72.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 diff --git a/datasets/Monoterpenoides/72.gxl b/datasets/Monoterpenoides/72.gxl new file mode 100644 index 0000000..6b0995c --- /dev/null +++ b/datasets/Monoterpenoides/72.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/73.ct b/datasets/Monoterpenoides/73.ct new file mode 100644 index 0000000..b75c7f9 --- /dev/null +++ b/datasets/Monoterpenoides/73.ct @@ -0,0 +1,26 @@ + + 12 12 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 5.5795 0.0000 C + -7.9684 3.9295 0.0000 C + -7.9684 6.4045 0.0000 O + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + -7.2539 5.1670 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 2 2 + 5 6 1 1 + 1 6 1 1 + 6 7 1 1 + 5 8 1 1 + 7 9 1 1 + 1 10 1 1 + 1 11 1 1 + 7 12 2 2 diff --git a/datasets/Monoterpenoides/73.gxl b/datasets/Monoterpenoides/73.gxl new file mode 100644 index 0000000..84a518f --- /dev/null +++ b/datasets/Monoterpenoides/73.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/74.ct b/datasets/Monoterpenoides/74.ct new file mode 100644 index 0000000..c0fdf0b --- /dev/null +++ b/datasets/Monoterpenoides/74.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 3.9295 0.0000 C + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + -7.9684 3.1045 0.0000 C + -7.2539 2.6920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 5 7 2 2 + 1 8 1 1 + 1 9 1 1 + 7 10 1 1 + 10 11 2 2 diff --git a/datasets/Monoterpenoides/74.gxl b/datasets/Monoterpenoides/74.gxl new file mode 100644 index 0000000..99558c8 --- /dev/null +++ b/datasets/Monoterpenoides/74.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/75.ct b/datasets/Monoterpenoides/75.ct new file mode 100644 index 0000000..832b351 --- /dev/null +++ b/datasets/Monoterpenoides/75.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.3973 5.5795 0.0000 C + -10.1118 5.1670 0.0000 C + -10.1118 4.3420 0.0000 C + -9.3973 3.9294 0.0000 C + -8.6829 4.3420 0.0000 C + -8.6829 5.1670 0.0000 C + -7.9684 3.9295 0.0000 C + -9.9807 6.1628 0.0000 C + -8.6829 5.9920 0.0000 C + -7.9684 3.1045 0.0000 C + -7.2539 2.6920 0.0000 O + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 5 7 2 2 + 1 8 1 1 + 1 9 1 1 + 7 10 1 1 + 10 11 1 1 diff --git a/datasets/Monoterpenoides/75.gxl b/datasets/Monoterpenoides/75.gxl new file mode 100644 index 0000000..e3be0b5 --- /dev/null +++ b/datasets/Monoterpenoides/75.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/76.ct b/datasets/Monoterpenoides/76.ct new file mode 100644 index 0000000..ae6fea4 --- /dev/null +++ b/datasets/Monoterpenoides/76.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.2725 0.2357 0.0000 O + 1 2 1 1 + 2 3 1 1 + 2 4 2 2 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/76.gxl b/datasets/Monoterpenoides/76.gxl new file mode 100644 index 0000000..8858bf1 --- /dev/null +++ b/datasets/Monoterpenoides/76.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/77.ct b/datasets/Monoterpenoides/77.ct new file mode 100644 index 0000000..5ec766d --- /dev/null +++ b/datasets/Monoterpenoides/77.ct @@ -0,0 +1,26 @@ + + 12 12 + -6.8750 3.9189 0.0000 C + -6.1605 3.5064 0.0000 C + -6.1605 2.6814 0.0000 C + -7.5894 2.6814 0.0000 C + -7.5894 3.5064 0.0000 C + -6.8750 4.7439 0.0000 C + -5.4461 3.9189 0.0000 C + -5.4461 2.2689 0.0000 C + -4.7316 2.6814 0.0000 C + -5.4461 1.4439 0.0000 C + -4.0171 2.2689 0.0000 O + -4.6492 3.7054 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 2 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 9 11 2 2 + 7 12 2 2 diff --git a/datasets/Monoterpenoides/77.gxl b/datasets/Monoterpenoides/77.gxl new file mode 100644 index 0000000..5d6a15f --- /dev/null +++ b/datasets/Monoterpenoides/77.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/78.ct b/datasets/Monoterpenoides/78.ct new file mode 100644 index 0000000..e70012c --- /dev/null +++ b/datasets/Monoterpenoides/78.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8750 3.9189 0.0000 C + -6.1605 3.5064 0.0000 C + -6.1605 2.6814 0.0000 C + -7.5894 2.6814 0.0000 C + -7.5894 3.5064 0.0000 C + -6.8750 4.7439 0.0000 C + -5.4461 3.9189 0.0000 C + -5.4461 2.2689 0.0000 C + -4.7316 2.6814 0.0000 C + -5.4461 1.4439 0.0000 C + -4.6492 3.7054 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 2 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 2 2 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/78.gxl b/datasets/Monoterpenoides/78.gxl new file mode 100644 index 0000000..da94d23 --- /dev/null +++ b/datasets/Monoterpenoides/78.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/79.ct b/datasets/Monoterpenoides/79.ct new file mode 100644 index 0000000..48cd3ce --- /dev/null +++ b/datasets/Monoterpenoides/79.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.6466 4.6875 0.0000 O + -7.2341 5.4020 0.0000 C + -6.5430 5.0671 0.0000 C + -6.5430 4.3525 0.0000 C + -7.2341 3.9730 0.0000 C + -5.9597 3.7692 0.0000 C + -7.2341 3.1480 0.0000 C + -7.9486 2.7355 0.0000 O + -6.5196 2.7355 0.0000 C + -6.5196 1.9105 0.0000 C + -5.8052 1.4980 0.0000 C + -7.2341 1.4980 0.0000 C + 1 2 5 5 + 2 3 5 5 + 4 5 5 5 + 1 5 5 5 + 3 4 5 5 + 4 6 1 1 + 5 7 1 1 + 7 8 2 2 + 7 9 1 1 + 9 10 1 1 + 10 11 1 1 + 10 12 1 1 diff --git a/datasets/Monoterpenoides/79.gxl b/datasets/Monoterpenoides/79.gxl new file mode 100644 index 0000000..90ff09d --- /dev/null +++ b/datasets/Monoterpenoides/79.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/8.ct b/datasets/Monoterpenoides/8.ct new file mode 100644 index 0000000..bfe31a3 --- /dev/null +++ b/datasets/Monoterpenoides/8.ct @@ -0,0 +1,26 @@ + + 12 12 + -5.0223 0.0320 0.0000 O + -5.7368 0.4445 0.0000 C + -5.7368 1.2695 0.0000 C + -4.3079 1.2695 0.0000 C + -4.3079 0.4445 0.0000 C + -3.5934 0.0320 0.0000 C + -3.5934 0.8570 0.0000 C + -2.8789 0.4445 0.0000 C + -6.4512 0.0320 0.0000 C + -7.1657 0.4445 0.0000 O + -6.4513 -0.7930 0.0000 C + -5.7367 -0.3805 0.0000 C + 1 2 1 1 + 1 5 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 5 7 1 1 + 7 8 2 2 + 2 9 1 1 + 9 10 1 1 + 9 11 1 1 + 9 12 1 1 diff --git a/datasets/Monoterpenoides/8.gxl b/datasets/Monoterpenoides/8.gxl new file mode 100644 index 0000000..b19ced5 --- /dev/null +++ b/datasets/Monoterpenoides/8.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/80.ct b/datasets/Monoterpenoides/80.ct new file mode 100644 index 0000000..8376185 --- /dev/null +++ b/datasets/Monoterpenoides/80.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.6466 4.6875 0.0000 O + -7.2341 5.4020 0.0000 C + -6.5430 5.0671 0.0000 C + -6.5430 4.3525 0.0000 C + -7.2341 3.9730 0.0000 C + -5.9597 3.7692 0.0000 C + -7.2341 3.1480 0.0000 C + -7.9486 2.7355 0.0000 O + -6.5196 2.7355 0.0000 C + -6.5196 1.9105 0.0000 C + -5.8052 1.4980 0.0000 C + -7.2341 1.4980 0.0000 C + 1 2 5 5 + 2 3 5 5 + 4 5 5 5 + 1 5 5 5 + 3 4 5 5 + 4 6 1 1 + 5 7 1 1 + 7 8 2 2 + 7 9 1 1 + 9 10 2 2 + 10 11 1 1 + 10 12 1 1 diff --git a/datasets/Monoterpenoides/80.gxl b/datasets/Monoterpenoides/80.gxl new file mode 100644 index 0000000..2661695 --- /dev/null +++ b/datasets/Monoterpenoides/80.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +2 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/81.ct b/datasets/Monoterpenoides/81.ct new file mode 100644 index 0000000..caf3791 --- /dev/null +++ b/datasets/Monoterpenoides/81.ct @@ -0,0 +1,24 @@ + + 11 11 + -7.6466 4.6875 0.0000 O + -7.2341 5.4020 0.0000 C + -6.5430 5.0671 0.0000 C + -6.5430 4.3525 0.0000 C + -7.2341 3.9730 0.0000 C + -5.9597 3.7692 0.0000 C + -7.2341 3.1480 0.0000 C + -6.5196 2.7355 0.0000 C + -6.5196 1.9105 0.0000 C + -5.8052 1.4980 0.0000 C + -7.2341 1.4980 0.0000 C + 1 2 5 5 + 2 3 5 5 + 4 5 5 5 + 1 5 5 5 + 3 4 5 5 + 4 6 1 1 + 5 7 1 1 + 7 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/81.gxl b/datasets/Monoterpenoides/81.gxl new file mode 100644 index 0000000..169e068 --- /dev/null +++ b/datasets/Monoterpenoides/81.gxl @@ -0,0 +1,73 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/82.ct b/datasets/Monoterpenoides/82.ct new file mode 100644 index 0000000..ef09834 --- /dev/null +++ b/datasets/Monoterpenoides/82.ct @@ -0,0 +1,25 @@ + + 11 12 + -8.0134 3.4502 0.0000 C + -7.2989 3.0377 0.0000 C + -7.2989 2.2127 0.0000 C + -8.7278 2.2127 0.0000 C + -8.7278 3.0377 0.0000 C + -6.5845 3.4502 0.0000 C + -6.7156 1.6293 0.0000 C + -5.9760 2.6145 0.0000 O + -6.6573 0.8064 0.0000 C + -5.9242 1.3961 0.0000 C + -8.0134 4.2752 0.0000 C + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 2 6 1 1 + 3 7 1 1 + 7 8 1 1 + 6 8 1 1 + 7 9 1 1 + 7 10 1 1 + 1 11 2 2 diff --git a/datasets/Monoterpenoides/82.gxl b/datasets/Monoterpenoides/82.gxl new file mode 100644 index 0000000..9f3950c --- /dev/null +++ b/datasets/Monoterpenoides/82.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/83.ct b/datasets/Monoterpenoides/83.ct new file mode 100644 index 0000000..bfee4b9 --- /dev/null +++ b/datasets/Monoterpenoides/83.ct @@ -0,0 +1,26 @@ + + 12 12 + -6.8750 3.9189 0.0000 C + -6.1605 3.5064 0.0000 C + -6.1605 2.6814 0.0000 C + -7.5894 2.6814 0.0000 C + -7.5894 3.5064 0.0000 C + -6.8750 4.7439 0.0000 C + -5.4461 3.9189 0.0000 C + -5.4461 2.2689 0.0000 C + -4.7316 2.6814 0.0000 C + -5.4461 1.4439 0.0000 C + -4.0171 2.2689 0.0000 O + -4.6492 3.7054 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 2 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 2 2 + 9 11 2 2 + 7 12 2 2 diff --git a/datasets/Monoterpenoides/83.gxl b/datasets/Monoterpenoides/83.gxl new file mode 100644 index 0000000..a36de87 --- /dev/null +++ b/datasets/Monoterpenoides/83.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/84.ct b/datasets/Monoterpenoides/84.ct new file mode 100644 index 0000000..e4d1d37 --- /dev/null +++ b/datasets/Monoterpenoides/84.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8750 3.9189 0.0000 C + -6.1605 3.5064 0.0000 C + -6.1605 2.6814 0.0000 C + -7.5894 2.6814 0.0000 C + -7.5894 3.5064 0.0000 C + -6.8750 4.7439 0.0000 C + -5.4461 3.9189 0.0000 C + -5.4461 2.2689 0.0000 C + -4.7316 2.6814 0.0000 C + -5.4461 1.4439 0.0000 C + -4.6492 3.7054 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 2 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 2 2 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/84.gxl b/datasets/Monoterpenoides/84.gxl new file mode 100644 index 0000000..a63fe59 --- /dev/null +++ b/datasets/Monoterpenoides/84.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +2 + + + diff --git a/datasets/Monoterpenoides/85.ct b/datasets/Monoterpenoides/85.ct new file mode 100644 index 0000000..97d3311 --- /dev/null +++ b/datasets/Monoterpenoides/85.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.6472 4.6878 0.0000 O + -7.2346 5.4024 0.0000 C + -6.5435 5.0675 0.0000 C + -6.5435 4.3528 0.0000 C + -7.2346 3.9733 0.0000 C + -5.9601 3.7695 0.0000 C + -5.2457 4.1820 0.0000 O + -5.9601 2.9445 0.0000 C + -6.5435 2.3611 0.0000 C + -6.3300 1.5642 0.0000 C + -6.9133 0.9809 0.0000 C + -5.5331 1.3507 0.0000 C + 1 2 5 5 + 2 3 5 5 + 4 5 5 5 + 1 5 5 5 + 3 4 5 5 + 4 6 1 1 + 6 7 2 2 + 6 8 1 1 + 8 9 1 1 + 9 10 1 1 + 10 11 1 1 + 10 12 1 1 diff --git a/datasets/Monoterpenoides/85.gxl b/datasets/Monoterpenoides/85.gxl new file mode 100644 index 0000000..83cda0a --- /dev/null +++ b/datasets/Monoterpenoides/85.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/86.ct b/datasets/Monoterpenoides/86.ct new file mode 100644 index 0000000..71bf830 --- /dev/null +++ b/datasets/Monoterpenoides/86.ct @@ -0,0 +1,26 @@ + + 12 12 + -7.6472 4.6878 0.0000 O + -7.2346 5.4024 0.0000 C + -6.5435 5.0675 0.0000 C + -6.5435 4.3528 0.0000 C + -7.2346 3.9733 0.0000 C + -5.9601 3.7695 0.0000 C + -5.2457 4.1820 0.0000 O + -5.9601 2.9445 0.0000 C + -6.5435 2.3611 0.0000 C + -6.3300 1.5642 0.0000 C + -6.9133 0.9809 0.0000 C + -5.5331 1.3507 0.0000 C + 1 2 5 5 + 2 3 5 5 + 4 5 5 5 + 1 5 5 5 + 3 4 5 5 + 4 6 1 1 + 6 7 2 2 + 6 8 1 1 + 8 9 1 1 + 9 10 2 2 + 10 11 1 1 + 10 12 1 1 diff --git a/datasets/Monoterpenoides/86.gxl b/datasets/Monoterpenoides/86.gxl new file mode 100644 index 0000000..390bcc6 --- /dev/null +++ b/datasets/Monoterpenoides/86.gxl @@ -0,0 +1,79 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +2 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/87.ct b/datasets/Monoterpenoides/87.ct new file mode 100644 index 0000000..ec4a228 --- /dev/null +++ b/datasets/Monoterpenoides/87.ct @@ -0,0 +1,24 @@ + + 11 11 + -7.6472 4.6878 0.0000 O + -7.2346 5.4024 0.0000 C + -6.5435 5.0675 0.0000 C + -6.5435 4.3528 0.0000 C + -7.2346 3.9733 0.0000 C + -5.9601 3.7695 0.0000 C + -5.9601 2.9445 0.0000 C + -6.5435 2.3611 0.0000 C + -6.3300 1.5642 0.0000 C + -6.9133 0.9809 0.0000 C + -5.5331 1.3507 0.0000 C + 1 2 5 5 + 2 3 5 5 + 4 5 5 5 + 1 5 5 5 + 3 4 5 5 + 4 6 1 1 + 6 7 1 1 + 7 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/87.gxl b/datasets/Monoterpenoides/87.gxl new file mode 100644 index 0000000..c494584 --- /dev/null +++ b/datasets/Monoterpenoides/87.gxl @@ -0,0 +1,73 @@ + + + + + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/88.ct b/datasets/Monoterpenoides/88.ct new file mode 100644 index 0000000..9076762 --- /dev/null +++ b/datasets/Monoterpenoides/88.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.6205 7.9145 0.0000 C + -8.9061 7.5020 0.0000 C + -8.9061 6.6770 0.0000 C + -10.3350 6.6770 0.0000 C + -10.3350 7.5020 0.0000 C + -10.3350 8.3270 0.0000 C + -8.1916 6.2645 0.0000 C + -7.4771 6.6770 0.0000 C + -7.8469 8.1881 0.0000 O + -8.1916 7.9145 0.0000 C + -8.1916 5.4395 0.0000 C + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 3 7 1 1 + 7 8 1 1 + 8 9 1 1 + 1 9 1 1 + 2 10 2 2 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/88.gxl b/datasets/Monoterpenoides/88.gxl new file mode 100644 index 0000000..2dd28cb --- /dev/null +++ b/datasets/Monoterpenoides/88.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/89.ct b/datasets/Monoterpenoides/89.ct new file mode 100644 index 0000000..8c7ac4b --- /dev/null +++ b/datasets/Monoterpenoides/89.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.6205 7.9145 0.0000 C + -8.9061 7.5020 0.0000 C + -8.9061 6.6770 0.0000 C + -10.3350 6.6770 0.0000 C + -10.3350 7.5020 0.0000 C + -9.6205 8.7395 0.0000 C + -8.1916 7.9145 0.0000 C + -9.6205 7.0895 0.0000 C + -10.4455 7.0895 0.0000 C + -9.8341 6.2926 0.0000 C + -7.4771 7.5020 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 2 7 1 1 + 1 8 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 1 1 diff --git a/datasets/Monoterpenoides/89.gxl b/datasets/Monoterpenoides/89.gxl new file mode 100644 index 0000000..dd4ab67 --- /dev/null +++ b/datasets/Monoterpenoides/89.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/9.ct b/datasets/Monoterpenoides/9.ct new file mode 100644 index 0000000..3a0f561 --- /dev/null +++ b/datasets/Monoterpenoides/9.ct @@ -0,0 +1,26 @@ + + 12 12 + -5.4241 0.7804 0.0000 C + -6.1386 0.3679 0.0000 C + -6.1386 -0.4572 0.0000 C + -5.4241 -0.8697 0.0000 O + -4.7096 -0.4572 0.0000 C + -4.7096 0.3679 0.0000 C + -6.8530 -0.8696 0.0000 C + -6.8530 -0.0447 0.0000 C + -4.4639 -1.1821 0.0000 C + -3.7947 -0.3572 0.0000 C + -3.1497 -0.9414 0.0000 C + -6.8530 0.7804 0.0000 O + 1 2 1 1 + 1 6 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 3 7 1 1 + 3 8 1 1 + 5 9 1 1 + 5 10 1 1 + 10 11 2 2 + 2 12 1 1 diff --git a/datasets/Monoterpenoides/9.gxl b/datasets/Monoterpenoides/9.gxl new file mode 100644 index 0000000..f4bee47 --- /dev/null +++ b/datasets/Monoterpenoides/9.gxl @@ -0,0 +1,79 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + + diff --git a/datasets/Monoterpenoides/90.ct b/datasets/Monoterpenoides/90.ct new file mode 100644 index 0000000..f2690b9 --- /dev/null +++ b/datasets/Monoterpenoides/90.ct @@ -0,0 +1,25 @@ + + 11 12 + -9.6205 7.9145 0.0000 C + -8.9061 7.5020 0.0000 C + -8.9061 6.6770 0.0000 C + -10.3350 6.6770 0.0000 C + -10.3350 7.5020 0.0000 C + -9.6205 8.7395 0.0000 C + -8.1916 7.9145 0.0000 C + -9.6205 7.0895 0.0000 C + -10.4455 7.0895 0.0000 C + -9.8341 6.2926 0.0000 C + -7.4771 7.5020 0.0000 O + 1 2 1 1 + 2 3 1 1 + 4 5 1 1 + 1 5 1 1 + 3 4 1 1 + 1 6 1 1 + 2 7 1 1 + 1 8 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 7 11 2 2 diff --git a/datasets/Monoterpenoides/90.gxl b/datasets/Monoterpenoides/90.gxl new file mode 100644 index 0000000..d87aaf0 --- /dev/null +++ b/datasets/Monoterpenoides/90.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/91.ct b/datasets/Monoterpenoides/91.ct new file mode 100644 index 0000000..e113a72 --- /dev/null +++ b/datasets/Monoterpenoides/91.ct @@ -0,0 +1,24 @@ + + 11 11 + -9.1518 8.2581 0.0000 C + -9.8663 7.8455 0.0000 C + -9.8663 7.0205 0.0000 C + -9.1518 6.6080 0.0000 O + -8.4373 7.0205 0.0000 C + -8.4373 7.8455 0.0000 C + -9.1518 9.0831 0.0000 C + -7.7228 6.6080 0.0000 C + -7.7228 5.7830 0.0000 C + -7.0084 5.3705 0.0000 C + -8.4373 5.3705 0.0000 C + 1 2 2 2 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 5 8 1 1 + 8 9 2 2 + 9 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/91.gxl b/datasets/Monoterpenoides/91.gxl new file mode 100644 index 0000000..5c42c67 --- /dev/null +++ b/datasets/Monoterpenoides/91.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/92.ct b/datasets/Monoterpenoides/92.ct new file mode 100644 index 0000000..346fa75 --- /dev/null +++ b/datasets/Monoterpenoides/92.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 O + -6.3102 0.0135 0.0000 O + -4.5646 -1.3931 0.0000 C + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 2 2 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 + 7 12 1 1 diff --git a/datasets/Monoterpenoides/92.gxl b/datasets/Monoterpenoides/92.gxl new file mode 100644 index 0000000..1c5a234 --- /dev/null +++ b/datasets/Monoterpenoides/92.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +6 + + +2 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/93.ct b/datasets/Monoterpenoides/93.ct new file mode 100644 index 0000000..fb5a1d8 --- /dev/null +++ b/datasets/Monoterpenoides/93.ct @@ -0,0 +1,25 @@ + + 12 11 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.3102 0.0135 0.0000 O + -4.2626 -0.2661 0.0000 O + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 1 1 + 7 8 1 1 + 1 9 1 1 + 7 10 2 2 + 9 11 1 1 + 6 12 1 1 diff --git a/datasets/Monoterpenoides/93.gxl b/datasets/Monoterpenoides/93.gxl new file mode 100644 index 0000000..29a4cbf --- /dev/null +++ b/datasets/Monoterpenoides/93.gxl @@ -0,0 +1,76 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/94.ct b/datasets/Monoterpenoides/94.ct new file mode 100644 index 0000000..76ab397 --- /dev/null +++ b/datasets/Monoterpenoides/94.ct @@ -0,0 +1,23 @@ + + 11 10 + -5.5580 1.4732 0.0000 C + -4.8436 1.8857 0.0000 C + -4.1291 1.4732 0.0000 C + -4.8436 2.7107 0.0000 C + -4.1291 0.6482 0.0000 C + -4.9771 0.1464 0.0000 C + -4.9771 -0.6786 0.0000 C + -5.6916 -1.0911 0.0000 C + -5.5580 0.6482 0.0000 C + -4.2405 -1.1018 0.0000 C + -6.3102 0.0135 0.0000 O + 1 2 2 2 + 2 3 1 1 + 2 4 1 1 + 3 5 1 1 + 5 6 1 1 + 6 7 2 2 + 7 8 1 1 + 1 9 1 1 + 7 10 1 1 + 9 11 1 1 diff --git a/datasets/Monoterpenoides/94.gxl b/datasets/Monoterpenoides/94.gxl new file mode 100644 index 0000000..c781b2d --- /dev/null +++ b/datasets/Monoterpenoides/94.gxl @@ -0,0 +1,70 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +2 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/95.ct b/datasets/Monoterpenoides/95.ct new file mode 100644 index 0000000..45fe22c --- /dev/null +++ b/datasets/Monoterpenoides/95.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 2.3223 0.0000 C + -8.2593 3.1473 0.0000 O + -8.9738 2.7348 0.0000 C + -8.2593 1.4973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/95.gxl b/datasets/Monoterpenoides/95.gxl new file mode 100644 index 0000000..968c80d --- /dev/null +++ b/datasets/Monoterpenoides/95.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/96.ct b/datasets/Monoterpenoides/96.ct new file mode 100644 index 0000000..5c34741 --- /dev/null +++ b/datasets/Monoterpenoides/96.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 2.3223 0.0000 C + -8.2593 3.1473 0.0000 O + -8.9738 2.7348 0.0000 C + -8.2593 1.4973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/96.gxl b/datasets/Monoterpenoides/96.gxl new file mode 100644 index 0000000..e3b1926 --- /dev/null +++ b/datasets/Monoterpenoides/96.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/97.ct b/datasets/Monoterpenoides/97.ct new file mode 100644 index 0000000..3349cfa --- /dev/null +++ b/datasets/Monoterpenoides/97.ct @@ -0,0 +1,22 @@ + + 10 10 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 2.3223 0.0000 C + -8.9738 2.7348 0.0000 C + -8.2593 1.4973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 1 1 + 1 7 2 2 + 3 8 1 1 + 8 9 1 1 + 8 10 2 2 diff --git a/datasets/Monoterpenoides/97.gxl b/datasets/Monoterpenoides/97.gxl new file mode 100644 index 0000000..c9bec24 --- /dev/null +++ b/datasets/Monoterpenoides/97.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/98.ct b/datasets/Monoterpenoides/98.ct new file mode 100644 index 0000000..23c887e --- /dev/null +++ b/datasets/Monoterpenoides/98.ct @@ -0,0 +1,24 @@ + + 11 11 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 2.3223 0.0000 C + -8.2593 3.1473 0.0000 O + -8.9738 2.7348 0.0000 C + -8.2593 1.4973 0.0000 C + 1 2 5 5 + 2 3 5 5 + 3 4 5 5 + 4 5 5 5 + 5 6 5 5 + 1 6 5 5 + 1 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 1 1 + 8 11 1 1 diff --git a/datasets/Monoterpenoides/98.gxl b/datasets/Monoterpenoides/98.gxl new file mode 100644 index 0000000..bc5b64f --- /dev/null +++ b/datasets/Monoterpenoides/98.gxl @@ -0,0 +1,73 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +8 + + +6 + + +6 + + +5 + + +5 + + +5 + + +5 + + +5 + + +5 + + +1 + + +1 + + +1 + + +1 + + +1 + + + diff --git a/datasets/Monoterpenoides/99.ct b/datasets/Monoterpenoides/99.ct new file mode 100644 index 0000000..75e3f14 --- /dev/null +++ b/datasets/Monoterpenoides/99.ct @@ -0,0 +1,22 @@ + + 10 10 + -6.8304 3.9723 0.0000 C + -7.5448 3.5598 0.0000 C + -7.5448 2.7348 0.0000 C + -6.8304 2.3223 0.0000 C + -6.1159 2.7348 0.0000 C + -6.1159 3.5598 0.0000 C + -6.8304 4.7973 0.0000 C + -8.2593 2.3223 0.0000 C + -8.9738 2.7348 0.0000 C + -8.2593 1.4973 0.0000 C + 1 2 1 1 + 2 3 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 + 1 6 2 2 + 1 7 1 1 + 3 8 1 1 + 8 9 1 1 + 8 10 2 2 diff --git a/datasets/Monoterpenoides/99.gxl b/datasets/Monoterpenoides/99.gxl new file mode 100644 index 0000000..329ecb9 --- /dev/null +++ b/datasets/Monoterpenoides/99.gxl @@ -0,0 +1,67 @@ + + + + + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +6 + + +1 + + +1 + + +1 + + +1 + + +1 + + +2 + + +1 + + +1 + + +1 + + +2 + + + diff --git a/datasets/Monoterpenoides/classe.txt b/datasets/Monoterpenoides/classe.txt new file mode 100644 index 0000000..a8c6a7e --- /dev/null +++ b/datasets/Monoterpenoides/classe.txt @@ -0,0 +1,11 @@ +1 Ocimen : 1-48 +2 Geraniol : 49-94 +3 Caren : 95-131 +4 Lavandulol : 132-148 +5 Sabinol : 149-158 +6 Pinen : 159-179 181 183-188 +7 Borneol : 193-211 +8 Limonen : 212-283 +9 Terpinolen : 284-302 + +10 Orpheline : 180 182 189-192 diff --git a/datasets/Monoterpenoides/dataset.ds b/datasets/Monoterpenoides/dataset.ds new file mode 100644 index 0000000..d43bc16 --- /dev/null +++ b/datasets/Monoterpenoides/dataset.ds @@ -0,0 +1,303 @@ +100.gxl 3 +101.gxl 3 +102.gxl 3 +103.gxl 3 +104.gxl 3 +105.gxl 3 +106.gxl 3 +107.gxl 3 +108.gxl 3 +109.gxl 3 +10.gxl 1 +110.gxl 3 +111.gxl 3 +112.gxl 3 +113.gxl 3 +114.gxl 3 +115.gxl 3 +116.gxl 3 +117.gxl 3 +118.gxl 3 +119.gxl 3 +11.gxl 1 +120.gxl 3 +121.gxl 3 +122.gxl 3 +123.gxl 3 +124.gxl 3 +125.gxl 3 +126.gxl 3 +127.gxl 3 +128.gxl 3 +129.gxl 3 +12.gxl 1 +130.gxl 3 +131.gxl 3 +132.gxl 4 +133.gxl 4 +134.gxl 4 +135.gxl 4 +136.gxl 4 +137.gxl 4 +138.gxl 4 +139.gxl 4 +13.gxl 1 +140.gxl 4 +141.gxl 4 +142.gxl 4 +143.gxl 4 +144.gxl 4 +145.gxl 4 +146.gxl 4 +147.gxl 4 +148.gxl 4 +149.gxl 5 +14.gxl 1 +150.gxl 5 +151.gxl 5 +152.gxl 5 +153.gxl 5 +154.gxl 5 +155.gxl 5 +156.gxl 5 +157.gxl 5 +158.gxl 5 +159.gxl 6 +15.gxl 1 +160.gxl 6 +161.gxl 6 +162.gxl 6 +163.gxl 6 +164.gxl 6 +165.gxl 6 +166.gxl 6 +167.gxl 6 +168.gxl 6 +169.gxl 6 +16.gxl 1 +170.gxl 6 +171.gxl 6 +172.gxl 6 +173.gxl 6 +174.gxl 6 +175.gxl 6 +176.gxl 6 +177.gxl 6 +178.gxl 6 +179.gxl 6 +17.gxl 1 +180.gxl 10 +181.gxl 6 +182.gxl 10 +183.gxl 6 +184.gxl 6 +185.gxl 6 +186.gxl 6 +187.gxl 6 +188.gxl 6 +189.gxl 10 +18.gxl 1 +190.gxl 10 +191.gxl 10 +192.gxl 10 +193.gxl 7 +194.gxl 7 +195.gxl 7 +196.gxl 7 +197.gxl 7 +198.gxl 7 +199.gxl 7 +19.gxl 1 +1.gxl 1 +200.gxl 7 +201.gxl 7 +202.gxl 7 +203.gxl 7 +204.gxl 7 +205.gxl 7 +206.gxl 7 +207.gxl 7 +208.gxl 7 +209.gxl 7 +20.gxl 1 +210.gxl 7 +211.gxl 7 +212.gxl 8 +213.gxl 8 +214.gxl 8 +215.gxl 8 +216.gxl 8 +217.gxl 8 +218.gxl 8 +219.gxl 8 +21.gxl 1 +220.gxl 8 +221.gxl 8 +222.gxl 8 +223.gxl 8 +224.gxl 8 +225.gxl 8 +226.gxl 8 +227.gxl 8 +228.gxl 8 +229.gxl 8 +22.gxl 1 +230.gxl 8 +231.gxl 8 +232.gxl 8 +233.gxl 8 +234.gxl 8 +235.gxl 8 +236.gxl 8 +237.gxl 8 +238.gxl 8 +239.gxl 8 +23.gxl 1 +240.gxl 8 +241.gxl 8 +242.gxl 8 +243.gxl 8 +244.gxl 8 +245.gxl 8 +246.gxl 8 +247.gxl 8 +248.gxl 8 +249.gxl 8 +24.gxl 1 +250.gxl 8 +251.gxl 8 +252.gxl 8 +253.gxl 8 +254.gxl 8 +255.gxl 8 +256.gxl 8 +257.gxl 8 +258.gxl 8 +259.gxl 8 +25.gxl 1 +260.gxl 8 +261.gxl 8 +262.gxl 8 +263.gxl 8 +264.gxl 8 +265.gxl 8 +266.gxl 8 +267.gxl 8 +268.gxl 8 +269.gxl 8 +26.gxl 1 +270.gxl 8 +271.gxl 8 +272.gxl 8 +273.gxl 8 +274.gxl 8 +275.gxl 8 +276.gxl 8 +277.gxl 8 +278.gxl 8 +279.gxl 8 +27.gxl 1 +280.gxl 8 +281.gxl 8 +282.gxl 8 +283.gxl 8 +284.gxl 9 +285.gxl 9 +286.gxl 9 +287.gxl 9 +288.gxl 9 +289.gxl 9 +28.gxl 1 +290.gxl 9 +291.gxl 9 +292.gxl 9 +293.gxl 9 +294.gxl 9 +295.gxl 9 +296.gxl 9 +297.gxl 9 +298.gxl 9 +299.gxl 9 +29.gxl 1 +2.gxl 1 +300.gxl 9 +301.gxl 9 +302.gxl 9 +30.gxl 1 +31.gxl 1 +32.gxl 1 +33.gxl 1 +34.gxl 1 +35.gxl 1 +36.gxl 1 +37.gxl 1 +38.gxl 1 +39.gxl 1 +3.gxl 1 +40.gxl 1 +41.gxl 1 +42.gxl 1 +43.gxl 1 +44.gxl 1 +45.gxl 1 +46.gxl 1 +47.gxl 1 +48.gxl 1 +49.gxl 2 +4.gxl 1 +50.gxl 2 +51.gxl 2 +52.gxl 2 +53.gxl 2 +54.gxl 2 +55.gxl 2 +56.gxl 2 +57.gxl 2 +58.gxl 2 +59.gxl 2 +5.gxl 1 +60.gxl 2 +61.gxl 2 +62.gxl 2 +63.gxl 2 +64.gxl 2 +65.gxl 2 +66.gxl 2 +67.gxl 2 +68.gxl 2 +69.gxl 2 +6.gxl 1 +70.gxl 2 +71.gxl 2 +72.gxl 2 +73.gxl 2 +74.gxl 2 +75.gxl 2 +76.gxl 2 +77.gxl 2 +78.gxl 2 +79.gxl 2 +7.gxl 1 +80.gxl 2 +81.gxl 2 +82.gxl 2 +83.gxl 2 +84.gxl 2 +85.gxl 2 +86.gxl 2 +87.gxl 2 +88.gxl 2 +89.gxl 2 +8.gxl 1 +90.gxl 2 +91.gxl 2 +92.gxl 2 +93.gxl 2 +94.gxl 2 +95.gxl 3 +96.gxl 3 +97.gxl 3 +98.gxl 3 +99.gxl 3 +9.gxl 1 + \ No newline at end of file diff --git a/datasets/Monoterpenoides/dataset_10+.ds b/datasets/Monoterpenoides/dataset_10+.ds new file mode 100644 index 0000000..e118ac7 --- /dev/null +++ b/datasets/Monoterpenoides/dataset_10+.ds @@ -0,0 +1,286 @@ +100.gxl 3 +101.gxl 3 +102.gxl 3 +103.gxl 3 +104.gxl 3 +105.gxl 3 +106.gxl 3 +107.gxl 3 +108.gxl 3 +109.gxl 3 +10.gxl 1 +110.gxl 3 +111.gxl 3 +112.gxl 3 +113.gxl 3 +114.gxl 3 +115.gxl 3 +116.gxl 3 +117.gxl 3 +118.gxl 3 +119.gxl 3 +11.gxl 1 +120.gxl 3 +121.gxl 3 +122.gxl 3 +123.gxl 3 +124.gxl 3 +125.gxl 3 +126.gxl 3 +127.gxl 3 +128.gxl 3 +129.gxl 3 +12.gxl 1 +130.gxl 3 +131.gxl 3 +132.gxl 4 +133.gxl 4 +134.gxl 4 +135.gxl 4 +136.gxl 4 +137.gxl 4 +138.gxl 4 +139.gxl 4 +13.gxl 1 +140.gxl 4 +141.gxl 4 +142.gxl 4 +143.gxl 4 +144.gxl 4 +145.gxl 4 +146.gxl 4 +147.gxl 4 +148.gxl 4 +14.gxl 1 +159.gxl 6 +15.gxl 1 +160.gxl 6 +161.gxl 6 +162.gxl 6 +163.gxl 6 +164.gxl 6 +165.gxl 6 +166.gxl 6 +167.gxl 6 +168.gxl 6 +169.gxl 6 +16.gxl 1 +170.gxl 6 +171.gxl 6 +172.gxl 6 +173.gxl 6 +174.gxl 6 +175.gxl 6 +176.gxl 6 +177.gxl 6 +178.gxl 6 +179.gxl 6 +17.gxl 1 +181.gxl 6 +183.gxl 6 +184.gxl 6 +185.gxl 6 +186.gxl 6 +187.gxl 6 +188.gxl 6 +18.gxl 1 +193.gxl 7 +194.gxl 7 +195.gxl 7 +196.gxl 7 +197.gxl 7 +198.gxl 7 +199.gxl 7 +19.gxl 1 +1.gxl 1 +200.gxl 7 +201.gxl 7 +202.gxl 7 +203.gxl 7 +204.gxl 7 +205.gxl 7 +206.gxl 7 +207.gxl 7 +208.gxl 7 +209.gxl 7 +20.gxl 1 +210.gxl 7 +211.gxl 7 +212.gxl 8 +213.gxl 8 +214.gxl 8 +215.gxl 8 +216.gxl 8 +217.gxl 8 +218.gxl 8 +219.gxl 8 +21.gxl 1 +220.gxl 8 +221.gxl 8 +222.gxl 8 +223.gxl 8 +224.gxl 8 +225.gxl 8 +226.gxl 8 +227.gxl 8 +228.gxl 8 +229.gxl 8 +22.gxl 1 +230.gxl 8 +231.gxl 8 +232.gxl 8 +233.gxl 8 +234.gxl 8 +235.gxl 8 +236.gxl 8 +237.gxl 8 +238.gxl 8 +239.gxl 8 +23.gxl 1 +240.gxl 8 +241.gxl 8 +242.gxl 8 +243.gxl 8 +244.gxl 8 +245.gxl 8 +246.gxl 8 +247.gxl 8 +248.gxl 8 +249.gxl 8 +24.gxl 1 +250.gxl 8 +251.gxl 8 +252.gxl 8 +253.gxl 8 +254.gxl 8 +255.gxl 8 +256.gxl 8 +257.gxl 8 +258.gxl 8 +259.gxl 8 +25.gxl 1 +260.gxl 8 +261.gxl 8 +262.gxl 8 +263.gxl 8 +264.gxl 8 +265.gxl 8 +266.gxl 8 +267.gxl 8 +268.gxl 8 +269.gxl 8 +26.gxl 1 +270.gxl 8 +271.gxl 8 +272.gxl 8 +273.gxl 8 +274.gxl 8 +275.gxl 8 +276.gxl 8 +277.gxl 8 +278.gxl 8 +279.gxl 8 +27.gxl 1 +280.gxl 8 +281.gxl 8 +282.gxl 8 +283.gxl 8 +284.gxl 9 +285.gxl 9 +286.gxl 9 +287.gxl 9 +288.gxl 9 +289.gxl 9 +28.gxl 1 +290.gxl 9 +291.gxl 9 +292.gxl 9 +293.gxl 9 +294.gxl 9 +295.gxl 9 +296.gxl 9 +297.gxl 9 +298.gxl 9 +299.gxl 9 +29.gxl 1 +2.gxl 1 +300.gxl 9 +301.gxl 9 +302.gxl 9 +30.gxl 1 +31.gxl 1 +32.gxl 1 +33.gxl 1 +34.gxl 1 +35.gxl 1 +36.gxl 1 +37.gxl 1 +38.gxl 1 +39.gxl 1 +3.gxl 1 +40.gxl 1 +41.gxl 1 +42.gxl 1 +43.gxl 1 +44.gxl 1 +45.gxl 1 +46.gxl 1 +47.gxl 1 +48.gxl 1 +49.gxl 2 +4.gxl 1 +50.gxl 2 +51.gxl 2 +52.gxl 2 +53.gxl 2 +54.gxl 2 +55.gxl 2 +56.gxl 2 +57.gxl 2 +58.gxl 2 +59.gxl 2 +5.gxl 1 +60.gxl 2 +61.gxl 2 +62.gxl 2 +63.gxl 2 +64.gxl 2 +65.gxl 2 +66.gxl 2 +67.gxl 2 +68.gxl 2 +69.gxl 2 +6.gxl 1 +70.gxl 2 +71.gxl 2 +72.gxl 2 +73.gxl 2 +74.gxl 2 +75.gxl 2 +76.gxl 2 +77.gxl 2 +78.gxl 2 +79.gxl 2 +7.gxl 1 +80.gxl 2 +81.gxl 2 +82.gxl 2 +83.gxl 2 +84.gxl 2 +85.gxl 2 +86.gxl 2 +87.gxl 2 +88.gxl 2 +89.gxl 2 +8.gxl 1 +90.gxl 2 +91.gxl 2 +92.gxl 2 +93.gxl 2 +94.gxl 2 +95.gxl 3 +96.gxl 3 +97.gxl 3 +98.gxl 3 +99.gxl 3 +9.gxl 1 \ No newline at end of file diff --git a/datasets/Monoterpenoides/dataset_9.ds b/datasets/Monoterpenoides/dataset_9.ds new file mode 100644 index 0000000..28a1b4e --- /dev/null +++ b/datasets/Monoterpenoides/dataset_9.ds @@ -0,0 +1,212 @@ +100.gxl 3 +101.gxl 3 +102.gxl 3 +103.gxl 3 +104.gxl 3 +106.gxl 3 +107.gxl 3 +108.gxl 3 +109.gxl 3 +10.gxl 1 +111.gxl 3 +112.gxl 3 +113.gxl 3 +114.gxl 3 +116.gxl 3 +117.gxl 3 +119.gxl 3 +121.gxl 3 +122.gxl 3 +123.gxl 3 +124.gxl 3 +125.gxl 3 +126.gxl 3 +128.gxl 3 +12.gxl 1 +131.gxl 3 +132.gxl 4 +134.gxl 4 +135.gxl 4 +138.gxl 4 +139.gxl 4 +13.gxl 1 +144.gxl 4 +145.gxl 4 +148.gxl 4 +14.gxl 1 +159.gxl 6 +15.gxl 1 +160.gxl 6 +163.gxl 6 +164.gxl 6 +165.gxl 6 +167.gxl 6 +168.gxl 6 +169.gxl 6 +16.gxl 1 +170.gxl 6 +171.gxl 6 +172.gxl 6 +174.gxl 6 +177.gxl 6 +178.gxl 6 +179.gxl 6 +17.gxl 1 +181.gxl 6 +183.gxl 6 +185.gxl 6 +188.gxl 6 +18.gxl 1 +193.gxl 7 +196.gxl 7 +198.gxl 7 +1.gxl 1 +200.gxl 7 +203.gxl 7 +204.gxl 7 +206.gxl 7 +209.gxl 7 +20.gxl 1 +210.gxl 7 +211.gxl 7 +212.gxl 8 +213.gxl 8 +214.gxl 8 +215.gxl 8 +217.gxl 8 +218.gxl 8 +219.gxl 8 +21.gxl 1 +220.gxl 8 +221.gxl 8 +222.gxl 8 +223.gxl 8 +225.gxl 8 +226.gxl 8 +227.gxl 8 +229.gxl 8 +22.gxl 1 +230.gxl 8 +231.gxl 8 +232.gxl 8 +233.gxl 8 +234.gxl 8 +235.gxl 8 +236.gxl 8 +238.gxl 8 +239.gxl 8 +23.gxl 1 +240.gxl 8 +241.gxl 8 +242.gxl 8 +243.gxl 8 +244.gxl 8 +245.gxl 8 +246.gxl 8 +248.gxl 8 +249.gxl 8 +250.gxl 8 +252.gxl 8 +253.gxl 8 +254.gxl 8 +255.gxl 8 +256.gxl 8 +257.gxl 8 +258.gxl 8 +259.gxl 8 +25.gxl 1 +260.gxl 8 +261.gxl 8 +263.gxl 8 +264.gxl 8 +265.gxl 8 +266.gxl 8 +267.gxl 8 +268.gxl 8 +269.gxl 8 +26.gxl 1 +270.gxl 8 +272.gxl 8 +273.gxl 8 +274.gxl 8 +276.gxl 8 +277.gxl 8 +278.gxl 8 +279.gxl 8 +27.gxl 1 +280.gxl 8 +281.gxl 8 +283.gxl 8 +284.gxl 9 +285.gxl 9 +288.gxl 9 +28.gxl 1 +290.gxl 9 +291.gxl 9 +294.gxl 9 +295.gxl 9 +297.gxl 9 +299.gxl 9 +29.gxl 1 +2.gxl 1 +300.gxl 9 +30.gxl 1 +31.gxl 1 +32.gxl 1 +34.gxl 1 +35.gxl 1 +36.gxl 1 +37.gxl 1 +38.gxl 1 +40.gxl 1 +41.gxl 1 +42.gxl 1 +44.gxl 1 +45.gxl 1 +47.gxl 1 +49.gxl 2 +4.gxl 1 +50.gxl 2 +51.gxl 2 +52.gxl 2 +53.gxl 2 +54.gxl 2 +57.gxl 2 +58.gxl 2 +59.gxl 2 +5.gxl 1 +60.gxl 2 +61.gxl 2 +63.gxl 2 +64.gxl 2 +65.gxl 2 +66.gxl 2 +67.gxl 2 +69.gxl 2 +6.gxl 1 +70.gxl 2 +71.gxl 2 +72.gxl 2 +74.gxl 2 +75.gxl 2 +76.gxl 2 +77.gxl 2 +78.gxl 2 +7.gxl 1 +80.gxl 2 +81.gxl 2 +82.gxl 2 +83.gxl 2 +85.gxl 2 +86.gxl 2 +88.gxl 2 +89.gxl 2 +8.gxl 1 +90.gxl 2 +91.gxl 2 +93.gxl 2 +94.gxl 2 +95.gxl 3 +98.gxl 3 +99.gxl 3 +9.gxl 1 \ No newline at end of file diff --git a/datasets/Monoterpenoides/monoterpenoides.tar.gz b/datasets/Monoterpenoides/monoterpenoides.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..bf57dd3163c0f1430d49354a7864246d3c6d1c5a GIT binary patch literal 59153 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 literal 0 KcmV+b0RR6000031 diff --git a/datasets/Monoterpenoides/monoterpenoides_gxl.tgz b/datasets/Monoterpenoides/monoterpenoides_gxl.tgz new file mode 100644 index 0000000000000000000000000000000000000000..ac24c4bcea60ddf2759966e19adbd4776ac978ed GIT binary patch literal 11633 zcmV-%EsoM3iwFRy^o3Ud1MS^QlN`r&#c{6nDPZhPRA#-p9Tc^&72eokM@S26<)8_O zVgw%w5R@GL^qv7g5I`knGP`b_yqWbs8(K2EVrI~z{^921gkkvnoB#dpvm-OyWm%^C ze};7)-v8%)#&H@x3vr#oxW+Jt&xR1=8a{h69Qswg&Cfr*`s(GAC!hV#H(&kye=lCX z_|(7m*#E!LeDS;g{r6c%8 z`@^d*moJ{(|KrJ%FP`213wQtCv-{V5@bb9t<>S7WPy1dz?|b>O@8#>hmtXe1{JQVu zVc7Zl2i|v=Prm;C?fm4=FMs_0^&9ues~;2Zz`uR<-HRW-e)0BM;q9}2eboIkK6+Gq z`>2oKjW;}MeEX=6-f>L89Y6Mue<^nS z*bN?adHbl3f7fi&yy-uiFC ze~M`Q7w{kcdlXPj`0vxN$A7m;OYXm-M;Z7p*r9E-L)$eEZCQVWSJ2jI!VrD>Z^nO$ zX#5xPAO7<(|I6Vg{_EO*4bT6a4(%@ZuhE2ItnR-dgpL1}75^!s@!yF5@ShL=S^6yt z5-t19=lZRBekb=^*86I&-!K=s_uo|Ae<4oH|0+e}zX|{0zyAE!{rs+b|7A&w{d-Wd z*MwoN?!V;uj|KlJqVeC1|L~u8|8f4~Bz|mo{kKm)-f;folYfR-v?yU%eEN^|Ur99n zTks$L!+-eCh5wizI`-efRzhXMuzK|0I1Knt5sm*={D=SWANvP;^B?m+{MU5CaPjFs z?*EfS&JgNCusZiANvRE_^)Wu7XLNtzkvUg3B$Fz{}Sgv#v$TAMKu1q;=g|U z*X#Tbzcn(yD_V3l@Y`hfsMXGItDWD%PQPKUW)qID|9E`<7njZczrgulNi_b0f5j6t z_}AF@@4eSQ@WyL-`(U)=XUO7b5%diBxu~I6bkU2mL0#NAsQcjUF#Phc8#hcK&>Is3 z0KDn^2lGEkB>n?{%>Q};Ap8HCpC7XR>zI}Fzey89{r_$h{k{Pzu`apSABqo z|L~u8|8f39nh@&uza{-g|F0w(|Iz=}k^eaVf&cIy{^R^d2MM8m|JyW=od2j4jsNI> z!+-b>|KUIUcd-8q_j8_sk|EUZe@pfMuH643iN=5QzjfrlUe|x|8-6?5Z;sG)2HlXy z5<>m{x1|4=|4E|pAN_Cm5C662zpMi)_|MvZMaP2iAGtjtxa@zU|3egw|LA|ifA0Oq z`48rY+#guu{=gf~e{d6wO+u*O|2EIt`=0~;lSJb``rq)M6aVGxUcAkJ@4fz}Hy(b( zkN8pK$Fi^M#$Uq*EE+=n{x|wR>P6!}`rq)M6aV2a{Dr^h{~)gug46yt?*EfS<3IY} z@E`s=wg1%pz4#CRkw+uA{yC%nZKnUNQZ)X9fAqh3=U?9PFa2-yzlove=*)2H-C%i9 z3-xd6gy^*YjrpG>68}Z|-G95*Yf<3_2Yi$hpBf1_diP#qSO92`adMm_>Tb~ z{=BU!5L-j9a&N6%U4E86U6fWE8Y(C(Tyv;&at z5@P-Sx1|5*f0IPxKlJLf-|ONdVU-%Z2LBc1&RstJNB@T;8voJ% zhX3#%{`28K&X3?f@+KkH?|)0~|Kt3xBpUzG|AzmZ_-}9jFZ=)SUl(Yb4bc`rTcZiF ze*ar?{>S})l4$%#{~P{u;y>npr}rQ0zmDgB-2W#{IR5&-$M63OVRQfAu;M>OH2#Bs z^uP7Nzm~^;^ta`IRZaJ|72Qk8%$C5+Yk-{P_^oAV!m`(Gr{_>cZK{O5lDhu<3U zo6ik=SzlG=20op+!swy@Yy0^>F#nN6^Z8Hz7oY#`KmVIv|0~*R&-$Nq{V%WotLRY% zqoioKXm|GvR_&Th7#;L~rToYKFG)21qyMWT|K%*;`Sss%_rJaO`kUT(z3d;$qG;X$ z(xPurc7U{qq6X`SlYITK>{&OiA10r5;~O47-k31f@Bd2f|Kk1+Ni_bW{|o;)@t>#t zUq1b2cmW80%lBK^o-GG{!(1KY&Rib-Hx2{-Q$*uG`oB8zAM3wX{%d&unBn@b;r=oC zqHWQpFWm)jMF&7xvpsRbSik=(>A!&g6w&yP{xAH8|L`CFbL77X|B*1(@Bd2rkMp0B zX#7Y27yiS4_z(ZJ=Rekedrmn1`j3qBAMpk`yWMrSpMQ_ zll@_q7xk8XT^#=qCrtJGzmn%anEy#4@!v%M7xTaF0m%HXI^cX>+Ts*&7v_H?O!fP} z;&%SW`43Sv{-gh^BmZ&!S31B8_5(bFM+NmPu;HV`qneT&B_^2(Q~mz0X$qYGs1%L= z=>Nih-TNLTTmMb?PZ5p(*Z_$C@L&G= z^8@d^tk>VP_Y{BPPyAWkpC7!n-u0>&wEz72up8g>=aTU`5~lk7fAqi9i^l)-|8?a5 zw)cM?cmBKS`ESuyR0A|eJ2X#OXwLcu4bi;Vq1mwXZ_Yz=(GjOx?+;2oivvK~gsFc2 zAN?=&qVXU7fB3I^|KT_M)}h}pSI-HP%l<#k|A?aTAN_y$5C7pm{HO6>*|YH9c@w7U z{eN*;x9h*$|EP(^fAs(1KllE_Z}@G8-?F~Jy?!${SD5Pezs=M3{+Gb{4@oqi|Mb7{ z`S1SozxMvGyz?LU1;6w$fBN-2g24u|Ums@imVbA*^^GTu+8K?7seb?4I1StNzXks( zqVXU7Z}`uN|2*CQtUmPWv;S?*@>h{n4IVYw{RvKXDm1JWS?yG~SgMd!NoB(E$3JiC ze~aw@l0@S__(%Vn5B~YR{>48Z>3^#NHN*OlXb82;`VfwPx=xtu_rE3Pe{p60CyB&= zGyQMO|2hF+%YbA4mroMre>cqRbf*%yzS$;s-m31u5GU^cs1%L==zqh1?)`_~8u1(J zx6b^AxtdLw>-WDU_y4i}D~ZN`^uOUh_x@x4had4{?fKur{7;!MSMPsI`;Y!#Ni_bW z{|*1)Km3RP&g{RUBh;M#kR;3w`oB{Ci}+6wjsG|Rg8!WOkMqCy5C8d{|8f3TnlRVz z|4RCA#D9ut{73&6{=ch2_j;lE}R=KB3_N&j*G zpClUp(f@}3ocNFVAO6FC_>a6!n4R{&asQtr8voJ%hW|=7;5k13TdjZBz(i2A{KxLA z%6GCuU$lGF)o}mcyJxZgPmyr^@sHd3-?;xp5{>`hAN_AW#(&2h|9J29H@)%vk00rO zt1{>_?0>r$LM`ruTJr0n|4p2*IPHI9{wImVe+&I@%>S7GG5=%!XLPEC`5zQCNmyL= zztR68ipGERzu`Y813>)Nyx)qhf-&&hWH-x;U5*7YSF;IA{ros9<+W$uXha?*R(f@}3SpUV3-TASo(v0&Ttp9pTSe*91(f=Wd#((s` z;XnL`|L`CC|L~uugvDw98~q=WX#B?kVEpHP{Ws5l^82IlUlsouUiug99@X^yf%L!m zOIYgnza{-g|A!gJPZEv) z=zqh1?)}I5uV+7INzLc^k3RjFdN;6W+gif$+y5S4|J~02V&MF*BpUz0Kl)7fWPbRGcY{Tj z@GpM}pi4L>VXfc)mRkSi{y$AL{-gg5|8?)bs(vei1b(yf+ldc-B%j4Bv9W};e*at2 zf875kiN=5Qzu`apxA{Dr?fjSZs678=Ju1(CS&z!|U)H1Y{8#j2$A9>*;*fnLCL2^dJ2nl4$%#{~P|pfA|mo;XfPyajl_E!s@jDjs6cwH2&iP82pF-j`Uym z=XdcR{=F`%qrmr1nqr(rG1V&~7r&Yx?ZKa2j3WN{VsJIfmWHE{F44g2Pz;rQj> z+xp))|0{{cfAA0f_0GSl{3`lrGlY(>nVr1{q((3uUPGcjl*pM^{P{x|wR>P6ze z3;k~Z&Yf{x|&R-hWl+cii7nWqwz*Q;zu^dh0FWQosK#=|B2E zB+>Yf{-^8@`Y-$c9Q%>|f7bi| z-reQGO0pv1; z|LA|if8G1St>6Ea@*n*lnrQq-{~P|p zfA|mowd_CET>DG7*6)9d%Wp{{73&A{=6Eaoc~4q zr-;UXTmX&#@E`tb(|-rtP;EfT#g3ADuayRE%_dyy_rE3mH{w4VKfx_LEF#((tx;y?H6 zzxWNmHRv~kuWIx&3WRUk#KC9(??C^rBpUzG|BL_dAO7pve_4|Yf{$Kou|IGA&|N8b{ z)?WtjAK9Nc`0W23xc^TQjsGZs!+-b>|Ml#@BD5LI|7JV?1^jo`#N+Ef9`j#Z)_HUO zH*)?%5{>`hAN+%Vd+|VjZ~o7!&;DL}XvN^P|BLyLB$Chn000000AT*Z{Kq9rR^~rv zO$_z>zmooA{v(OTfAoLhKm3RPdiI}Te?!rP3;&VZ6GQ#}uNb%Mf9s0>6w&yP{xAIJ z-hc1Cp8hX)e#|n_0XMZ7_;Iou`d#eMciD-)W6x3R=fzyE8R0{6dFipGERf8oFG z{rBGMA9&+g`mt!&*vb7^>!x4)DDY!y#Jc$Nih`0q&nHQXPD|L`CF ztCSe(_kSh*$NhhjX#7Y27yiS4?B8q1f1pi>w)da4?)x*ue?^I*e*ag}f875kiN=5Q zf8js;$NDe+!+-eCQ{wU0KR%W`( zU+|wO8vii>#DDk?|8?iTBDBf;m!(oq{`=tTdiRB4$>S4a{r)%lKk7x}KlZs|7|<}o%ee*=I3koh0;zjM$3u%x%dv3~zs(tphVB+>Yf{x|%G z|L`CFW0r{jJSC3x``?oOi}+6wjsI8x#(($^|KY!L`;Yy9-V#R-{cj2XasRU<8voJ% zhX3#%{`28K`rnxUkvEBB{r`pf5U(HuMz(hjmKK_AM-!vf8!+-eiwn0?O^FN>KznuTD_TQ4nKbC*pC5|5Y-?sjv|4kE( z|LA|ifA|mo;lDoTfB3J}#N)4jdCY%tSvUTRk@=q_8vnsR_~)H}{`p3KTmDzor@8E% z6ekb;Uy1cU=0B21KL02BzW{)H0I>g``496S=0B%OoILb@CHzPKmn0hh(f@`2@E`ue zf2Z~z+yC7qPWAi0h7dOEe=GeDl4$%#{}=vq??3$3h~K)uzeBQrA9Im=|9R;DO3eT8 zpClUpu>lPKx%VIY|4-t_?&p7A&wn!ibC)=I=>JOikNz)7H2$Oi3;*Fi{D=Qo|HXfv z5+@J+UkU%w|0RjWfAoLhKm5n~G5%xzhyOe!P9FNd68@wAOA?L$=>Nih_z(Z#zf=2< zy@>7-ClCE!^gq;!#((sG;XnL`|91GV$Tav*>%V~i8cm#h_J7g;pozwR^nc+${Kx)3 z=6`+qZ^VC%CQeTKzqtQT5{>`p|H6Ox5C7r6Q~Qtof9?{GKmPlu|3c#azYy`CA{zg} zKllg#YA^rF`@_`y%j*yGX*SC88~q=WX#7Y28~($8_|M1u5dX3MOWq{T_50tF>%ZLp zEQ!W{900+8?)`_~nBSeqZ%fgThf2r|162dfAqiMKPUcUeuw|?AO0h+6KALW zZ}?9VjsNI>!+%cv=V|?y`~O;B|IPXnY}$|9|JQZmT)+QqoHp}6{3nXWfAqiMKm5o1 z5dZb*zrE)_Qtx;65-Jks`u%Sy|Iz=ZiN=5Qzu`aphyS|sU;pdJ_^<24*=he9{U4HO z{73&A{==T?)_K4|Be2SdeQig{x|$*d%<0rl>_UyHmxYX}|n^Nb0>Hm;K<3IY}@Spqn-`)k__g??N8_($ia`%4p*+0zr zVUxA!)Fyz zExGE18f62{>i_iWy z`ad+$_>cZK{O81f%>N$qjUY z^nYlg@gMzf_|J*|IRC-=@lHP)p8xeZf8_k{Y5W+M`u%T7|8f3T5{>`pf5U(H5C4_= zuc*kP#rYxrEAd}Z3Ctt@qu1nh;_=)6ZtH*J{y#}H{)2z;uXq0W-#$qHTmH|gX>-y4 zMluuE`u%V8f7FY_e=GfO01yD4Z+_=<{g(Ni_55z!Ilse_wG!9*{cp+s-x>cYqVXU7 zZ}`u>|NIZ|@Ed;P{4X&~To7ZCrE2Xe=*>i(nuqh2)rqyG*6x%VIY|L`Mz zJaYdZXGz>8u0H$Uxc^xbjsNI>!+-b>|KYz=`;S?qyTrAA|6B6@Klp-KbQS)-;%X4;XgEL2LSM`C zL;3pe#QJZeiI@8QZ^`*z#D9ut{73&A{&Vj?{B}OSG5^C{r%t@o?|)1BkNyuyH2$Oi z4gcXkk^hQ#baMZlcz%cf$i4sS_rE3m$NevoX#B?ofcOvpwKxCsdHw_c;Xh)Nc&Xq2 zmh>O@zeu9-AN_CmuS5UMcK*wHRG$B`9+l_6tViYfFY8fx{ww+h@gM#ppG>?s?SI36 zl4$%#{~P{u??3(d5B!K9oAu-S&-$f!h4UY+B_2Qid(3}vSvUTRBkRACX#5BN;GcK? zRbBq2zb(JNO?_q~WSOh1bIr}nE?%AXe=+}&MDqE6rT+^6xCa39ALc*Ie|8y=`A=(! zSEv173;t6?<3IYp@E`uefB3IY|Iz=|YU0&p{}=raqGmknx?J)=zq{e<3IYp@Sl7C?VbO<_xcCkc=Shb|D1P!HrF4KT#J7AcjuFTi05)~ zyw>mk8u4GXX#7Y27yj$sfA|f*;Wx8yk+oz+;cZC{D=SWAO7oS z{n*lfn5|agwSNECJTDvnMf@j;#((sG;lJ+v$NH~lKNgwDfTAt?Q9eHmhV#Sl?qLSM zJk!o+xrc4M*6;sHuK&{iDv8E_^nc;M?)`_~8kzs$H_v`!mZ(g;*6;sHp8w$fKS?zH z;{ss(*NOkKUeElmXFqnoek}Ln)zFXEypbK}KVBzZJ@kKV*MGx`{}j>qkNz+G*NOj} z`i%mK`~r!hM;V}Nu|wD10*Rvlmw9Ldba_iWo`1LXe=+})MB_jB2mieD&;R&M&bKU7 z`s7>F{a->R9e?|8&idc*@#lXS+5aVp#eeSor=R~7E!wrXfsFnC?Eh!g)pN$l7hCpkYr&lbtdc>MD3P3J%3g8vke_>bjZ{O81f_^o-r6-lWt zzuB8>6dVA3eEt(Rpa1lKY9jgkXZerMfA^pN{cr!z^F!7LSW8L z|83X*@Si3U|Bd($|KUIUhyVQeZ-#&5vvG3jKkk2%MB={*|KUIUhyPsokNscxkG#z| zJN4g${}hqx_$2|8f7XBohBE_z(Z#Km3RPn)4s? zzpgW`PW{LEPe~;HTk#+M^Wi`4|7g>HMWi{q|G58yWM;fL^&j`YNh0yz1^?kc{D=RT z|KUI4DdV-e|C0B=jm-Zfk@)Y5|L~s=|KYdh{dVH>y9eC=cKpYGM*q|J@#lXSIsYk% zGBy}~MBxSb0bCSSeruzL) z-2Y!O3ja;?KLJ4Z0PJP{<8A5xc`gTXL8a1#Qp!ZBJm&nPxuf2;XnM>p8r_2>pGLy{wMZ-Nh0wd{ZIJMiT^nN z*QWniKji!$vCrh9|0&V`&i${FNc>0t6aI7JKjwdJ`j7dawf}Pa-x&b*oXKnd6aJG# z;y?PI@E`uee?I)z|NM{sCz6@TYyT7HKP8d)kNzk8hyU;&{%g;Ftp9eM$!q@;_y0>G z@gMz9_|J*|*#C$By7wRZ|43%0`u$Jb|6ef@|Iz=1|D5;_zcuf-6Yt+U;QqJz{XgRv z6QBPBpZ|(TKL6?e;q%|g=l|aMPuA;idgI}bM*QJ(epEK|ad7K@^6R?s4bLp<)(DP& zX7oQz+x{o^|4SnAAN(se1pE_^f1ED=1v}l)|5W}B8c1-oli+M8!P!uPoFr{GbN&9O z0t7yfhN zzvIq-=J_w{^$)!BIDd*C@#80-_3#_M>|E@_@AyuJnX`lbujKrX{x3-+{-gg3|KUIU z)`#DGorh{S*Nf8oFG{fFQ1TZewbTwP~&(EpV<|H1rE6p8;h z0D}KY2564=|FM71+JA;8T;?qQ6;aag)P}*MRy#^w^C+2x<-MaoC|NDDgZ{6i|3>_$ zh{S*Nf8jqT{%h_4F#f}Th5joun}elb{8ufrgZ{7N{y*;jl|ll5QD|Mup` zy!GRvt^b_g5byuv{BNzy4*I{6{-gg(5{dul|H6Mx{Kxr^bNY|-yVm`&mi}AtU!~0T z`@fRsKe+!z6N&%m|H6OW`wze2Hz$5$(UxRpcF_Np^dILxB$4=!{x|%G|L~s=|8f2o z|B<&59RGOKf73K<``_6ACyB&=@Q?ntKKPgQdQZ#0^v6|^DE)CI@6o;eajADHR|#fi zanS!ZrTRbUf0IPvzlHuc=6_BAc-;LjP63#wwyclVmerQ^4H{xO*a0xO1mI){z_@c1 z`N2;s0KkGQ4*K85aozfF#(#=P{73&A{^R}^rfx@1-F#jpW4M%TI18M7QgGQh3OtwI z_GfX>|CYS}kMkdrNc>0t8~!tz|7FeZ@ZS#qWlhSupWhiCCGmOxUob>l*g3xgZPl_k z=zpXCqh2KbqyG*6;lD=w=X3st|L`BN&*HWJjs6cwB>toS4gcXk{D=P}{wp&Z{yTFP z2mNn}^S}2b#D9WF{Ko-c{MWtznm+%5AMstoS4gYoTKm3N@I`kXn z>N<;q{0t8~*Fwf6V{zBYwQ?S=YSz9~%hGvv}=)LG&de;NKu^uICxlSJY__~(d!ITI}SSNwYa$2Sb?e?yiei%La&m981` z?_zgn%hiy7)c=yZtX})y@Sh|K|E=`Dc>>_6=YRCS?WY>&fAb$j|69hhGD|<`f3wf( zp#P2jk9v{#kN!9O*Zuu3{s(|^zh$Az=TdUZ_qTBWGs(^Bwf~L&4@o5cqyG*6;XnL` z|N7iYi2s_+>Y)EEdH*x#KO~X(kN!9O*S-ImUjN09__19-roKg%f3vc>=zmMx|2*SA zMI`>C{|)~++5hM1{BQSuYxpSfoaMKol~x141v|g3mVO(!OR&+b4*K7c{#)>$A`<`6 z|AznYAO6FC=k^~9!0xg-=zpXCqh2Kb;{q7`hySYkFYf}FqNBjR{Fk@rs=oivDcZOI zhTQqjLI2x_`~Tvb{*M9wDI)P7{crfMd;j&n|Icvfmv@1nda7wSKa5!vE&2v!cM%pn zN=VTnxU>H+E31S4w-3+%M*81`k@%1PH~iPV|L_}r>(6gx=3>(6Ec7 z2xl_|I_A*8NEm zpYHiQ$;y?P|@LwnMKkk3&*pHka zE`OA810nan*yrM+|1GipOaF%?693WvhX1LEF z#D53$zp?+Xmj7~o^8Nac^B?RVELo{Fs3I|3^fmM&_rG+Ji-Z2Rr2iuRQ$*sw1Nz_a zAO6FC_z(a2_8;eeedpq!|Be2SdXf0=fC~WeAM3xq{DS-`bNJ8j{710!U(-iP%I=cEf078se~<6~+xjoe_)ijv|5*Noe?It^ zH9l-)`yc&r#;Bd`_~^6#BifnI)ADihS#18x%GE*tTXOvu|4E|o-}Qk0H|Bo;koh0; zKjwd@od0o^j8U#$``_sQl|_+-CjG{uEy>K)LH}Fw{%7WYl1Th_K>r*5JE#A+|BwBD zJNN(PRZ`fE0{cI-aevmHNY!|~zW vGxn8!q~4`mB|``ygb+dqA%qY@2qA Date: Mon, 13 Apr 2020 17:43:33 +0200 Subject: [PATCH 3/9] rearrange gklearn/preimage directory. --- gklearn/preimage/find_best_k.py | 170 ---- gklearn/preimage/fitDistance.py | 430 --------- gklearn/preimage/ged.py | 467 ---------- gklearn/preimage/iam.py | 775 ----------------- gklearn/preimage/knn.py | 114 --- gklearn/preimage/libs.py | 6 - gklearn/preimage/median.py | 218 ----- gklearn/preimage/median_benoit.py | 201 ----- gklearn/preimage/median_linlin.py | 215 ----- gklearn/preimage/pathfrequency.py | 201 ----- gklearn/preimage/preimage_iam.py | 705 --------------- gklearn/preimage/preimage_random.py | 309 ------- gklearn/preimage/python_code.py | 122 --- gklearn/preimage/test.py | 83 -- gklearn/preimage/test_fitDistance.py | 648 -------------- gklearn/preimage/test_ged.py | 520 ----------- gklearn/preimage/test_iam.py | 964 --------------------- gklearn/preimage/test_k_closest_graphs.py | 462 ---------- gklearn/preimage/test_median_preimage_generator.py | 69 -- gklearn/preimage/test_others.py | 686 --------------- gklearn/preimage/test_preimage_iam.py | 620 ------------- gklearn/preimage/test_preimage_mix.py | 539 ------------ gklearn/preimage/test_preimage_random.py | 398 --------- gklearn/preimage/xp_fit_method.py | 935 -------------------- gklearn/preimage/xp_letter_h.py | 476 ---------- gklearn/preimage/xp_monoterpenoides.py | 249 ------ 26 files changed, 10582 deletions(-) delete mode 100644 gklearn/preimage/find_best_k.py delete mode 100644 gklearn/preimage/fitDistance.py delete mode 100644 gklearn/preimage/ged.py delete mode 100644 gklearn/preimage/iam.py delete mode 100644 gklearn/preimage/knn.py delete mode 100644 gklearn/preimage/libs.py delete mode 100644 gklearn/preimage/median.py delete mode 100644 gklearn/preimage/median_benoit.py delete mode 100644 gklearn/preimage/median_linlin.py delete mode 100644 gklearn/preimage/pathfrequency.py delete mode 100644 gklearn/preimage/preimage_iam.py delete mode 100644 gklearn/preimage/preimage_random.py delete mode 100644 gklearn/preimage/python_code.py delete mode 100644 gklearn/preimage/test.py delete mode 100644 gklearn/preimage/test_fitDistance.py delete mode 100644 gklearn/preimage/test_ged.py delete mode 100644 gklearn/preimage/test_iam.py delete mode 100644 gklearn/preimage/test_k_closest_graphs.py delete mode 100644 gklearn/preimage/test_median_preimage_generator.py delete mode 100644 gklearn/preimage/test_others.py delete mode 100644 gklearn/preimage/test_preimage_iam.py delete mode 100644 gklearn/preimage/test_preimage_mix.py delete mode 100644 gklearn/preimage/test_preimage_random.py delete mode 100644 gklearn/preimage/xp_fit_method.py delete mode 100644 gklearn/preimage/xp_letter_h.py delete mode 100644 gklearn/preimage/xp_monoterpenoides.py diff --git a/gklearn/preimage/find_best_k.py b/gklearn/preimage/find_best_k.py deleted file mode 100644 index df38d32..0000000 --- a/gklearn/preimage/find_best_k.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Jan 9 11:54:32 2020 - -@author: ljia -""" -import numpy as np -import random -import csv - -from gklearn.utils.graphfiles import loadDataset -from gklearn.preimage.test_k_closest_graphs import median_on_k_closest_graphs - -def find_best_k(): - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] - gkernel = 'treeletkernel' - node_label = 'atom' - edge_label = 'bond_type' - ds_name = 'mono' - dir_output = 'results/test_find_best_k/' - - repeats = 50 - k_list = range(2, 11) - fit_method = 'k-graphs' - # fitted on the whole dataset - treelet - mono - edit_costs = [0.1268873773592978, 0.004084633224249829, 0.0897581955378986, 0.15328856114451297, 0.3109956881625734, 0.0] - - # create result files. - fn_output_detail = 'results_detail.' + fit_method + '.csv' - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'repeat', 'median set', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM']) - f_detail.close() - fn_output_summary = 'results_summary.csv' - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', '# SOD SM -> GM', '# dis_k SM -> GM', - '# dis_k gi -> SM', '# dis_k gi -> GM', 'repeats better SOD SM -> GM', - 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', - 'repeats better dis_k gi -> GM']) - f_summary.close() - - random.seed(1) - rdn_seed_list = random.sample(range(0, repeats * 100), repeats) - - for k in k_list: - print('\n--------- k =', k, '----------') - - sod_sm_list = [] - sod_gm_list = [] - dis_k_sm_list = [] - dis_k_gm_list = [] - dis_k_gi_min_list = [] - nb_sod_sm2gm = [0, 0, 0] - nb_dis_k_sm2gm = [0, 0, 0] - nb_dis_k_gi2sm = [0, 0, 0] - nb_dis_k_gi2gm = [0, 0, 0] - repeats_better_sod_sm2gm = [] - repeats_better_dis_k_sm2gm = [] - repeats_better_dis_k_gi2sm = [] - repeats_better_dis_k_gi2gm = [] - - - for repeat in range(repeats): - print('\nrepeat =', repeat) - random.seed(rdn_seed_list[repeat]) - median_set_idx = random.sample(range(0, len(Gn)), k) - print('median set: ', median_set_idx) - - sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min \ - = median_on_k_closest_graphs(Gn, node_label, edge_label, gkernel, k, - fit_method='k-graphs', - edit_costs=edit_costs, - group_min=median_set_idx, - parallel=False) - - # write result detail. - sod_sm2gm = getRelations(np.sign(sod_gm - sod_sm)) - dis_k_sm2gm = getRelations(np.sign(dis_k_gm - dis_k_sm)) - dis_k_gi2sm = getRelations(np.sign(dis_k_sm - dis_k_gi_min)) - dis_k_gi2gm = getRelations(np.sign(dis_k_gm - dis_k_gi_min)) - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow([ds_name, gkernel, fit_method, k, repeat, - median_set_idx, sod_sm, sod_gm, dis_k_sm, dis_k_gm, - dis_k_gi_min, sod_sm2gm, dis_k_sm2gm, dis_k_gi2sm, - dis_k_gi2gm]) - f_detail.close() - - # compute result summary. - sod_sm_list.append(sod_sm) - sod_gm_list.append(sod_gm) - dis_k_sm_list.append(dis_k_sm) - dis_k_gm_list.append(dis_k_gm) - dis_k_gi_min_list.append(dis_k_gi_min) - # # SOD SM -> GM - if sod_sm > sod_gm: - nb_sod_sm2gm[0] += 1 - repeats_better_sod_sm2gm.append(repeat) - elif sod_sm == sod_gm: - nb_sod_sm2gm[1] += 1 - elif sod_sm < sod_gm: - nb_sod_sm2gm[2] += 1 - # # dis_k SM -> GM - if dis_k_sm > dis_k_gm: - nb_dis_k_sm2gm[0] += 1 - repeats_better_dis_k_sm2gm.append(repeat) - elif dis_k_sm == dis_k_gm: - nb_dis_k_sm2gm[1] += 1 - elif dis_k_sm < dis_k_gm: - nb_dis_k_sm2gm[2] += 1 - # # dis_k gi -> SM - if dis_k_gi_min > dis_k_sm: - nb_dis_k_gi2sm[0] += 1 - repeats_better_dis_k_gi2sm.append(repeat) - elif dis_k_gi_min == dis_k_sm: - nb_dis_k_gi2sm[1] += 1 - elif dis_k_gi_min < dis_k_sm: - nb_dis_k_gi2sm[2] += 1 - # # dis_k gi -> GM - if dis_k_gi_min > dis_k_gm: - nb_dis_k_gi2gm[0] += 1 - repeats_better_dis_k_gi2gm.append(repeat) - elif dis_k_gi_min == dis_k_gm: - nb_dis_k_gi2gm[1] += 1 - elif dis_k_gi_min < dis_k_gm: - nb_dis_k_gi2gm[2] += 1 - - # write result summary. - sod_sm_mean = np.mean(sod_sm_list) - sod_gm_mean = np.mean(sod_gm_list) - dis_k_sm_mean = np.mean(dis_k_sm_list) - dis_k_gm_mean = np.mean(dis_k_gm_list) - dis_k_gi_min_mean = np.mean(dis_k_gi_min_list) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean - sod_sm_mean)) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_sm_mean)) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean - dis_k_gi_min_mean)) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_gi_min_mean)) - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, - sod_sm_mean, sod_gm_mean, dis_k_sm_mean, dis_k_gm_mean, - dis_k_gi_min_mean, sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean, nb_sod_sm2gm, - nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm, - repeats_better_sod_sm2gm, repeats_better_dis_k_sm2gm, - repeats_better_dis_k_gi2sm, repeats_better_dis_k_gi2gm]) - f_summary.close() - - print('\ncomplete.') - return - - -def getRelations(sign): - if sign == -1: - return 'better' - elif sign == 0: - return 'same' - elif sign == 1: - return 'worse' - - -if __name__ == '__main__': - find_best_k() \ No newline at end of file diff --git a/gklearn/preimage/fitDistance.py b/gklearn/preimage/fitDistance.py deleted file mode 100644 index 234f7fc..0000000 --- a/gklearn/preimage/fitDistance.py +++ /dev/null @@ -1,430 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Wed Oct 16 14:20:06 2019 - -@author: ljia -""" -import numpy as np -from tqdm import tqdm -from itertools import combinations_with_replacement, combinations -import multiprocessing -from multiprocessing import Pool -from functools import partial -import time -import random -import sys - -from scipy import optimize -from scipy.optimize import minimize -import cvxpy as cp - -from gklearn.preimage.ged import GED, get_nb_edit_operations, get_nb_edit_operations_letter, get_nb_edit_operations_nonsymbolic -from gklearn.preimage.utils import kernel_distance_matrix - -def fit_GED_to_kernel_distance(Gn, node_label, edge_label, gkernel, itr_max, - params_ged={'lib': 'gedlibpy', 'cost': 'CONSTANT', - 'method': 'IPFP', 'stabilizer': None}, - init_costs=[3, 3, 1, 3, 3, 1], - dataset='monoterpenoides', Kmatrix=None, - parallel=True): -# dataset = dataset.lower() - - # c_vi, c_vr, c_vs, c_ei, c_er, c_es or parts of them. -# random.seed(1) -# cost_rdm = random.sample(range(1, 10), 6) -# init_costs = cost_rdm + [0] -# init_costs = cost_rdm -# init_costs = [3, 3, 1, 3, 3, 1] -# init_costs = [i * 0.01 for i in cost_rdm] + [0] -# init_costs = [0.2, 0.2, 0.2, 0.2, 0.2, 0] -# init_costs = [0, 0, 0.9544, 0.026, 0.0196, 0] -# init_costs = [0.008429912251810438, 0.025461055985319694, 0.2047320869225948, 0.004148727085832133, 0.0, 0] -# idx_cost_nonzeros = [i for i, item in enumerate(edit_costs) if item != 0] - - # compute distances in feature space. - dis_k_mat, _, _, _ = kernel_distance_matrix(Gn, node_label, edge_label, - Kmatrix=Kmatrix, gkernel=gkernel) - dis_k_vec = [] - for i in range(len(dis_k_mat)): -# for j in range(i, len(dis_k_mat)): - for j in range(i + 1, len(dis_k_mat)): - dis_k_vec.append(dis_k_mat[i, j]) - dis_k_vec = np.array(dis_k_vec) - - # init ged. - print('\ninitial:') - time0 = time.time() - params_ged['dataset'] = dataset - params_ged['edit_cost_constant'] = init_costs - ged_vec_init, ged_mat, n_edit_operations = compute_geds(Gn, params_ged, - parallel=parallel) - residual_list = [np.sqrt(np.sum(np.square(np.array(ged_vec_init) - dis_k_vec)))] - time_list = [time.time() - time0] - edit_cost_list = [init_costs] - nb_cost_mat = np.array(n_edit_operations) - nb_cost_mat_list = [nb_cost_mat] - print('edit_costs:', init_costs) - print('residual_list:', residual_list) - - for itr in range(itr_max): - print('\niteration', itr) - time0 = time.time() - # "fit" geds to distances in feature space by tuning edit costs using the - # Least Squares Method. - np.savez('results/xp_fit_method/fit_data_debug' + str(itr) + '.gm', - nb_cost_mat=nb_cost_mat, dis_k_vec=dis_k_vec, - n_edit_operations=n_edit_operations, ged_vec_init=ged_vec_init, - ged_mat=ged_mat) - edit_costs_new, residual = update_costs(nb_cost_mat, dis_k_vec, - dataset=dataset, cost=params_ged['cost']) - for i in range(len(edit_costs_new)): - if -1e-9 <= edit_costs_new[i] <= 1e-9: - edit_costs_new[i] = 0 - if edit_costs_new[i] < 0: - raise ValueError('The edit cost is negative.') -# for i in range(len(edit_costs_new)): -# if edit_costs_new[i] < 0: -# edit_costs_new[i] = 0 - - # compute new GEDs and numbers of edit operations. - params_ged['edit_cost_constant'] = edit_costs_new # np.array([edit_costs_new[0], edit_costs_new[1], 0.75]) - ged_vec, ged_mat, n_edit_operations = compute_geds(Gn, params_ged, - parallel=parallel) - residual_list.append(np.sqrt(np.sum(np.square(np.array(ged_vec) - dis_k_vec)))) - time_list.append(time.time() - time0) - edit_cost_list.append(edit_costs_new) - nb_cost_mat = np.array(n_edit_operations) - nb_cost_mat_list.append(nb_cost_mat) - print('edit_costs:', edit_costs_new) - print('residual_list:', residual_list) - - return edit_costs_new, residual_list, edit_cost_list, dis_k_mat, ged_mat, \ - time_list, nb_cost_mat_list - - -def compute_geds(Gn, params_ged, parallel=False): - edit_cost_name = params_ged['cost'] - if edit_cost_name == 'LETTER' or edit_cost_name == 'LETTER2': - get_nb_eo = get_nb_edit_operations_letter - elif edit_cost_name == 'NON_SYMBOLIC': - get_nb_eo = get_nb_edit_operations_nonsymbolic - else: - get_nb_eo = get_nb_edit_operations - ged_mat = np.zeros((len(Gn), len(Gn))) - if parallel: -# print('parallel') -# len_itr = int(len(Gn) * (len(Gn) + 1) / 2) - len_itr = int(len(Gn) * (len(Gn) - 1) / 2) - ged_vec = [0 for i in range(len_itr)] - n_edit_operations = [0 for i in range(len_itr)] -# itr = combinations_with_replacement(range(0, len(Gn)), 2) - itr = combinations(range(0, len(Gn)), 2) - n_jobs = multiprocessing.cpu_count() - if len_itr < 100 * n_jobs: - chunksize = int(len_itr / n_jobs) + 1 - else: - chunksize = 100 - def init_worker(gn_toshare): - global G_gn - G_gn = gn_toshare - do_partial = partial(_wrapper_compute_ged_parallel, params_ged, get_nb_eo) - pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(Gn,)) - iterator = tqdm(pool.imap_unordered(do_partial, itr, chunksize), - desc='computing GEDs', file=sys.stdout) -# iterator = pool.imap_unordered(do_partial, itr, chunksize) - for i, j, dis, n_eo_tmp in iterator: - idx_itr = int(len(Gn) * i + j - (i + 1) * (i + 2) / 2) - ged_vec[idx_itr] = dis - ged_mat[i][j] = dis - ged_mat[j][i] = dis - n_edit_operations[idx_itr] = n_eo_tmp -# print('\n-------------------------------------------') -# print(i, j, idx_itr, dis) - pool.close() - pool.join() - - else: - ged_vec = [] - n_edit_operations = [] - for i in tqdm(range(len(Gn)), desc='computing GEDs', file=sys.stdout): -# for i in range(len(Gn)): - for j in range(i + 1, len(Gn)): - dis, pi_forward, pi_backward = GED(Gn[i], Gn[j], **params_ged) - ged_vec.append(dis) - ged_mat[i][j] = dis - ged_mat[j][i] = dis - n_eo_tmp = get_nb_eo(Gn[i], Gn[j], pi_forward, pi_backward) - n_edit_operations.append(n_eo_tmp) - - return ged_vec, ged_mat, n_edit_operations - - -def _wrapper_compute_ged_parallel(params_ged, get_nb_eo, itr): - i = itr[0] - j = itr[1] - dis, n_eo_tmp = _compute_ged_parallel(G_gn[i], G_gn[j], params_ged, get_nb_eo) - return i, j, dis, n_eo_tmp - - -def _compute_ged_parallel(g1, g2, params_ged, get_nb_eo): - dis, pi_forward, pi_backward = GED(g1, g2, **params_ged) - n_eo_tmp = get_nb_eo(g1, g2, pi_forward, pi_backward) # [0,0,0,0,0,0] - return dis, n_eo_tmp - - -def update_costs(nb_cost_mat, dis_k_vec, dataset='monoterpenoides', - cost='CONSTANT', rw_constraints='inequality'): -# if dataset == 'Letter-high': - if cost == 'LETTER': - pass -# # method 1: set alpha automatically, just tune c_vir and c_eir by -# # LMS using cvxpy. -# alpha = 0.5 -# coeff = 100 # np.max(alpha * nb_cost_mat[:,4] / dis_k_vec) -## if np.count_nonzero(nb_cost_mat[:,4]) == 0: -## alpha = 0.75 -## else: -## alpha = np.min([dis_k_vec / c_vs for c_vs in nb_cost_mat[:,4] if c_vs != 0]) -## alpha = alpha * 0.99 -# param_vir = alpha * (nb_cost_mat[:,0] + nb_cost_mat[:,1]) -# param_eir = (1 - alpha) * (nb_cost_mat[:,4] + nb_cost_mat[:,5]) -# nb_cost_mat_new = np.column_stack((param_vir, param_eir)) -# dis_new = coeff * dis_k_vec - alpha * nb_cost_mat[:,3] -# -# x = cp.Variable(nb_cost_mat_new.shape[1]) -# cost = cp.sum_squares(nb_cost_mat_new * x - dis_new) -# constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])]] -# prob = cp.Problem(cp.Minimize(cost), constraints) -# prob.solve() -# edit_costs_new = x.value -# edit_costs_new = np.array([edit_costs_new[0], edit_costs_new[1], alpha]) -# residual = np.sqrt(prob.value) - -# # method 2: tune c_vir, c_eir and alpha by nonlinear programming by -# # scipy.optimize.minimize. -# w0 = nb_cost_mat[:,0] + nb_cost_mat[:,1] -# w1 = nb_cost_mat[:,4] + nb_cost_mat[:,5] -# w2 = nb_cost_mat[:,3] -# w3 = dis_k_vec -# func_min = lambda x: np.sum((w0 * x[0] * x[3] + w1 * x[1] * (1 - x[2]) \ -# + w2 * x[2] - w3 * x[3]) ** 2) -# bounds = ((0, None), (0., None), (0.5, 0.5), (0, None)) -# res = minimize(func_min, [0.9, 1.7, 0.75, 10], bounds=bounds) -# edit_costs_new = res.x[0:3] -# residual = res.fun - - # method 3: tune c_vir, c_eir and alpha by nonlinear programming using cvxpy. - - -# # method 4: tune c_vir, c_eir and alpha by QP function -# # scipy.optimize.least_squares. An initial guess is required. -# w0 = nb_cost_mat[:,0] + nb_cost_mat[:,1] -# w1 = nb_cost_mat[:,4] + nb_cost_mat[:,5] -# w2 = nb_cost_mat[:,3] -# w3 = dis_k_vec -# func = lambda x: (w0 * x[0] * x[3] + w1 * x[1] * (1 - x[2]) \ -# + w2 * x[2] - w3 * x[3]) ** 2 -# res = optimize.root(func, [0.9, 1.7, 0.75, 100]) -# edit_costs_new = res.x -# residual = None - elif cost == 'LETTER2': -# # 1. if c_vi != c_vr, c_ei != c_er. -# nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] -# x = cp.Variable(nb_cost_mat_new.shape[1]) -# cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) -## # 1.1 no constraints. -## constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])]] -# # 1.2 c_vs <= c_vi + c_vr. -# constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], -# np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] -## # 2. if c_vi == c_vr, c_ei == c_er. -## nb_cost_mat_new = nb_cost_mat[:,[0,3,4]] -## nb_cost_mat_new[:,0] += nb_cost_mat[:,1] -## nb_cost_mat_new[:,2] += nb_cost_mat[:,5] -## x = cp.Variable(nb_cost_mat_new.shape[1]) -## cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) -## # 2.1 no constraints. -## constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])]] -### # 2.2 c_vs <= c_vi + c_vr. -### constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], -### np.array([2.0, -1.0, 0.0]).T@x >= 0.0] -# -# prob = cp.Problem(cp.Minimize(cost_fun), constraints) -# prob.solve() -# edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] -# edit_costs_new = np.array(edit_costs_new) -# residual = np.sqrt(prob.value) - if rw_constraints == 'inequality': - # c_vs <= c_vi + c_vr. - nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.001 for i in range(nb_cost_mat_new.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - try: - prob.solve(verbose=True) - except MemoryError as error0: - print('\nUsing solver "OSQP" caused a memory error.') - print('the original error message is\n', error0) - print('solver status: ', prob.status) - print('trying solver "CVXOPT" instead...\n') - try: - prob.solve(solver=cp.CVXOPT, verbose=True) - except Exception as error1: - print('\nAn error occured when using solver "CVXOPT".') - print('the original error message is\n', error1) - print('solver status: ', prob.status) - print('trying solver "MOSEK" instead. Notice this solver is commercial and a lisence is required.\n') - prob.solve(solver=cp.MOSEK, verbose=True) - else: - print('solver status: ', prob.status) - else: - print('solver status: ', prob.status) - print() - edit_costs_new = x.value - residual = np.sqrt(prob.value) - elif rw_constraints == '2constraints': - # c_vs <= c_vi + c_vr and c_vi == c_vr, c_ei == c_er. - nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, - np.array([1.0, -1.0, 0.0, 0.0, 0.0]).T@x == 0.0, - np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - edit_costs_new = x.value - residual = np.sqrt(prob.value) - elif rw_constraints == 'no-constraint': - # no constraint. - nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - edit_costs_new = x.value - residual = np.sqrt(prob.value) -# elif method == 'inequality_modified': -# # c_vs <= c_vi + c_vr. -# nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] -# x = cp.Variable(nb_cost_mat_new.shape[1]) -# cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) -# constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], -# np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] -# prob = cp.Problem(cp.Minimize(cost_fun), constraints) -# prob.solve() -# # use same costs for insertion and removal rather than the fitted costs. -# edit_costs_new = [x.value[0], x.value[0], x.value[1], x.value[2], x.value[2]] -# edit_costs_new = np.array(edit_costs_new) -# residual = np.sqrt(prob.value) - elif cost == 'NON_SYMBOLIC': - is_n_attr = np.count_nonzero(nb_cost_mat[:,2]) - is_e_attr = np.count_nonzero(nb_cost_mat[:,5]) - - if dataset == 'SYNTHETICnew': -# nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] - nb_cost_mat_new = nb_cost_mat[:,[2,3,4]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) -# constraints = [x >= [0.0 for i in range(nb_cost_mat_new.shape[1])], -# np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] -# constraints = [x >= [0.0001 for i in range(nb_cost_mat_new.shape[1])]] - constraints = [x >= [0.0001 for i in range(nb_cost_mat_new.shape[1])], - np.array([0.0, 1.0, -1.0]).T@x == 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() -# print(x.value) - edit_costs_new = np.concatenate((np.array([0.0, 0.0]), x.value, - np.array([0.0]))) - residual = np.sqrt(prob.value) - - elif rw_constraints == 'inequality': - # c_vs <= c_vi + c_vr. - if is_n_attr and is_e_attr: - nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4,5]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, - np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - edit_costs_new = x.value - residual = np.sqrt(prob.value) - elif is_n_attr and not is_e_attr: - nb_cost_mat_new = nb_cost_mat[:,[0,1,2,3,4]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.001 for i in range(nb_cost_mat_new.shape[1])], - np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - print(x.value) - edit_costs_new = np.concatenate((x.value, np.array([0.0]))) - residual = np.sqrt(prob.value) - elif not is_n_attr and is_e_attr: - nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4,5]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])], - np.array([0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), x.value[2:])) - residual = np.sqrt(prob.value) - else: - nb_cost_mat_new = nb_cost_mat[:,[0,1,3,4]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) - constraints = [x >= [0.01 for i in range(nb_cost_mat_new.shape[1])]] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - edit_costs_new = np.concatenate((x.value[0:2], np.array([0.0]), - x.value[2:], np.array([0.0]))) - residual = np.sqrt(prob.value) - else: -# # method 1: simple least square method. -# edit_costs_new, residual, _, _ = np.linalg.lstsq(nb_cost_mat, dis_k_vec, -# rcond=None) - -# # method 2: least square method with x_i >= 0. -# edit_costs_new, residual = optimize.nnls(nb_cost_mat, dis_k_vec) - - # method 3: solve as a quadratic program with constraints. -# P = np.dot(nb_cost_mat.T, nb_cost_mat) -# q_T = -2 * np.dot(dis_k_vec.T, nb_cost_mat) -# G = -1 * np.identity(nb_cost_mat.shape[1]) -# h = np.array([0 for i in range(nb_cost_mat.shape[1])]) -# A = np.array([1 for i in range(nb_cost_mat.shape[1])]) -# b = 1 -# x = cp.Variable(nb_cost_mat.shape[1]) -# prob = cp.Problem(cp.Minimize(cp.quad_form(x, P) + q_T@x), -# [G@x <= h]) -# prob.solve() -# edit_costs_new = x.value -# residual = prob.value - np.dot(dis_k_vec.T, dis_k_vec) - -# G = -1 * np.identity(nb_cost_mat.shape[1]) -# h = np.array([0 for i in range(nb_cost_mat.shape[1])]) - x = cp.Variable(nb_cost_mat.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat * x - dis_k_vec) - constraints = [x >= [0.0 for i in range(nb_cost_mat.shape[1])], - # np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] - np.array([1.0, 1.0, -1.0, 0.0, 0.0, 0.0]).T@x >= 0.0, - np.array([0.0, 0.0, 0.0, 1.0, 1.0, -1.0]).T@x >= 0.0] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - edit_costs_new = x.value - residual = np.sqrt(prob.value) - - # method 4: - - return edit_costs_new, residual - - -if __name__ == '__main__': - print('check test_fitDistance.py') \ No newline at end of file diff --git a/gklearn/preimage/ged.py b/gklearn/preimage/ged.py deleted file mode 100644 index a66baaf..0000000 --- a/gklearn/preimage/ged.py +++ /dev/null @@ -1,467 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Oct 17 18:44:59 2019 - -@author: ljia -""" -import numpy as np -import networkx as nx -from tqdm import tqdm -import sys -import multiprocessing -from multiprocessing import Pool -from functools import partial - -#from gedlibpy_linlin import librariesImport, gedlibpy -from gklearn.gedlib import librariesImport, gedlibpy - -def GED(g1, g2, dataset='monoterpenoides', lib='gedlibpy', cost='CHEM_1', method='IPFP', - edit_cost_constant=[], algo_options='', stabilizer='min', repeat=50): - """ - Compute GED for 2 graphs. - """ - -# dataset = dataset.lower() - - if lib == 'gedlibpy': - gedlibpy.restart_env() - gedlibpy.add_nx_graph(convertGraph(g1, cost), "") - gedlibpy.add_nx_graph(convertGraph(g2, cost), "") - - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost(cost, edit_cost_constant=edit_cost_constant) - gedlibpy.init() - gedlibpy.set_method(method, algo_options) - gedlibpy.init_method() - - g = listID[0] - h = listID[1] - if stabilizer is None: - gedlibpy.run_method(g, h) - pi_forward = gedlibpy.get_forward_map(g, h) - pi_backward = gedlibpy.get_backward_map(g, h) - upper = gedlibpy.get_upper_bound(g, h) - lower = gedlibpy.get_lower_bound(g, h) - elif stabilizer == 'mean': - # @todo: to be finished... - upper_list = [np.inf] * repeat - for itr in range(repeat): - gedlibpy.run_method(g, h) - upper_list[itr] = gedlibpy.get_upper_bound(g, h) - pi_forward = gedlibpy.get_forward_map(g, h) - pi_backward = gedlibpy.get_backward_map(g, h) - lower = gedlibpy.get_lower_bound(g, h) - upper = np.mean(upper_list) - elif stabilizer == 'median': - if repeat % 2 == 0: - repeat += 1 - upper_list = [np.inf] * repeat - pi_forward_list = [0] * repeat - pi_backward_list = [0] * repeat - for itr in range(repeat): - gedlibpy.run_method(g, h) - upper_list[itr] = gedlibpy.get_upper_bound(g, h) - pi_forward_list[itr] = gedlibpy.get_forward_map(g, h) - pi_backward_list[itr] = gedlibpy.get_backward_map(g, h) - lower = gedlibpy.get_lower_bound(g, h) - upper = np.median(upper_list) - idx_median = upper_list.index(upper) - pi_forward = pi_forward_list[idx_median] - pi_backward = pi_backward_list[idx_median] - elif stabilizer == 'min': - upper = np.inf - for itr in range(repeat): - gedlibpy.run_method(g, h) - upper_tmp = gedlibpy.get_upper_bound(g, h) - if upper_tmp < upper: - upper = upper_tmp - pi_forward = gedlibpy.get_forward_map(g, h) - pi_backward = gedlibpy.get_backward_map(g, h) - lower = gedlibpy.get_lower_bound(g, h) - if upper == 0: - break - elif stabilizer == 'max': - upper = 0 - for itr in range(repeat): - gedlibpy.run_method(g, h) - upper_tmp = gedlibpy.get_upper_bound(g, h) - if upper_tmp > upper: - upper = upper_tmp - pi_forward = gedlibpy.get_forward_map(g, h) - pi_backward = gedlibpy.get_backward_map(g, h) - lower = gedlibpy.get_lower_bound(g, h) - elif stabilizer == 'gaussian': - pass - - dis = upper - - elif lib == 'gedlib-bash': - import time - import random - import os - from gklearn.utils.graphfiles import saveDataset - - tmp_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/' - if not os.path.exists(tmp_dir): - os.makedirs(tmp_dir) - fn_collection = tmp_dir + 'collection.' + str(time.time()) + str(random.randint(0, 1e9)) - xparams = {'method': 'gedlib', 'graph_dir': fn_collection} - saveDataset([g1, g2], ['dummy', 'dummy'], gformat='gxl', group='xml', - filename=fn_collection, xparams=xparams) - - command = 'GEDLIB_HOME=\'/media/ljia/DATA/research-repo/codes/others/gedlib/gedlib2\'\n' - command += 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GEDLIB_HOME/lib\n' - command += 'export LD_LIBRARY_PATH\n' - command += 'cd \'' + os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/bin\'\n' - command += './ged_for_python_bash monoterpenoides ' + fn_collection \ - + ' \'' + algo_options + '\' ' - for ec in edit_cost_constant: - command += str(ec) + ' ' -# output = os.system(command) - stream = os.popen(command) - output = stream.readlines() -# print(output) - - dis = float(output[0].strip()) - runtime = float(output[1].strip()) - size_forward = int(output[2].strip()) - pi_forward = [int(item.strip()) for item in output[3:3+size_forward]] - pi_backward = [int(item.strip()) for item in output[3+size_forward:]] - -# print(dis) -# print(runtime) -# print(size_forward) -# print(pi_forward) -# print(pi_backward) - - - # make the map label correct (label remove map as np.inf) - nodes1 = [n for n in g1.nodes()] - nodes2 = [n for n in g2.nodes()] - nb1 = nx.number_of_nodes(g1) - nb2 = nx.number_of_nodes(g2) - pi_forward = [nodes2[pi] if pi < nb2 else np.inf for pi in pi_forward] - pi_backward = [nodes1[pi] if pi < nb1 else np.inf for pi in pi_backward] -# print(pi_forward) - - - return dis, pi_forward, pi_backward - - -def convertGraph(G, cost): - """Convert a graph to the proper NetworkX format that can be - recognized by library gedlibpy. - """ - G_new = nx.Graph() - if cost == 'LETTER' or cost == 'LETTER2': - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd), x=str(attrs['attributes'][0]), - y=str(attrs['attributes'][1])) - for nd1, nd2, attrs in G.edges(data=True): - G_new.add_edge(str(nd1), str(nd2)) - elif cost == 'NON_SYMBOLIC': - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd)) - for a_name in G.graph['node_attrs']: - G_new.nodes[str(nd)][a_name] = str(attrs[a_name]) - for nd1, nd2, attrs in G.edges(data=True): - G_new.add_edge(str(nd1), str(nd2)) - for a_name in G.graph['edge_attrs']: - G_new.edges[str(nd1), str(nd2)][a_name] = str(attrs[a_name]) - else: - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd), chem=attrs['atom']) - for nd1, nd2, attrs in G.edges(data=True): - G_new.add_edge(str(nd1), str(nd2), valence=attrs['bond_type']) -# G_new.add_edge(str(nd1), str(nd2)) - - return G_new - - -def GED_n(Gn, lib='gedlibpy', cost='CHEM_1', method='IPFP', - edit_cost_constant=[], stabilizer='min', repeat=50): - """ - Compute GEDs for a group of graphs. - """ - if lib == 'gedlibpy': - def convertGraph(G): - """Convert a graph to the proper NetworkX format that can be - recognized by library gedlibpy. - """ - G_new = nx.Graph() - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd), chem=attrs['atom']) - for nd1, nd2, attrs in G.edges(data=True): -# G_new.add_edge(str(nd1), str(nd2), valence=attrs['bond_type']) - G_new.add_edge(str(nd1), str(nd2)) - - return G_new - - gedlibpy.restart_env() - gedlibpy.add_nx_graph(convertGraph(g1), "") - gedlibpy.add_nx_graph(convertGraph(g2), "") - - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost(cost, edit_cost_constant=edit_cost_constant) - gedlibpy.init() - gedlibpy.set_method(method, "") - gedlibpy.init_method() - - g = listID[0] - h = listID[1] - if stabilizer is None: - gedlibpy.run_method(g, h) - pi_forward = gedlibpy.get_forward_map(g, h) - pi_backward = gedlibpy.get_backward_map(g, h) - upper = gedlibpy.get_upper_bound(g, h) - lower = gedlibpy.get_lower_bound(g, h) - elif stabilizer == 'min': - upper = np.inf - for itr in range(repeat): - gedlibpy.run_method(g, h) - upper_tmp = gedlibpy.get_upper_bound(g, h) - if upper_tmp < upper: - upper = upper_tmp - pi_forward = gedlibpy.get_forward_map(g, h) - pi_backward = gedlibpy.get_backward_map(g, h) - lower = gedlibpy.get_lower_bound(g, h) - if upper == 0: - break - - dis = upper - - # make the map label correct (label remove map as np.inf) - nodes1 = [n for n in g1.nodes()] - nodes2 = [n for n in g2.nodes()] - nb1 = nx.number_of_nodes(g1) - nb2 = nx.number_of_nodes(g2) - pi_forward = [nodes2[pi] if pi < nb2 else np.inf for pi in pi_forward] - pi_backward = [nodes1[pi] if pi < nb1 else np.inf for pi in pi_backward] - - return dis, pi_forward, pi_backward - - -def ged_median(Gn, Gn_median, verbose=False, params_ged={'lib': 'gedlibpy', - 'cost': 'CHEM_1', 'method': 'IPFP', 'edit_cost_constant': [], - 'algo_options': '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1', - 'stabilizer': None}, parallel=False): - if parallel: - len_itr = int(len(Gn)) - pi_forward_list = [[] for i in range(len_itr)] - dis_list = [0 for i in range(len_itr)] - - itr = range(0, len_itr) - n_jobs = multiprocessing.cpu_count() - if len_itr < 100 * n_jobs: - chunksize = int(len_itr / n_jobs) + 1 - else: - chunksize = 100 - def init_worker(gn_toshare, gn_median_toshare): - global G_gn, G_gn_median - G_gn = gn_toshare - G_gn_median = gn_median_toshare - do_partial = partial(_compute_ged_median, params_ged) - pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(Gn, Gn_median)) - if verbose: - iterator = tqdm(pool.imap_unordered(do_partial, itr, chunksize), - desc='computing GEDs', file=sys.stdout) - else: - iterator = pool.imap_unordered(do_partial, itr, chunksize) - for i, dis_sum, pi_forward in iterator: - pi_forward_list[i] = pi_forward - dis_list[i] = dis_sum -# print('\n-------------------------------------------') -# print(i, j, idx_itr, dis) - pool.close() - pool.join() - - else: - dis_list = [] - pi_forward_list = [] - for idx, G in tqdm(enumerate(Gn), desc='computing median distances', - file=sys.stdout) if verbose else enumerate(Gn): - dis_sum = 0 - pi_forward_list.append([]) - for G_p in Gn_median: - dis_tmp, pi_tmp_forward, pi_tmp_backward = GED(G, G_p, - **params_ged) - pi_forward_list[idx].append(pi_tmp_forward) - dis_sum += dis_tmp - dis_list.append(dis_sum) - - return dis_list, pi_forward_list - - -def _compute_ged_median(params_ged, itr): -# print(itr) - dis_sum = 0 - pi_forward = [] - for G_p in G_gn_median: - dis_tmp, pi_tmp_forward, pi_tmp_backward = GED(G_gn[itr], G_p, - **params_ged) - pi_forward.append(pi_tmp_forward) - dis_sum += dis_tmp - - return itr, dis_sum, pi_forward - - -def get_nb_edit_operations(g1, g2, forward_map, backward_map): - """Compute the number of each edit operations. - """ - n_vi = 0 - n_vr = 0 - n_vs = 0 - n_ei = 0 - n_er = 0 - n_es = 0 - - nodes1 = [n for n in g1.nodes()] - for i, map_i in enumerate(forward_map): - if map_i == np.inf: - n_vr += 1 - elif g1.node[nodes1[i]]['atom'] != g2.node[map_i]['atom']: - n_vs += 1 - for map_i in backward_map: - if map_i == np.inf: - n_vi += 1 - -# idx_nodes1 = range(0, len(node1)) - - edges1 = [e for e in g1.edges()] - nb_edges2_cnted = 0 - for n1, n2 in edges1: - idx1 = nodes1.index(n1) - idx2 = nodes1.index(n2) - # one of the nodes is removed, thus the edge is removed. - if forward_map[idx1] == np.inf or forward_map[idx2] == np.inf: - n_er += 1 - # corresponding edge is in g2. - elif (forward_map[idx1], forward_map[idx2]) in g2.edges(): - nb_edges2_cnted += 1 - # edge labels are different. - if g2.edges[((forward_map[idx1], forward_map[idx2]))]['bond_type'] \ - != g1.edges[(n1, n2)]['bond_type']: - n_es += 1 - elif (forward_map[idx2], forward_map[idx1]) in g2.edges(): - nb_edges2_cnted += 1 - # edge labels are different. - if g2.edges[((forward_map[idx2], forward_map[idx1]))]['bond_type'] \ - != g1.edges[(n1, n2)]['bond_type']: - n_es += 1 - # corresponding nodes are in g2, however the edge is removed. - else: - n_er += 1 - n_ei = nx.number_of_edges(g2) - nb_edges2_cnted - - return n_vi, n_vr, n_vs, n_ei, n_er, n_es - - -def get_nb_edit_operations_letter(g1, g2, forward_map, backward_map): - """Compute the number of each edit operations. - """ - n_vi = 0 - n_vr = 0 - n_vs = 0 - sod_vs = 0 - n_ei = 0 - n_er = 0 - - nodes1 = [n for n in g1.nodes()] - for i, map_i in enumerate(forward_map): - if map_i == np.inf: - n_vr += 1 - else: - n_vs += 1 - diff_x = float(g1.nodes[nodes1[i]]['x']) - float(g2.nodes[map_i]['x']) - diff_y = float(g1.nodes[nodes1[i]]['y']) - float(g2.nodes[map_i]['y']) - sod_vs += np.sqrt(np.square(diff_x) + np.square(diff_y)) - for map_i in backward_map: - if map_i == np.inf: - n_vi += 1 - -# idx_nodes1 = range(0, len(node1)) - - edges1 = [e for e in g1.edges()] - nb_edges2_cnted = 0 - for n1, n2 in edges1: - idx1 = nodes1.index(n1) - idx2 = nodes1.index(n2) - # one of the nodes is removed, thus the edge is removed. - if forward_map[idx1] == np.inf or forward_map[idx2] == np.inf: - n_er += 1 - # corresponding edge is in g2. Edge label is not considered. - elif (forward_map[idx1], forward_map[idx2]) in g2.edges() or \ - (forward_map[idx2], forward_map[idx1]) in g2.edges(): - nb_edges2_cnted += 1 - # corresponding nodes are in g2, however the edge is removed. - else: - n_er += 1 - n_ei = nx.number_of_edges(g2) - nb_edges2_cnted - - return n_vi, n_vr, n_vs, sod_vs, n_ei, n_er - - -def get_nb_edit_operations_nonsymbolic(g1, g2, forward_map, backward_map): - """Compute the number of each edit operations. - """ - n_vi = 0 - n_vr = 0 - n_vs = 0 - sod_vs = 0 - n_ei = 0 - n_er = 0 - n_es = 0 - sod_es = 0 - - nodes1 = [n for n in g1.nodes()] - for i, map_i in enumerate(forward_map): - if map_i == np.inf: - n_vr += 1 - else: - n_vs += 1 - sum_squares = 0 - for a_name in g1.graph['node_attrs']: - diff = float(g1.nodes[nodes1[i]][a_name]) - float(g2.nodes[map_i][a_name]) - sum_squares += np.square(diff) - sod_vs += np.sqrt(sum_squares) - for map_i in backward_map: - if map_i == np.inf: - n_vi += 1 - -# idx_nodes1 = range(0, len(node1)) - - edges1 = [e for e in g1.edges()] - for n1, n2 in edges1: - idx1 = nodes1.index(n1) - idx2 = nodes1.index(n2) - n1_g2 = forward_map[idx1] - n2_g2 = forward_map[idx2] - # one of the nodes is removed, thus the edge is removed. - if n1_g2 == np.inf or n2_g2 == np.inf: - n_er += 1 - # corresponding edge is in g2. - elif (n1_g2, n2_g2) in g2.edges(): - n_es += 1 - sum_squares = 0 - for a_name in g1.graph['edge_attrs']: - diff = float(g1.edges[n1, n2][a_name]) - float(g2.nodes[n1_g2, n2_g2][a_name]) - sum_squares += np.square(diff) - sod_es += np.sqrt(sum_squares) - elif (n2_g2, n1_g2) in g2.edges(): - n_es += 1 - sum_squares = 0 - for a_name in g1.graph['edge_attrs']: - diff = float(g1.edges[n2, n1][a_name]) - float(g2.nodes[n2_g2, n1_g2][a_name]) - sum_squares += np.square(diff) - sod_es += np.sqrt(sum_squares) - # corresponding nodes are in g2, however the edge is removed. - else: - n_er += 1 - n_ei = nx.number_of_edges(g2) - n_es - - return n_vi, n_vr, sod_vs, n_ei, n_er, sod_es - - -if __name__ == '__main__': - print('check test_ged.py') \ No newline at end of file diff --git a/gklearn/preimage/iam.py b/gklearn/preimage/iam.py deleted file mode 100644 index f3e2165..0000000 --- a/gklearn/preimage/iam.py +++ /dev/null @@ -1,775 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Apr 26 11:49:12 2019 - -Iterative alternate minimizations using GED. -@author: ljia -""" -import numpy as np -import random -import networkx as nx -from tqdm import tqdm - -from gklearn.utils.graphdataset import get_dataset_attributes -from gklearn.utils.utils import graph_isIdentical, get_node_labels, get_edge_labels -from gklearn.preimage.ged import GED, ged_median - - -def iam_upgraded(Gn_median, Gn_candidate, c_ei=3, c_er=3, c_es=1, ite_max=50, - epsilon=0.001, node_label='atom', edge_label='bond_type', - connected=False, removeNodes=True, allBestInit=False, allBestNodes=False, - allBestEdges=False, allBestOutput=False, - params_ged={'lib': 'gedlibpy', 'cost': 'CHEM_1', 'method': 'IPFP', - 'edit_cost_constant': [], 'stabilizer': None, - 'algo_options': '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1'}): - """See my name, then you know what I do. - """ -# Gn_median = Gn_median[0:10] -# Gn_median = [nx.convert_node_labels_to_integers(g) for g in Gn_median] - node_ir = np.inf # corresponding to the node remove and insertion. - label_r = 'thanksdanny' # the label for node remove. # @todo: make this label unrepeatable. - ds_attrs = get_dataset_attributes(Gn_median + Gn_candidate, - attr_names=['edge_labeled', 'node_attr_dim', 'edge_attr_dim'], - edge_label=edge_label) - node_label_set = get_node_labels(Gn_median, node_label) - edge_label_set = get_edge_labels(Gn_median, edge_label) - - - def generate_graph(G, pi_p_forward): - G_new_list = [G.copy()] # all "best" graphs generated in this iteration. -# nx.draw_networkx(G) -# import matplotlib.pyplot as plt -# plt.show() -# print(pi_p_forward) - - # update vertex labels. - # pre-compute h_i0 for each label. -# for label in get_node_labels(Gn, node_label): -# print(label) -# for nd in G.nodes(data=True): -# pass - if not ds_attrs['node_attr_dim']: # labels are symbolic - for ndi, (nd, _) in enumerate(G.nodes(data=True)): - h_i0_list = [] - label_list = [] - for label in node_label_set: - h_i0 = 0 - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][ndi] - if pi_i != node_ir and g.nodes[pi_i][node_label] == label: - h_i0 += 1 - h_i0_list.append(h_i0) - label_list.append(label) - # case when the node is to be removed. - if removeNodes: - h_i0_remove = 0 # @todo: maybe this can be added to the node_label_set above. - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][ndi] - if pi_i == node_ir: - h_i0_remove += 1 - h_i0_list.append(h_i0_remove) - label_list.append(label_r) - # get the best labels. - idx_max = np.argwhere(h_i0_list == np.max(h_i0_list)).flatten().tolist() - if allBestNodes: # choose all best graphs. - nlabel_best = [label_list[idx] for idx in idx_max] - # generate "best" graphs with regard to "best" node labels. - G_new_list_nd = [] - for g in G_new_list: # @todo: seems it can be simplified. The G_new_list will only contain 1 graph for now. - for nl in nlabel_best: - g_tmp = g.copy() - if nl == label_r: - g_tmp.remove_node(nd) - else: - g_tmp.nodes[nd][node_label] = nl - G_new_list_nd.append(g_tmp) - # nx.draw_networkx(g_tmp) - # import matplotlib.pyplot as plt - # plt.show() - # print(g_tmp.nodes(data=True)) - # print(g_tmp.edges(data=True)) - G_new_list = [ggg.copy() for ggg in G_new_list_nd] - else: - # choose one of the best randomly. - idx_rdm = random.randint(0, len(idx_max) - 1) - best_label = label_list[idx_max[idx_rdm]] - h_i0_max = h_i0_list[idx_max[idx_rdm]] - - g_new = G_new_list[0] - if best_label == label_r: - g_new.remove_node(nd) - else: - g_new.nodes[nd][node_label] = best_label - G_new_list = [g_new] - else: # labels are non-symbolic - for ndi, (nd, _) in enumerate(G.nodes(data=True)): - Si_norm = 0 - phi_i_bar = np.array([0.0 for _ in range(ds_attrs['node_attr_dim'])]) - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][ndi] - if g.has_node(pi_i): #@todo: what if no g has node? phi_i_bar = 0? - Si_norm += 1 - phi_i_bar += np.array([float(itm) for itm in g.nodes[pi_i]['attributes']]) - phi_i_bar /= Si_norm - G_new_list[0].nodes[nd]['attributes'] = phi_i_bar - -# for g in G_new_list: -# import matplotlib.pyplot as plt -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - # update edge labels and adjacency matrix. - if ds_attrs['edge_labeled']: - G_new_list_edge = [] - for g_new in G_new_list: - nd_list = [n for n in g_new.nodes()] - g_tmp_list = [g_new.copy()] - for nd1i in range(nx.number_of_nodes(g_new)): - nd1 = nd_list[nd1i]# @todo: not just edges, but all pairs of nodes - for nd2i in range(nd1i + 1, nx.number_of_nodes(g_new)): - nd2 = nd_list[nd2i] -# for nd1, nd2, _ in g_new.edges(data=True): - h_ij0_list = [] - label_list = [] - for label in edge_label_set: - h_ij0 = 0 - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][nd1i] - pi_j = pi_p_forward[idx][nd2i] - h_ij0_p = (g.has_node(pi_i) and g.has_node(pi_j) and - g.has_edge(pi_i, pi_j) and - g.edges[pi_i, pi_j][edge_label] == label) - h_ij0 += h_ij0_p - h_ij0_list.append(h_ij0) - label_list.append(label) - - # get the best labels. - idx_max = np.argwhere(h_ij0_list == np.max(h_ij0_list)).flatten().tolist() - if allBestEdges: # choose all best graphs. - elabel_best = [label_list[idx] for idx in idx_max] - h_ij0_max = [h_ij0_list[idx] for idx in idx_max] - # generate "best" graphs with regard to "best" node labels. - G_new_list_ed = [] - for g_tmp in g_tmp_list: # @todo: seems it can be simplified. The G_new_list will only contain 1 graph for now. - for idxl, el in enumerate(elabel_best): - g_tmp_copy = g_tmp.copy() - # check whether a_ij is 0 or 1. - sij_norm = 0 - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][nd1i] - pi_j = pi_p_forward[idx][nd2i] - if g.has_node(pi_i) and g.has_node(pi_j) and \ - g.has_edge(pi_i, pi_j): - sij_norm += 1 - if h_ij0_max[idxl] > len(Gn_median) * c_er / c_es + \ - sij_norm * (1 - (c_er + c_ei) / c_es): - if not g_tmp_copy.has_edge(nd1, nd2): - g_tmp_copy.add_edge(nd1, nd2) - g_tmp_copy.edges[nd1, nd2][edge_label] = elabel_best[idxl] - else: - if g_tmp_copy.has_edge(nd1, nd2): - g_tmp_copy.remove_edge(nd1, nd2) - G_new_list_ed.append(g_tmp_copy) - g_tmp_list = [ggg.copy() for ggg in G_new_list_ed] - else: # choose one of the best randomly. - idx_rdm = random.randint(0, len(idx_max) - 1) - best_label = label_list[idx_max[idx_rdm]] - h_ij0_max = h_ij0_list[idx_max[idx_rdm]] - - # check whether a_ij is 0 or 1. - sij_norm = 0 - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][nd1i] - pi_j = pi_p_forward[idx][nd2i] - if g.has_node(pi_i) and g.has_node(pi_j) and g.has_edge(pi_i, pi_j): - sij_norm += 1 - if h_ij0_max > len(Gn_median) * c_er / c_es + sij_norm * (1 - (c_er + c_ei) / c_es): - if not g_new.has_edge(nd1, nd2): - g_new.add_edge(nd1, nd2) - g_new.edges[nd1, nd2][edge_label] = best_label - else: -# elif h_ij0_max < len(Gn_median) * c_er / c_es + sij_norm * (1 - (c_er + c_ei) / c_es): - if g_new.has_edge(nd1, nd2): - g_new.remove_edge(nd1, nd2) - g_tmp_list = [g_new] - G_new_list_edge += g_tmp_list - G_new_list = [ggg.copy() for ggg in G_new_list_edge] - - - else: # if edges are unlabeled - # @todo: is this even right? G or g_tmp? check if the new one is right - # @todo: works only for undirected graphs. - - for g_tmp in G_new_list: - nd_list = [n for n in g_tmp.nodes()] - for nd1i in range(nx.number_of_nodes(g_tmp)): - nd1 = nd_list[nd1i] - for nd2i in range(nd1i + 1, nx.number_of_nodes(g_tmp)): - nd2 = nd_list[nd2i] - sij_norm = 0 - for idx, g in enumerate(Gn_median): - pi_i = pi_p_forward[idx][nd1i] - pi_j = pi_p_forward[idx][nd2i] - if g.has_node(pi_i) and g.has_node(pi_j) and g.has_edge(pi_i, pi_j): - sij_norm += 1 - if sij_norm > len(Gn_median) * c_er / (c_er + c_ei): - # @todo: should we consider if nd1 and nd2 in g_tmp? - # or just add the edge anyway? - if g_tmp.has_node(nd1) and g_tmp.has_node(nd2) \ - and not g_tmp.has_edge(nd1, nd2): - g_tmp.add_edge(nd1, nd2) - else: # @todo: which to use? -# elif sij_norm < len(Gn_median) * c_er / (c_er + c_ei): - if g_tmp.has_edge(nd1, nd2): - g_tmp.remove_edge(nd1, nd2) - # do not change anything when equal. - -# for i, g in enumerate(G_new_list): -# import matplotlib.pyplot as plt -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/gk_iam/simple_two/xx" + str(i) + ".png", format="PNG") -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - -# # find the best graph generated in this iteration and update pi_p. - # @todo: should we update all graphs generated or just the best ones? - dis_list, pi_forward_list = ged_median(G_new_list, Gn_median, - params_ged=params_ged) - # @todo: should we remove the identical and connectivity check? - # Don't know which is faster. - if ds_attrs['node_attr_dim'] == 0 and ds_attrs['edge_attr_dim'] == 0: - G_new_list, idx_list = remove_duplicates(G_new_list) - pi_forward_list = [pi_forward_list[idx] for idx in idx_list] - dis_list = [dis_list[idx] for idx in idx_list] -# if connected == True: -# G_new_list, idx_list = remove_disconnected(G_new_list) -# pi_forward_list = [pi_forward_list[idx] for idx in idx_list] -# idx_min_list = np.argwhere(dis_list == np.min(dis_list)).flatten().tolist() -# dis_min = dis_list[idx_min_tmp_list[0]] -# pi_forward_list = [pi_forward_list[idx] for idx in idx_min_list] -# G_new_list = [G_new_list[idx] for idx in idx_min_list] - -# for g in G_new_list: -# import matplotlib.pyplot as plt -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - return G_new_list, pi_forward_list, dis_list - - - def best_median_graphs(Gn_candidate, pi_all_forward, dis_all): - idx_min_list = np.argwhere(dis_all == np.min(dis_all)).flatten().tolist() - dis_min = dis_all[idx_min_list[0]] - pi_forward_min_list = [pi_all_forward[idx] for idx in idx_min_list] - G_min_list = [Gn_candidate[idx] for idx in idx_min_list] - return G_min_list, pi_forward_min_list, dis_min - - - def iteration_proc(G, pi_p_forward, cur_sod): - G_list = [G] - pi_forward_list = [pi_p_forward] - old_sod = cur_sod * 2 - sod_list = [cur_sod] - dis_list = [cur_sod] - # iterations. - itr = 0 - # @todo: what if difference == 0? -# while itr < ite_max and (np.abs(old_sod - cur_sod) > epsilon or -# np.abs(old_sod - cur_sod) == 0): - while itr < ite_max and np.abs(old_sod - cur_sod) > epsilon: -# while itr < ite_max: -# for itr in range(0, 5): # the convergence condition? - print('itr_iam is', itr) - G_new_list = [] - pi_forward_new_list = [] - dis_new_list = [] - for idx, g in enumerate(G_list): -# label_set = get_node_labels(Gn_median + [g], node_label) - G_tmp_list, pi_forward_tmp_list, dis_tmp_list = generate_graph( - g, pi_forward_list[idx]) - G_new_list += G_tmp_list - pi_forward_new_list += pi_forward_tmp_list - dis_new_list += dis_tmp_list - # @todo: need to remove duplicates here? - G_list = [ggg.copy() for ggg in G_new_list] - pi_forward_list = [pitem.copy() for pitem in pi_forward_new_list] - dis_list = dis_new_list[:] - - old_sod = cur_sod - cur_sod = np.min(dis_list) - sod_list.append(cur_sod) - - itr += 1 - - # @todo: do we return all graphs or the best ones? - # get the best ones of the generated graphs. - G_list, pi_forward_list, dis_min = best_median_graphs( - G_list, pi_forward_list, dis_list) - - if ds_attrs['node_attr_dim'] == 0 and ds_attrs['edge_attr_dim'] == 0: - G_list, idx_list = remove_duplicates(G_list) - pi_forward_list = [pi_forward_list[idx] for idx in idx_list] -# dis_list = [dis_list[idx] for idx in idx_list] - -# import matplotlib.pyplot as plt -# for g in G_list: -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - print('\nsods:', sod_list, '\n') - - return G_list, pi_forward_list, dis_min, sod_list - - - def remove_duplicates(Gn): - """Remove duplicate graphs from list. - """ - Gn_new = [] - idx_list = [] - for idx, g in enumerate(Gn): - dupl = False - for g_new in Gn_new: - if graph_isIdentical(g_new, g): - dupl = True - break - if not dupl: - Gn_new.append(g) - idx_list.append(idx) - return Gn_new, idx_list - - - def remove_disconnected(Gn): - """Remove disconnected graphs from list. - """ - Gn_new = [] - idx_list = [] - for idx, g in enumerate(Gn): - if nx.is_connected(g): - Gn_new.append(g) - idx_list.append(idx) - return Gn_new, idx_list - - - ########################################################################### - - # phase 1: initilize. - # compute set-median. - dis_min = np.inf - dis_list, pi_forward_all = ged_median(Gn_candidate, Gn_median, - params_ged=params_ged, parallel=True) - print('finish computing GEDs.') - # find all smallest distances. - if allBestInit: # try all best init graphs. - idx_min_list = range(len(dis_list)) - dis_min = dis_list - else: - idx_min_list = np.argwhere(dis_list == np.min(dis_list)).flatten().tolist() - dis_min = [dis_list[idx_min_list[0]]] * len(idx_min_list) - idx_min_rdm = random.randint(0, len(idx_min_list) - 1) - idx_min_list = [idx_min_list[idx_min_rdm]] - sod_set_median = np.min(dis_min) - - - # phase 2: iteration. - G_list = [] - dis_list = [] - pi_forward_list = [] - G_set_median_list = [] -# sod_list = [] - for idx_tmp, idx_min in enumerate(idx_min_list): -# print('idx_min is', idx_min) - G = Gn_candidate[idx_min].copy() - G_set_median_list.append(G.copy()) - # list of edit operations. - pi_p_forward = pi_forward_all[idx_min] -# pi_p_backward = pi_all_backward[idx_min] - Gi_list, pi_i_forward_list, dis_i_min, sod_list = iteration_proc(G, - pi_p_forward, dis_min[idx_tmp]) - G_list += Gi_list - dis_list += [dis_i_min] * len(Gi_list) - pi_forward_list += pi_i_forward_list - - - if ds_attrs['node_attr_dim'] == 0 and ds_attrs['edge_attr_dim'] == 0: - G_list, idx_list = remove_duplicates(G_list) - dis_list = [dis_list[idx] for idx in idx_list] - pi_forward_list = [pi_forward_list[idx] for idx in idx_list] - if connected == True: - G_list_con, idx_list = remove_disconnected(G_list) - # if there is no connected graphs at all, then remain the disconnected ones. - if len(G_list_con) > 0: # @todo: ?????????????????????????? - G_list = G_list_con - dis_list = [dis_list[idx] for idx in idx_list] - pi_forward_list = [pi_forward_list[idx] for idx in idx_list] - -# import matplotlib.pyplot as plt -# for g in G_list: -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - # get the best median graphs - G_gen_median_list, pi_forward_min_list, sod_gen_median = best_median_graphs( - G_list, pi_forward_list, dis_list) -# for g in G_gen_median_list: -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - if not allBestOutput: - # randomly choose one graph. - idx_rdm = random.randint(0, len(G_gen_median_list) - 1) - G_gen_median_list = [G_gen_median_list[idx_rdm]] - - return G_gen_median_list, sod_gen_median, sod_list, G_set_median_list, sod_set_median - - -def iam_bash(Gn_names, edit_cost_constant, cost='CONSTANT', initial_solutions=1, - dataset='monoterpenoides', - graph_dir=''): - """Compute the iam by c++ implementation (gedlib) through bash. - """ - import os - import time - - def createCollectionFile(Gn_names, y, filename): - """Create collection file. - """ - dirname_ds = os.path.dirname(filename) - if dirname_ds != '': - dirname_ds += '/' - if not os.path.exists(dirname_ds) : - os.makedirs(dirname_ds) - - with open(filename + '.xml', 'w') as fgroup: - fgroup.write("") - fgroup.write("\n") - fgroup.write("\n") - for idx, fname in enumerate(Gn_names): - fgroup.write("\n\t") - fgroup.write("\n") - fgroup.close() - - tmp_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/' - fn_collection = tmp_dir + 'collection.' + str(time.time()) + str(random.randint(0, 1e9)) - createCollectionFile(Gn_names, ['dummy'] * len(Gn_names), fn_collection) -# fn_collection = tmp_dir + 'collection_for_debug' -# graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/monoterpenoides/gxl' - -# if dataset == 'Letter-high' or dataset == 'Fingerprint': -# dataset = 'letter' - command = 'GEDLIB_HOME=\'/media/ljia/DATA/research-repo/codes/Linlin/gedlib\'\n' - command += 'LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GEDLIB_HOME/lib\n' - command += 'export LD_LIBRARY_PATH\n' - command += 'cd \'' + os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/bin\'\n' - command += './iam_for_python_bash ' + dataset + ' ' + fn_collection \ - + ' \'' + graph_dir + '\' ' + ' ' + cost + ' ' + str(initial_solutions) + ' ' - if edit_cost_constant is None: - command += 'None' - else: - for ec in edit_cost_constant: - command += str(ec) + ' ' -# output = os.system(command) - stream = os.popen(command) - - output = stream.readlines() -# print(output) - sod_sm = float(output[0].strip()) - sod_gm = float(output[1].strip()) - - fname_sm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/set_median.gxl' - fname_gm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/gen_median.gxl' - - return sod_sm, sod_gm, fname_sm, fname_gm - - - -############################################################################### -# Old implementations. - -def iam(Gn, c_ei=3, c_er=3, c_es=1, node_label='atom', edge_label='bond_type', - connected=True): - """See my name, then you know what I do. - """ -# Gn = Gn[0:10] - Gn = [nx.convert_node_labels_to_integers(g) for g in Gn] - - # phase 1: initilize. - # compute set-median. - dis_min = np.inf - pi_p = [] - pi_all = [] - for idx1, G_p in enumerate(Gn): - dist_sum = 0 - pi_all.append([]) - for idx2, G_p_prime in enumerate(Gn): - dist_tmp, pi_tmp, _ = GED(G_p, G_p_prime) - pi_all[idx1].append(pi_tmp) - dist_sum += dist_tmp - if dist_sum < dis_min: - dis_min = dist_sum - G = G_p.copy() - idx_min = idx1 - # list of edit operations. - pi_p = pi_all[idx_min] - - # phase 2: iteration. - ds_attrs = get_dataset_attributes(Gn, attr_names=['edge_labeled', 'node_attr_dim'], - edge_label=edge_label) - for itr in range(0, 10): # @todo: the convergence condition? - G_new = G.copy() - # update vertex labels. - # pre-compute h_i0 for each label. -# for label in get_node_labels(Gn, node_label): -# print(label) -# for nd in G.nodes(data=True): -# pass - if not ds_attrs['node_attr_dim']: # labels are symbolic - for nd, _ in G.nodes(data=True): - h_i0_list = [] - label_list = [] - for label in get_node_labels(Gn, node_label): - h_i0 = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p[idx][nd] - if g.has_node(pi_i) and g.nodes[pi_i][node_label] == label: - h_i0 += 1 - h_i0_list.append(h_i0) - label_list.append(label) - # choose one of the best randomly. - idx_max = np.argwhere(h_i0_list == np.max(h_i0_list)).flatten().tolist() - idx_rdm = random.randint(0, len(idx_max) - 1) - G_new.nodes[nd][node_label] = label_list[idx_max[idx_rdm]] - else: # labels are non-symbolic - for nd, _ in G.nodes(data=True): - Si_norm = 0 - phi_i_bar = np.array([0.0 for _ in range(ds_attrs['node_attr_dim'])]) - for idx, g in enumerate(Gn): - pi_i = pi_p[idx][nd] - if g.has_node(pi_i): #@todo: what if no g has node? phi_i_bar = 0? - Si_norm += 1 - phi_i_bar += np.array([float(itm) for itm in g.nodes[pi_i]['attributes']]) - phi_i_bar /= Si_norm - G_new.nodes[nd]['attributes'] = phi_i_bar - - # update edge labels and adjacency matrix. - if ds_attrs['edge_labeled']: - for nd1, nd2, _ in G.edges(data=True): - h_ij0_list = [] - label_list = [] - for label in get_edge_labels(Gn, edge_label): - h_ij0 = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p[idx][nd1] - pi_j = pi_p[idx][nd2] - h_ij0_p = (g.has_node(pi_i) and g.has_node(pi_j) and - g.has_edge(pi_i, pi_j) and - g.edges[pi_i, pi_j][edge_label] == label) - h_ij0 += h_ij0_p - h_ij0_list.append(h_ij0) - label_list.append(label) - # choose one of the best randomly. - idx_max = np.argwhere(h_ij0_list == np.max(h_ij0_list)).flatten().tolist() - h_ij0_max = h_ij0_list[idx_max[0]] - idx_rdm = random.randint(0, len(idx_max) - 1) - best_label = label_list[idx_max[idx_rdm]] - - # check whether a_ij is 0 or 1. - sij_norm = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p[idx][nd1] - pi_j = pi_p[idx][nd2] - if g.has_node(pi_i) and g.has_node(pi_j) and g.has_edge(pi_i, pi_j): - sij_norm += 1 - if h_ij0_max > len(Gn) * c_er / c_es + sij_norm * (1 - (c_er + c_ei) / c_es): - if not G_new.has_edge(nd1, nd2): - G_new.add_edge(nd1, nd2) - G_new.edges[nd1, nd2][edge_label] = best_label - else: - if G_new.has_edge(nd1, nd2): - G_new.remove_edge(nd1, nd2) - else: # if edges are unlabeled - for nd1, nd2, _ in G.edges(data=True): - sij_norm = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p[idx][nd1] - pi_j = pi_p[idx][nd2] - if g.has_node(pi_i) and g.has_node(pi_j) and g.has_edge(pi_i, pi_j): - sij_norm += 1 - if sij_norm > len(Gn) * c_er / (c_er + c_ei): - if not G_new.has_edge(nd1, nd2): - G_new.add_edge(nd1, nd2) - else: - if G_new.has_edge(nd1, nd2): - G_new.remove_edge(nd1, nd2) - - G = G_new.copy() - - # update pi_p - pi_p = [] - for idx1, G_p in enumerate(Gn): - dist_tmp, pi_tmp, _ = GED(G, G_p) - pi_p.append(pi_tmp) - - return G - -# --------------------------- These are tests --------------------------------# - -def test_iam_with_more_graphs_as_init(Gn, G_candidate, c_ei=3, c_er=3, c_es=1, - node_label='atom', edge_label='bond_type'): - """See my name, then you know what I do. - """ -# Gn = Gn[0:10] - Gn = [nx.convert_node_labels_to_integers(g) for g in Gn] - - # phase 1: initilize. - # compute set-median. - dis_min = np.inf -# pi_p = [] - pi_all_forward = [] - pi_all_backward = [] - for idx1, G_p in tqdm(enumerate(G_candidate), desc='computing GEDs', file=sys.stdout): - dist_sum = 0 - pi_all_forward.append([]) - pi_all_backward.append([]) - for idx2, G_p_prime in enumerate(Gn): - dist_tmp, pi_tmp_forward, pi_tmp_backward = GED(G_p, G_p_prime) - pi_all_forward[idx1].append(pi_tmp_forward) - pi_all_backward[idx1].append(pi_tmp_backward) - dist_sum += dist_tmp - if dist_sum <= dis_min: - dis_min = dist_sum - G = G_p.copy() - idx_min = idx1 - # list of edit operations. - pi_p_forward = pi_all_forward[idx_min] - pi_p_backward = pi_all_backward[idx_min] - - # phase 2: iteration. - ds_attrs = get_dataset_attributes(Gn + [G], attr_names=['edge_labeled', 'node_attr_dim'], - edge_label=edge_label) - label_set = get_node_labels(Gn + [G], node_label) - for itr in range(0, 10): # @todo: the convergence condition? - G_new = G.copy() - # update vertex labels. - # pre-compute h_i0 for each label. -# for label in get_node_labels(Gn, node_label): -# print(label) -# for nd in G.nodes(data=True): -# pass - if not ds_attrs['node_attr_dim']: # labels are symbolic - for nd in G.nodes(): - h_i0_list = [] - label_list = [] - for label in label_set: - h_i0 = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p_forward[idx][nd] - if g.has_node(pi_i) and g.nodes[pi_i][node_label] == label: - h_i0 += 1 - h_i0_list.append(h_i0) - label_list.append(label) - # choose one of the best randomly. - idx_max = np.argwhere(h_i0_list == np.max(h_i0_list)).flatten().tolist() - idx_rdm = random.randint(0, len(idx_max) - 1) - G_new.nodes[nd][node_label] = label_list[idx_max[idx_rdm]] - else: # labels are non-symbolic - for nd in G.nodes(): - Si_norm = 0 - phi_i_bar = np.array([0.0 for _ in range(ds_attrs['node_attr_dim'])]) - for idx, g in enumerate(Gn): - pi_i = pi_p_forward[idx][nd] - if g.has_node(pi_i): #@todo: what if no g has node? phi_i_bar = 0? - Si_norm += 1 - phi_i_bar += np.array([float(itm) for itm in g.nodes[pi_i]['attributes']]) - phi_i_bar /= Si_norm - G_new.nodes[nd]['attributes'] = phi_i_bar - - # update edge labels and adjacency matrix. - if ds_attrs['edge_labeled']: - for nd1, nd2, _ in G.edges(data=True): - h_ij0_list = [] - label_list = [] - for label in get_edge_labels(Gn, edge_label): - h_ij0 = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p_forward[idx][nd1] - pi_j = pi_p_forward[idx][nd2] - h_ij0_p = (g.has_node(pi_i) and g.has_node(pi_j) and - g.has_edge(pi_i, pi_j) and - g.edges[pi_i, pi_j][edge_label] == label) - h_ij0 += h_ij0_p - h_ij0_list.append(h_ij0) - label_list.append(label) - # choose one of the best randomly. - idx_max = np.argwhere(h_ij0_list == np.max(h_ij0_list)).flatten().tolist() - h_ij0_max = h_ij0_list[idx_max[0]] - idx_rdm = random.randint(0, len(idx_max) - 1) - best_label = label_list[idx_max[idx_rdm]] - - # check whether a_ij is 0 or 1. - sij_norm = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p_forward[idx][nd1] - pi_j = pi_p_forward[idx][nd2] - if g.has_node(pi_i) and g.has_node(pi_j) and g.has_edge(pi_i, pi_j): - sij_norm += 1 - if h_ij0_max > len(Gn) * c_er / c_es + sij_norm * (1 - (c_er + c_ei) / c_es): - if not G_new.has_edge(nd1, nd2): - G_new.add_edge(nd1, nd2) - G_new.edges[nd1, nd2][edge_label] = best_label - else: - if G_new.has_edge(nd1, nd2): - G_new.remove_edge(nd1, nd2) - else: # if edges are unlabeled - # @todo: works only for undirected graphs. - for nd1 in range(nx.number_of_nodes(G)): - for nd2 in range(nd1 + 1, nx.number_of_nodes(G)): - sij_norm = 0 - for idx, g in enumerate(Gn): - pi_i = pi_p_forward[idx][nd1] - pi_j = pi_p_forward[idx][nd2] - if g.has_node(pi_i) and g.has_node(pi_j) and g.has_edge(pi_i, pi_j): - sij_norm += 1 - if sij_norm > len(Gn) * c_er / (c_er + c_ei): - if not G_new.has_edge(nd1, nd2): - G_new.add_edge(nd1, nd2) - elif sij_norm < len(Gn) * c_er / (c_er + c_ei): - if G_new.has_edge(nd1, nd2): - G_new.remove_edge(nd1, nd2) - # do not change anything when equal. - - G = G_new.copy() - - # update pi_p - pi_p_forward = [] - for G_p in Gn: - dist_tmp, pi_tmp_forward, pi_tmp_backward = GED(G, G_p) - pi_p_forward.append(pi_tmp_forward) - - return G - - -############################################################################### - -if __name__ == '__main__': - from gklearn.utils.graphfiles import loadDataset - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat', - 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}} # node/edge symb -# ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', -# 'extra_params': {}} # node nsymb -# ds = {'name': 'Acyclic', 'dataset': '../datasets/monoterpenoides/trainset_9.ds', -# 'extra_params': {}} - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - - iam(Gn) \ No newline at end of file diff --git a/gklearn/preimage/knn.py b/gklearn/preimage/knn.py deleted file mode 100644 index c179287..0000000 --- a/gklearn/preimage/knn.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Jan 10 13:22:04 2020 - -@author: ljia -""" -import numpy as np -#import matplotlib.pyplot as plt -from tqdm import tqdm -import random -#import csv -from shutil import copyfile -import os - -from gklearn.preimage.iam import iam_bash -from gklearn.utils.graphfiles import loadDataset, loadGXL -from gklearn.preimage.ged import GED -from gklearn.preimage.utils import get_same_item_indices - -def test_knn(): - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] -# gkernel = 'treeletkernel' -# node_label = 'atom' -# edge_label = 'bond_type' -# ds_name = 'mono' - dir_output = 'results/knn/' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '../../datasets/monoterpenoides/' - - k_nn = 1 - percent = 0.1 - repeats = 50 - edit_cost_constant = [3, 3, 1, 3, 3, 1] - - # get indices by classes. - y_idx = get_same_item_indices(y_all) - sod_sm_list_list - for repeat in range(0, repeats): - print('\n---------------------------------') - print('repeat =', repeat) - accuracy_sm_list = [] - accuracy_gm_list = [] - sod_sm_list = [] - sod_gm_list = [] - - random.seed(repeat) - set_median_list = [] - gen_median_list = [] - train_y_set = [] - for y, values in y_idx.items(): - print('\ny =', y) - size_median_set = int(len(values) * percent) - median_set_idx = random.sample(values, size_median_set) - print('median set: ', median_set_idx) - - # compute set median and gen median using IAM (C++ through bash). - # Gn_median = [Gn[idx] for idx in median_set_idx] - group_fnames = [Gn[g].graph['filename'] for g in median_set_idx] - sod_sm, sod_gm, fname_sm, fname_gm = iam_bash(group_fnames, edit_cost_constant, - graph_dir=graph_dir) - print('sod_sm, sod_gm:', sod_sm, sod_gm) - sod_sm_list.append(sod_sm) - sod_gm_list.append(sod_gm) - fname_sm_new = dir_output + 'medians/set_median.y' + str(int(y)) + '.repeat' + str(repeat) + '.gxl' - copyfile(fname_sm, fname_sm_new) - fname_gm_new = dir_output + 'medians/gen_median.y' + str(int(y)) + '.repeat' + str(repeat) + '.gxl' - copyfile(fname_gm, fname_gm_new) - set_median_list.append(loadGXL(fname_sm_new)) - gen_median_list.append(loadGXL(fname_gm_new)) - train_y_set.append(int(y)) - - print(sod_sm, sod_gm) - - # do 1-nn. - test_y_set = [int(y) for y in y_all] - accuracy_sm = knn(set_median_list, train_y_set, Gn, test_y_set, k=k_nn, distance='ged') - accuracy_gm = knn(set_median_list, train_y_set, Gn, test_y_set, k=k_nn, distance='ged') - accuracy_sm_list.append(accuracy_sm) - accuracy_gm_list.append(accuracy_gm) - print('current accuracy sm and gm:', accuracy_sm, accuracy_gm) - - # output - accuracy_sm_mean = np.mean(accuracy_sm_list) - accuracy_gm_mean = np.mean(accuracy_gm_list) - print('\ntotal average accuracy sm and gm:', accuracy_sm_mean, accuracy_gm_mean) - - -def knn(train_set, train_y_set, test_set, test_y_set, k=1, distance='ged'): - if k == 1 and distance == 'ged': - algo_options = '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1' - params_ged = {'lib': 'gedlibpy', 'cost': 'CONSTANT', 'method': 'IPFP', - 'algo_options': algo_options, 'stabilizer': None} - accuracy = 0 - for idx_test, g_test in tqdm(enumerate(test_set), desc='computing 1-nn', - file=sys.stdout): - dis = np.inf - for idx_train, g_train in enumerate(train_set): - dis_cur, _, _ = GED(g_test, g_train, **params_ged) - if dis_cur < dis: - dis = dis_cur - test_y_cur = train_y_set[idx_train] - if test_y_cur == test_y_set[idx_test]: - accuracy += 1 - accuracy = accuracy / len(test_set) - - return accuracy - - - -if __name__ == '__main__': - test_knn() \ No newline at end of file diff --git a/gklearn/preimage/libs.py b/gklearn/preimage/libs.py deleted file mode 100644 index 76005c6..0000000 --- a/gklearn/preimage/libs.py +++ /dev/null @@ -1,6 +0,0 @@ -import sys -import pathlib - -# insert gedlibpy library. -sys.path.insert(0, "../../../") -from gedlibpy import librariesImport, gedlibpy diff --git a/gklearn/preimage/median.py b/gklearn/preimage/median.py deleted file mode 100644 index 1c5bb0f..0000000 --- a/gklearn/preimage/median.py +++ /dev/null @@ -1,218 +0,0 @@ -import sys -sys.path.insert(0, "../") -#import pathlib -import numpy as np -import networkx as nx -import time - -from gedlibpy import librariesImport, gedlibpy -#import script -sys.path.insert(0, "/home/bgauzere/dev/optim-graphes/") -import gklearn -from gklearn.utils.graphfiles import loadDataset - -def replace_graph_in_env(script, graph, old_id, label='median'): - """ - Replace a graph in script - - If old_id is -1, add a new graph to the environnemt - - """ - if(old_id > -1): - script.PyClearGraph(old_id) - new_id = script.PyAddGraph(label) - for i in graph.nodes(): - script.PyAddNode(new_id,str(i),graph.node[i]) # !! strings are required bt gedlib - for e in graph.edges: - script.PyAddEdge(new_id, str(e[0]),str(e[1]), {}) - script.PyInitEnv() - script.PySetMethod("IPFP", "") - script.PyInitMethod() - - return new_id - -#Dessin median courrant -def draw_Letter_graph(graph, savepath=''): - import numpy as np - import networkx as nx - import matplotlib.pyplot as plt - plt.figure() - pos = {} - for n in graph.nodes: - pos[n] = np.array([float(graph.node[n]['attributes'][0]), - float(graph.node[n]['attributes'][1])]) - nx.draw_networkx(graph, pos) - if savepath != '': - plt.savefig(savepath + str(time.time()) + '.eps', format='eps', dpi=300) - plt.show() - plt.clf() - -#compute new mappings -def update_mappings(script,median_id,listID): - med_distances = {} - med_mappings = {} - sod = 0 - for i in range(0,len(listID)): - script.PyRunMethod(median_id,listID[i]) - med_distances[i] = script.PyGetUpperBound(median_id,listID[i]) - med_mappings[i] = script.PyGetForwardMap(median_id,listID[i]) - sod += med_distances[i] - return med_distances, med_mappings, sod - -def calcul_Sij(all_mappings, all_graphs,i,j): - s_ij = 0 - for k in range(0,len(all_mappings)): - cur_graph = all_graphs[k] - cur_mapping = all_mappings[k] - size_graph = cur_graph.order() - if ((cur_mapping[i] < size_graph) and - (cur_mapping[j] < size_graph) and - (cur_graph.has_edge(cur_mapping[i], cur_mapping[j]) == True)): - s_ij += 1 - - return s_ij - -# def update_median_nodes_L1(median,listIdSet,median_id,dataset, mappings): -# from scipy.stats.mstats import gmean - -# for i in median.nodes(): -# for k in listIdSet: -# vectors = [] #np.zeros((len(listIdSet),2)) -# if(k != median_id): -# phi_i = mappings[k][i] -# if(phi_i < dataset[k].order()): -# vectors.append([float(dataset[k].node[phi_i]['x']),float(dataset[k].node[phi_i]['y'])]) - -# new_labels = gmean(vectors) -# median.node[i]['x'] = str(new_labels[0]) -# median.node[i]['y'] = str(new_labels[1]) -# return median - -def update_median_nodes(median,dataset,mappings): - #update node attributes - for i in median.nodes(): - nb_sub=0 - mean_label = {'x' : 0, 'y' : 0} - for k in range(0,len(mappings)): - phi_i = mappings[k][i] - if ( phi_i < dataset[k].order() ): - nb_sub += 1 - mean_label['x'] += 0.75*float(dataset[k].node[phi_i]['x']) - mean_label['y'] += 0.75*float(dataset[k].node[phi_i]['y']) - median.node[i]['x'] = str((1/0.75)*(mean_label['x']/nb_sub)) - median.node[i]['y'] = str((1/0.75)*(mean_label['y']/nb_sub)) - return median - -def update_median_edges(dataset, mappings, median, cei=0.425,cer=0.425): -#for letter high, ceir = 1.7, alpha = 0.75 - size_dataset = len(dataset) - ratio_cei_cer = cer/(cei + cer) - threshold = size_dataset*ratio_cei_cer - order_graph_median = median.order() - for i in range(0,order_graph_median): - for j in range(i+1,order_graph_median): - s_ij = calcul_Sij(mappings,dataset,i,j) - if(s_ij > threshold): - median.add_edge(i,j) - else: - if(median.has_edge(i,j)): - median.remove_edge(i,j) - return median - - - -def compute_median(script, listID, dataset,verbose=False): - """Compute a graph median of a dataset according to an environment - - Parameters - - script : An gedlib initialized environnement - listID (list): a list of ID in script: encodes the dataset - dataset (list): corresponding graphs in networkX format. We assume that graph - listID[i] corresponds to dataset[i] - - Returns: - A networkX graph, which is the median, with corresponding sod - """ - print(len(listID)) - median_set_index, median_set_sod = compute_median_set(script, listID) - print(median_set_index) - print(median_set_sod) - sods = [] - #Ajout median dans environnement - set_median = dataset[median_set_index].copy() - median = dataset[median_set_index].copy() - cur_med_id = replace_graph_in_env(script,median,-1) - med_distances, med_mappings, cur_sod = update_mappings(script,cur_med_id,listID) - sods.append(cur_sod) - if(verbose): - print(cur_sod) - ite_max = 50 - old_sod = cur_sod * 2 - ite = 0 - epsilon = 0.001 - - best_median - while((ite < ite_max) and (np.abs(old_sod - cur_sod) > epsilon )): - median = update_median_nodes(median,dataset, med_mappings) - median = update_median_edges(dataset,med_mappings,median) - - cur_med_id = replace_graph_in_env(script,median,cur_med_id) - med_distances, med_mappings, cur_sod = update_mappings(script,cur_med_id,listID) - - - sods.append(cur_sod) - if(verbose): - print(cur_sod) - ite += 1 - return median, cur_sod, sods, set_median - - draw_Letter_graph(median) - - -def compute_median_set(script,listID): - 'Returns the id in listID corresponding to median set' - #Calcul median set - N=len(listID) - map_id_to_index = {} - map_index_to_id = {} - for i in range(0,len(listID)): - map_id_to_index[listID[i]] = i - map_index_to_id[i] = listID[i] - - distances = np.zeros((N,N)) - for i in listID: - for j in listID: - script.PyRunMethod(i,j) - distances[map_id_to_index[i],map_id_to_index[j]] = script.PyGetUpperBound(i,j) - - median_set_index = np.argmin(np.sum(distances,0)) - sod = np.min(np.sum(distances,0)) - - return median_set_index, sod - -if __name__ == "__main__": - #Chargement du dataset - script.PyLoadGXLGraph('/home/bgauzere/dev/gedlib/data/datasets/Letter/HIGH/', '/home/bgauzere/dev/gedlib/data/collections/Letter_Z.xml') - script.PySetEditCost("LETTER") - script.PyInitEnv() - script.PySetMethod("IPFP", "") - script.PyInitMethod() - - dataset,my_y = gklearn.utils.graphfiles.loadDataset("/home/bgauzere/dev/gedlib/data/datasets/Letter/HIGH/Letter_Z.cxl") - - listID = script.PyGetAllGraphIds() - median, sod = compute_median(script,listID,dataset,verbose=True) - - print(sod) - draw_Letter_graph(median) - - -#if __name__ == '__main__': -# # test draw_Letter_graph -# ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', -# 'extra_params': {}} # node nsymb -# Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# print(y_all) -# for g in Gn: -# draw_Letter_graph(g) \ No newline at end of file diff --git a/gklearn/preimage/median_benoit.py b/gklearn/preimage/median_benoit.py deleted file mode 100644 index 6712196..0000000 --- a/gklearn/preimage/median_benoit.py +++ /dev/null @@ -1,201 +0,0 @@ -import sys -import pathlib -import numpy as np -import networkx as nx - -import librariesImport -import script -sys.path.insert(0, "/home/bgauzere/dev/optim-graphes/") -import gklearn - -def replace_graph_in_env(script, graph, old_id, label='median'): - """ - Replace a graph in script - - If old_id is -1, add a new graph to the environnemt - - """ - if(old_id > -1): - script.PyClearGraph(old_id) - new_id = script.PyAddGraph(label) - for i in graph.nodes(): - script.PyAddNode(new_id,str(i),graph.node[i]) # !! strings are required bt gedlib - for e in graph.edges: - script.PyAddEdge(new_id, str(e[0]),str(e[1]), {}) - script.PyInitEnv() - script.PySetMethod("IPFP", "") - script.PyInitMethod() - - return new_id - -#Dessin median courrant -def draw_Letter_graph(graph): - import numpy as np - import networkx as nx - import matplotlib.pyplot as plt - plt.figure() - pos = {} - for n in graph.nodes: - pos[n] = np.array([float(graph.node[n]['x']),float(graph.node[n]['y'])]) - nx.draw_networkx(graph,pos) - plt.show() - -#compute new mappings -def update_mappings(script,median_id,listID): - med_distances = {} - med_mappings = {} - sod = 0 - for i in range(0,len(listID)): - script.PyRunMethod(median_id,listID[i]) - med_distances[i] = script.PyGetUpperBound(median_id,listID[i]) - med_mappings[i] = script.PyGetForwardMap(median_id,listID[i]) - sod += med_distances[i] - return med_distances, med_mappings, sod - -def calcul_Sij(all_mappings, all_graphs,i,j): - s_ij = 0 - for k in range(0,len(all_mappings)): - cur_graph = all_graphs[k] - cur_mapping = all_mappings[k] - size_graph = cur_graph.order() - if ((cur_mapping[i] < size_graph) and - (cur_mapping[j] < size_graph) and - (cur_graph.has_edge(cur_mapping[i], cur_mapping[j]) == True)): - s_ij += 1 - - return s_ij - -# def update_median_nodes_L1(median,listIdSet,median_id,dataset, mappings): -# from scipy.stats.mstats import gmean - -# for i in median.nodes(): -# for k in listIdSet: -# vectors = [] #np.zeros((len(listIdSet),2)) -# if(k != median_id): -# phi_i = mappings[k][i] -# if(phi_i < dataset[k].order()): -# vectors.append([float(dataset[k].node[phi_i]['x']),float(dataset[k].node[phi_i]['y'])]) - -# new_labels = gmean(vectors) -# median.node[i]['x'] = str(new_labels[0]) -# median.node[i]['y'] = str(new_labels[1]) -# return median - -def update_median_nodes(median,dataset,mappings): - #update node attributes - for i in median.nodes(): - nb_sub=0 - mean_label = {'x' : 0, 'y' : 0} - for k in range(0,len(mappings)): - phi_i = mappings[k][i] - if ( phi_i < dataset[k].order() ): - nb_sub += 1 - mean_label['x'] += 0.75*float(dataset[k].node[phi_i]['x']) - mean_label['y'] += 0.75*float(dataset[k].node[phi_i]['y']) - median.node[i]['x'] = str((1/0.75)*(mean_label['x']/nb_sub)) - median.node[i]['y'] = str((1/0.75)*(mean_label['y']/nb_sub)) - return median - -def update_median_edges(dataset, mappings, median, cei=0.425,cer=0.425): -#for letter high, ceir = 1.7, alpha = 0.75 - size_dataset = len(dataset) - ratio_cei_cer = cer/(cei + cer) - threshold = size_dataset*ratio_cei_cer - order_graph_median = median.order() - for i in range(0,order_graph_median): - for j in range(i+1,order_graph_median): - s_ij = calcul_Sij(mappings,dataset,i,j) - if(s_ij > threshold): - median.add_edge(i,j) - else: - if(median.has_edge(i,j)): - median.remove_edge(i,j) - return median - - - -def compute_median(script, listID, dataset,verbose=False): - """Compute a graph median of a dataset according to an environment - - Parameters - - script : An gedlib initialized environnement - listID (list): a list of ID in script: encodes the dataset - dataset (list): corresponding graphs in networkX format. We assume that graph - listID[i] corresponds to dataset[i] - - Returns: - A networkX graph, which is the median, with corresponding sod - """ - print(len(listID)) - median_set_index, median_set_sod = compute_median_set(script, listID) - print(median_set_index) - print(median_set_sod) - sods = [] - #Ajout median dans environnement - set_median = dataset[median_set_index].copy() - median = dataset[median_set_index].copy() - cur_med_id = replace_graph_in_env(script,median,-1) - med_distances, med_mappings, cur_sod = update_mappings(script,cur_med_id,listID) - sods.append(cur_sod) - if(verbose): - print(cur_sod) - ite_max = 50 - old_sod = cur_sod * 2 - ite = 0 - epsilon = 0.001 - - best_median - while((ite < ite_max) and (np.abs(old_sod - cur_sod) > epsilon )): - median = update_median_nodes(median,dataset, med_mappings) - median = update_median_edges(dataset,med_mappings,median) - - cur_med_id = replace_graph_in_env(script,median,cur_med_id) - med_distances, med_mappings, cur_sod = update_mappings(script,cur_med_id,listID) - - - sods.append(cur_sod) - if(verbose): - print(cur_sod) - ite += 1 - return median, cur_sod, sods, set_median - - draw_Letter_graph(median) - - -def compute_median_set(script,listID): - 'Returns the id in listID corresponding to median set' - #Calcul median set - N=len(listID) - map_id_to_index = {} - map_index_to_id = {} - for i in range(0,len(listID)): - map_id_to_index[listID[i]] = i - map_index_to_id[i] = listID[i] - - distances = np.zeros((N,N)) - for i in listID: - for j in listID: - script.PyRunMethod(i,j) - distances[map_id_to_index[i],map_id_to_index[j]] = script.PyGetUpperBound(i,j) - - median_set_index = np.argmin(np.sum(distances,0)) - sod = np.min(np.sum(distances,0)) - - return median_set_index, sod - -if __name__ == "__main__": - #Chargement du dataset - script.PyLoadGXLGraph('/home/bgauzere/dev/gedlib/data/datasets/Letter/HIGH/', '/home/bgauzere/dev/gedlib/data/collections/Letter_Z.xml') - script.PySetEditCost("LETTER") - script.PyInitEnv() - script.PySetMethod("IPFP", "") - script.PyInitMethod() - - dataset,my_y = gklearn.utils.graphfiles.loadDataset("/home/bgauzere/dev/gedlib/data/datasets/Letter/HIGH/Letter_Z.cxl") - - listID = script.PyGetAllGraphIds() - median, sod = compute_median(script,listID,dataset,verbose=True) - - print(sod) - draw_Letter_graph(median) diff --git a/gklearn/preimage/median_linlin.py b/gklearn/preimage/median_linlin.py deleted file mode 100644 index 6139558..0000000 --- a/gklearn/preimage/median_linlin.py +++ /dev/null @@ -1,215 +0,0 @@ -import sys -import pathlib -import numpy as np -import networkx as nx - -from gedlibpy import librariesImport, gedlibpy -sys.path.insert(0, "/home/bgauzere/dev/optim-graphes/") -import gklearn - -def replace_graph_in_env(script, graph, old_id, label='median'): - """ - Replace a graph in script - - If old_id is -1, add a new graph to the environnemt - - """ - if(old_id > -1): - script.PyClearGraph(old_id) - new_id = script.PyAddGraph(label) - for i in graph.nodes(): - script.PyAddNode(new_id,str(i),graph.node[i]) # !! strings are required bt gedlib - for e in graph.edges: - script.PyAddEdge(new_id, str(e[0]),str(e[1]), {}) - script.PyInitEnv() - script.PySetMethod("IPFP", "") - script.PyInitMethod() - - return new_id - -#Dessin median courrant -def draw_Letter_graph(graph): - import numpy as np - import networkx as nx - import matplotlib.pyplot as plt - plt.figure() - pos = {} - for n in graph.nodes: - pos[n] = np.array([float(graph.node[n]['x']),float(graph.node[n]['y'])]) - nx.draw_networkx(graph,pos) - plt.show() - -#compute new mappings -def update_mappings(script,median_id,listID): - med_distances = {} - med_mappings = {} - sod = 0 - for i in range(0,len(listID)): - script.PyRunMethod(median_id,listID[i]) - med_distances[i] = script.PyGetUpperBound(median_id,listID[i]) - med_mappings[i] = script.PyGetForwardMap(median_id,listID[i]) - sod += med_distances[i] - return med_distances, med_mappings, sod - -def calcul_Sij(all_mappings, all_graphs,i,j): - s_ij = 0 - for k in range(0,len(all_mappings)): - cur_graph = all_graphs[k] - cur_mapping = all_mappings[k] - size_graph = cur_graph.order() - if ((cur_mapping[i] < size_graph) and - (cur_mapping[j] < size_graph) and - (cur_graph.has_edge(cur_mapping[i], cur_mapping[j]) == True)): - s_ij += 1 - - return s_ij - -# def update_median_nodes_L1(median,listIdSet,median_id,dataset, mappings): -# from scipy.stats.mstats import gmean - -# for i in median.nodes(): -# for k in listIdSet: -# vectors = [] #np.zeros((len(listIdSet),2)) -# if(k != median_id): -# phi_i = mappings[k][i] -# if(phi_i < dataset[k].order()): -# vectors.append([float(dataset[k].node[phi_i]['x']),float(dataset[k].node[phi_i]['y'])]) - -# new_labels = gmean(vectors) -# median.node[i]['x'] = str(new_labels[0]) -# median.node[i]['y'] = str(new_labels[1]) -# return median - -def update_median_nodes(median,dataset,mappings): - #update node attributes - for i in median.nodes(): - nb_sub=0 - mean_label = {'x' : 0, 'y' : 0} - for k in range(0,len(mappings)): - phi_i = mappings[k][i] - if ( phi_i < dataset[k].order() ): - nb_sub += 1 - mean_label['x'] += 0.75*float(dataset[k].node[phi_i]['x']) - mean_label['y'] += 0.75*float(dataset[k].node[phi_i]['y']) - median.node[i]['x'] = str((1/0.75)*(mean_label['x']/nb_sub)) - median.node[i]['y'] = str((1/0.75)*(mean_label['y']/nb_sub)) - return median - -def update_median_edges(dataset, mappings, median, cei=0.425,cer=0.425): -#for letter high, ceir = 1.7, alpha = 0.75 - size_dataset = len(dataset) - ratio_cei_cer = cer/(cei + cer) - threshold = size_dataset*ratio_cei_cer - order_graph_median = median.order() - for i in range(0,order_graph_median): - for j in range(i+1,order_graph_median): - s_ij = calcul_Sij(mappings,dataset,i,j) - if(s_ij > threshold): - median.add_edge(i,j) - else: - if(median.has_edge(i,j)): - median.remove_edge(i,j) - return median - - - -def compute_median(script, listID, dataset,verbose=False): - """Compute a graph median of a dataset according to an environment - - Parameters - - script : An gedlib initialized environnement - listID (list): a list of ID in script: encodes the dataset - dataset (list): corresponding graphs in networkX format. We assume that graph - listID[i] corresponds to dataset[i] - - Returns: - A networkX graph, which is the median, with corresponding sod - """ - print(len(listID)) - median_set_index, median_set_sod = compute_median_set(script, listID) - print(median_set_index) - print(median_set_sod) - sods = [] - #Ajout median dans environnement - set_median = dataset[median_set_index].copy() - median = dataset[median_set_index].copy() - cur_med_id = replace_graph_in_env(script,median,-1) - med_distances, med_mappings, cur_sod = update_mappings(script,cur_med_id,listID) - sods.append(cur_sod) - if(verbose): - print(cur_sod) - ite_max = 50 - old_sod = cur_sod * 2 - ite = 0 - epsilon = 0.001 - - best_median - while((ite < ite_max) and (np.abs(old_sod - cur_sod) > epsilon )): - median = update_median_nodes(median,dataset, med_mappings) - median = update_median_edges(dataset,med_mappings,median) - - cur_med_id = replace_graph_in_env(script,median,cur_med_id) - med_distances, med_mappings, cur_sod = update_mappings(script,cur_med_id,listID) - - - sods.append(cur_sod) - if(verbose): - print(cur_sod) - ite += 1 - return median, cur_sod, sods, set_median - - draw_Letter_graph(median) - - -def compute_median_set(script,listID): - 'Returns the id in listID corresponding to median set' - #Calcul median set - N=len(listID) - map_id_to_index = {} - map_index_to_id = {} - for i in range(0,len(listID)): - map_id_to_index[listID[i]] = i - map_index_to_id[i] = listID[i] - - distances = np.zeros((N,N)) - for i in listID: - for j in listID: - script.PyRunMethod(i,j) - distances[map_id_to_index[i],map_id_to_index[j]] = script.PyGetUpperBound(i,j) - - median_set_index = np.argmin(np.sum(distances,0)) - sod = np.min(np.sum(distances,0)) - - return median_set_index, sod - -def _convertGraph(G): - """Convert a graph to the proper NetworkX format that can be - recognized by library gedlibpy. - """ - G_new = nx.Graph() - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd), chem=attrs['atom']) -# G_new.add_node(str(nd), x=str(attrs['attributes'][0]), -# y=str(attrs['attributes'][1])) - for nd1, nd2, attrs in G.edges(data=True): - G_new.add_edge(str(nd1), str(nd2), valence=attrs['bond_type']) -# G_new.add_edge(str(nd1), str(nd2)) - - return G_new - -if __name__ == "__main__": - #Chargement du dataset - gedlibpy.PyLoadGXLGraph('/home/bgauzere/dev/gedlib/data/datasets/Letter/HIGH/', '/home/bgauzere/dev/gedlib/data/collections/Letter_Z.xml') - gedlibpy.PySetEditCost("LETTER") - gedlibpy.PyInitEnv() - gedlibpy.PySetMethod("IPFP", "") - gedlibpy.PyInitMethod() - - dataset,my_y = gklearn.utils.graphfiles.loadDataset("/home/bgauzere/dev/gedlib/data/datasets/Letter/HIGH/Letter_Z.cxl") - - listID = gedlibpy.PyGetAllGraphIds() - median, sod = compute_median(gedlibpy,listID,dataset,verbose=True) - - print(sod) - draw_Letter_graph(median) diff --git a/gklearn/preimage/pathfrequency.py b/gklearn/preimage/pathfrequency.py deleted file mode 100644 index 3bca1bc..0000000 --- a/gklearn/preimage/pathfrequency.py +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Wed Mar 20 10:12:15 2019 - -inferring a graph grom path frequency. -@author: ljia -""" -#import numpy as np -import networkx as nx -from scipy.spatial.distance import hamming -import itertools - -def SISF(K, v): - if output: - return output - else: - return 'no solution' - - -def SISF_M(K, v): - return output - - -def GIPF_tree(v_obj, K=1, alphabet=[0, 1]): - if K == 1: - n_graph = v_obj[0] + v_obj[1] - D_T, father_idx = getDynamicTable(n_graph, alphabet) - - # get the vector the closest to v_obj. - if v_obj not in D_T: - print('no exact solution') - dis_lim = 1 / len(v_obj) # the possible shortest distance. - dis_min = 1.0 # minimum proportional distance - v_min = v_obj - for vc in D_T: - if vc[0] + vc[1] == n_graph: -# print(vc) - dis = hamming(vc, v_obj) - if dis < dis_min: - dis_min = dis - v_min = vc - if dis_min <= dis_lim: - break - v_obj = v_min - - # obtain required graph by traceback procedure. - return getObjectGraph(v_obj, D_T, father_idx, alphabet), v_obj - -def GIPF_M(K, v): - return G - - -def getDynamicTable(n_graph, alphabet=[0, 1]): - # init. When only one node exists. - D_T = {(1, 0, 0, 0, 0, 0): 1, (0, 1, 0, 0, 0, 0): 1, (0, 0, 1, 0, 0, 0): 0, - (0, 0, 0, 1, 0, 0): 0, (0, 0, 0, 0, 1, 0): 0, (0, 0, 0, 0, 0, 1): 0,} - D_T = [(1, 0, 0, 0, 0, 0), (0, 1, 0, 0, 0, 0)] - father_idx = [-1, -1] # index of each vector's father - # add possible vectors. - for idx, v in enumerate(D_T): - if v[0] + v[1] < n_graph: - D_T.append((v[0] + 1, v[1], v[2] + 2, v[3], v[4], v[5])) - D_T.append((v[0] + 1, v[1], v[2], v[3] + 1, v[4] + 1, v[5])) - D_T.append((v[0], v[1] + 1, v[2], v[3] + 1, v[4] + 1, v[5])) - D_T.append((v[0], v[1] + 1, v[2], v[3], v[4], v[5] + 2)) - father_idx += [idx, idx, idx, idx] - -# D_T = itertools.chain([(1, 0, 0, 0, 0, 0)], [(0, 1, 0, 0, 0, 0)]) -# father_idx = itertools.chain([-1], [-1]) # index of each vector's father -# # add possible vectors. -# for idx, v in enumerate(D_T): -# if v[0] + v[1] < n_graph: -# D_T = itertools.chain(D_T, [(v[0] + 1, v[1], v[2] + 2, v[3], v[4], v[5])]) -# D_T = itertools.chain(D_T, [(v[0] + 1, v[1], v[2], v[3] + 1, v[4] + 1, v[5])]) -# D_T = itertools.chain(D_T, [(v[0], v[1] + 1, v[2], v[3] + 1, v[4] + 1, v[5])]) -# D_T = itertools.chain(D_T, [(v[0], v[1] + 1, v[2], v[3], v[4], v[5] + 2)]) -# father_idx = itertools.chain(father_idx, [idx, idx, idx, idx]) - return D_T, father_idx - - -def getObjectGraph(v_obj, D_T, father_idx, alphabet=[0, 1]): - g_obj = nx.Graph() - - # do vector traceback. - v_tb = [list(v_obj)] # traceback vectors. - v_tb_idx = [D_T.index(v_obj)] # indices of traceback vectors. - while v_tb_idx[-1] > 1: - idx_pre = father_idx[v_tb_idx[-1]] - v_tb_idx.append(idx_pre) - v_tb.append(list(D_T[idx_pre])) - v_tb = v_tb[::-1] # reverse -# v_tb_idx = v_tb_idx[::-1] - - # construct tree. - v_c = v_tb[0] # current vector. - if v_c[0] == 1: - g_obj.add_node(0, node_label=alphabet[0]) - else: - g_obj.add_node(0, node_label=alphabet[1]) - for vct in v_tb[1:]: - if vct[0] - v_c[0] == 1: - if vct[2] - v_c[2] == 2: # transfer 1 - label1 = alphabet[0] - label2 = alphabet[0] - else: # transfer 2 - label1 = alphabet[1] - label2 = alphabet[0] - else: - if vct[3] - v_c[3] == 1: # transfer 3 - label1 = alphabet[0] - label2 = alphabet[1] - else: # transfer 4 - label1 = alphabet[1] - label2 = alphabet[1] - for nd, attr in g_obj.nodes(data=True): - if attr['node_label'] == label1: - nb_node = nx.number_of_nodes(g_obj) - g_obj.add_node(nb_node, node_label=label2) - g_obj.add_edge(nd, nb_node) - break - v_c = vct - return g_obj - - -import random -def hierarchy_pos(G, root=None, width=1., vert_gap = 0.2, vert_loc = 0, xcenter = 0.5): - - ''' - From Joel's answer at https://stackoverflow.com/a/29597209/2966723. - Licensed under Creative Commons Attribution-Share Alike - - If the graph is a tree this will return the positions to plot this in a - hierarchical layout. - - G: the graph (must be a tree) - - root: the root node of current branch - - if the tree is directed and this is not given, - the root will be found and used - - if the tree is directed and this is given, then - the positions will be just for the descendants of this node. - - if the tree is undirected and not given, - then a random choice will be used. - - width: horizontal space allocated for this branch - avoids overlap with other branches - - vert_gap: gap between levels of hierarchy - - vert_loc: vertical location of root - - xcenter: horizontal location of root - ''' - if not nx.is_tree(G): - raise TypeError('cannot use hierarchy_pos on a graph that is not a tree') - - if root is None: - if isinstance(G, nx.DiGraph): - root = next(iter(nx.topological_sort(G))) #allows back compatibility with nx version 1.11 - else: - root = random.choice(list(G.nodes)) - - def _hierarchy_pos(G, root, width=1., vert_gap = 0.2, vert_loc = 0, xcenter = 0.5, pos = None, parent = None): - ''' - see hierarchy_pos docstring for most arguments - - pos: a dict saying where all nodes go if they have been assigned - parent: parent of this branch. - only affects it if non-directed - - ''' - - if pos is None: - pos = {root:(xcenter,vert_loc)} - else: - pos[root] = (xcenter, vert_loc) - children = list(G.neighbors(root)) - if not isinstance(G, nx.DiGraph) and parent is not None: - children.remove(parent) - if len(children)!=0: - dx = width/len(children) - nextx = xcenter - width/2 - dx/2 - for child in children: - nextx += dx - pos = _hierarchy_pos(G,child, width = dx, vert_gap = vert_gap, - vert_loc = vert_loc-vert_gap, xcenter=nextx, - pos=pos, parent = root) - return pos - - - return _hierarchy_pos(G, root, width, vert_gap, vert_loc, xcenter) - - -if __name__ == '__main__': - v_obj = (6, 4, 10, 3, 3, 2) -# v_obj = (6, 5, 10, 3, 3, 2) - tree_obj, v_obj = GIPF_tree(v_obj) - print('One closest vector is', v_obj) - # plot - pos = hierarchy_pos(tree_obj, 0) - node_labels = nx.get_node_attributes(tree_obj, 'node_label') - nx.draw(tree_obj, pos=pos, labels=node_labels, with_labels=True) \ No newline at end of file diff --git a/gklearn/preimage/preimage_iam.py b/gklearn/preimage/preimage_iam.py deleted file mode 100644 index bf79d0e..0000000 --- a/gklearn/preimage/preimage_iam.py +++ /dev/null @@ -1,705 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Tue Apr 30 17:07:43 2019 - -A graph pre-image method combining iterative pre-image method in reference [1] -and the iterative alternate minimizations (IAM) in reference [2]. -@author: ljia -@references: - [1] Gökhan H Bakir, Alexander Zien, and Koji Tsuda. Learning to and graph - pre-images. In Joint Pattern Re ognition Symposium , pages 253-261. Springer, 2004. - [2] Generalized median graph via iterative alternate minimization. -""" -import sys -import numpy as np -from tqdm import tqdm -import networkx as nx -import matplotlib.pyplot as plt -import random - -from iam import iam_upgraded -from utils import dis_gstar, compute_kernel - - -def preimage_iam(Gn_init, Gn_median, alpha, idx_gi, Kmatrix, k, r_max, - gkernel, epsilon=0.001, InitIAMWithAllDk=False, - params_iam={'c_ei': 1, 'c_er': 1, 'c_es': 1, - 'ite_max': 50, 'epsilon': 0.001, - 'removeNodes': True, 'connected': False}, - params_ged={'lib': 'gedlibpy', 'cost': 'CHEM_1', 'method': 'IPFP', - 'edit_cost_constant': [], 'stabilizer': 'min', - 'repeat': 50}): - """This function constructs graph pre-image by the iterative pre-image - framework in reference [1], algorithm 1, where the step of generating new - graphs randomly is replaced by the IAM algorithm in reference [2]. - - notes - ----- - Every time a set of n better graphs is acquired, their distances in kernel space are - compared with the k nearest ones, and the k nearest distances from the k+n - distances will be used as the new ones. - """ - # compute k nearest neighbors of phi in DN. - dis_all = [] # distance between g_star and each graph. - term3 = 0 - for i1, a1 in enumerate(alpha): - for i2, a2 in enumerate(alpha): - term3 += a1 * a2 * Kmatrix[idx_gi[i1], idx_gi[i2]] - for ig, g in tqdm(enumerate(Gn_init), desc='computing distances', file=sys.stdout): - dtemp = dis_gstar(ig, idx_gi, alpha, Kmatrix, term3=term3) - dis_all.append(dtemp) - - # sort - sort_idx = np.argsort(dis_all) - dis_k = [dis_all[idis] for idis in sort_idx[0:k]] # the k shortest distances - nb_best = len(np.argwhere(dis_k == dis_k[0]).flatten().tolist()) - ghat_list = [Gn_init[idx].copy() for idx in sort_idx[0:nb_best]] # the nearest neighbors of phi in DN - if dis_k[0] == 0: # the exact pre-image. - print('The exact pre-image is found from the input dataset.') - return 0, ghat_list, 0, 0 - dhat = dis_k[0] # the nearest distance -# for g in ghat_list: -# draw_Letter_graph(g) -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - Gk = [Gn_init[ig].copy() for ig in sort_idx[0:k]] # the k nearest neighbors -# for gi in Gk: -# nx.draw(gi, labels=nx.get_node_attributes(gi, 'atom'), with_labels=True) -## nx.draw_networkx(gi) -# plt.show() -## draw_Letter_graph(g) -# print(gi.nodes(data=True)) -# print(gi.edges(data=True)) - -# i = 1 - r = 0 - itr_total = 0 - dis_of_each_itr = [dhat] - found = False - nb_updated = 0 - nb_updated_k = 0 - while r < r_max:# and not found: # @todo: if not found?# and np.abs(old_dis - cur_dis) > epsilon: - print('\n-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-') - print('Current preimage iteration =', r) - print('Total preimage iteration =', itr_total, '\n') - found = False - - Gn_nearest_median = [g.copy() for g in Gk] - if InitIAMWithAllDk: # each graph in D_k is used to initialize IAM. - ghat_new_list = [] - for g_tmp in Gk: - Gn_nearest_init = [g_tmp.copy()] - ghat_new_list_tmp, _, _ = iam_upgraded(Gn_nearest_median, - Gn_nearest_init, params_ged=params_ged, **params_iam) - ghat_new_list += ghat_new_list_tmp - else: # only the best graph in D_k is used to initialize IAM. - Gn_nearest_init = [g.copy() for g in Gk] - ghat_new_list, _, _ = iam_upgraded(Gn_nearest_median, Gn_nearest_init, - params_ged=params_ged, **params_iam) - -# for g in g_tmp_list: -# nx.draw_networkx(g) -# plt.show() -# draw_Letter_graph(g) -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(ghat_new_list + Gn_median, gkernel, False) - dhat_new_list = [] - for idx, g_tmp in enumerate(ghat_new_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(ghat_new_list), - len(ghat_new_list) + len(Gn_median) + 1), - alpha, knew, withterm3=False)) - - for idx_g, ghat_new in enumerate(ghat_new_list): - dhat_new = dhat_new_list[idx_g] - - # if the new distance is smaller than the max of D_k. - if dhat_new < dis_k[-1] and np.abs(dhat_new - dis_k[-1]) >= epsilon: - # check if the new distance is the same as one in D_k. - is_duplicate = False - for dis_tmp in dis_k[1:-1]: - if np.abs(dhat_new - dis_tmp) < epsilon: - is_duplicate = True - print('IAM: duplicate k nearest graph generated.') - break - if not is_duplicate: - if np.abs(dhat_new - dhat) < epsilon: - print('IAM: I am equal!') -# dhat = dhat_new -# ghat_list = [ghat_new.copy()] - else: - print('IAM: we got better k nearest neighbors!') - nb_updated_k += 1 - print('the k nearest neighbors are updated', - nb_updated_k, 'times.') - - dis_k = [dhat_new] + dis_k[0:k-1] # add the new nearest distance. - Gk = [ghat_new.copy()] + Gk[0:k-1] # add the corresponding graph. - sort_idx = np.argsort(dis_k) - dis_k = [dis_k[idx] for idx in sort_idx[0:k]] # the new k nearest distances. - Gk = [Gk[idx] for idx in sort_idx[0:k]] - if dhat_new < dhat: - print('IAM: I have smaller distance!') - print(str(dhat) + '->' + str(dhat_new)) - dhat = dhat_new - ghat_list = [Gk[0].copy()] - r = 0 - nb_updated += 1 - - print('the graph is updated', nb_updated, 'times.') - nx.draw(Gk[0], labels=nx.get_node_attributes(Gk[0], 'atom'), - with_labels=True) - ## plt.savefig("results/gk_iam/simple_two/xx" + str(i) + ".png", format="PNG") - plt.show() - - found = True - if not found: - r += 1 - - dis_of_each_itr.append(dhat) - itr_total += 1 - print('\nthe k shortest distances are', dis_k) - print('the shortest distances for previous iterations are', dis_of_each_itr) - - print('\n\nthe graph is updated', nb_updated, 'times.') - print('\nthe k nearest neighbors are updated', nb_updated_k, 'times.') - print('distances in kernel space:', dis_of_each_itr, '\n') - - return dhat, ghat_list, dis_of_each_itr[-1], nb_updated, nb_updated_k - - - - -def preimage_iam_random_mix(Gn_init, Gn_median, alpha, idx_gi, Kmatrix, k, r_max, - l_max, gkernel, epsilon=0.001, - InitIAMWithAllDk=False, InitRandomWithAllDk=True, - params_iam={'c_ei': 1, 'c_er': 1, 'c_es': 1, - 'ite_max': 50, 'epsilon': 0.001, - 'removeNodes': True, 'connected': False}, - params_ged={'lib': 'gedlibpy', 'cost': 'CHEM_1', - 'method': 'IPFP', 'edit_cost_constant': [], - 'stabilizer': 'min', 'repeat': 50}): - """This function constructs graph pre-image by the iterative pre-image - framework in reference [1], algorithm 1, where new graphs are generated - randomly and by the IAM algorithm in reference [2]. - - notes - ----- - Every time a set of n better graphs is acquired, their distances in kernel space are - compared with the k nearest ones, and the k nearest distances from the k+n - distances will be used as the new ones. - """ - Gn_init = [nx.convert_node_labels_to_integers(g) for g in Gn_init] - # compute k nearest neighbors of phi in DN. - dis_all = [] # distance between g_star and each graph. - term3 = 0 - for i1, a1 in enumerate(alpha): - for i2, a2 in enumerate(alpha): - term3 += a1 * a2 * Kmatrix[idx_gi[i1], idx_gi[i2]] - for ig, g in tqdm(enumerate(Gn_init), desc='computing distances', file=sys.stdout): - dtemp = dis_gstar(ig, idx_gi, alpha, Kmatrix, term3=term3) - dis_all.append(dtemp) - - # sort - sort_idx = np.argsort(dis_all) - dis_k = [dis_all[idis] for idis in sort_idx[0:k]] # the k shortest distances - nb_best = len(np.argwhere(dis_k == dis_k[0]).flatten().tolist()) - ghat_list = [Gn_init[idx].copy() for idx in sort_idx[0:nb_best]] # the nearest neighbors of psi in DN - if dis_k[0] == 0: # the exact pre-image. - print('The exact pre-image is found from the input dataset.') - return 0, ghat_list, 0, 0 - dhat = dis_k[0] # the nearest distance -# for g in ghat_list: -# draw_Letter_graph(g) -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - Gk = [Gn_init[ig].copy() for ig in sort_idx[0:k]] # the k nearest neighbors -# for gi in Gk: -# nx.draw(gi, labels=nx.get_node_attributes(gi, 'atom'), with_labels=True) -## nx.draw_networkx(gi) -# plt.show() -## draw_Letter_graph(g) -# print(gi.nodes(data=True)) -# print(gi.edges(data=True)) - - r = 0 - itr_total = 0 - dis_of_each_itr = [dhat] - nb_updated_iam = 0 - nb_updated_k_iam = 0 - nb_updated_random = 0 - nb_updated_k_random = 0 -# is_iam_duplicate = False - while r < r_max: # and not found: # @todo: if not found?# and np.abs(old_dis - cur_dis) > epsilon: - print('\n-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-') - print('Current preimage iteration =', r) - print('Total preimage iteration =', itr_total, '\n') - found_iam = False - - Gn_nearest_median = [g.copy() for g in Gk] - if InitIAMWithAllDk: # each graph in D_k is used to initialize IAM. - ghat_new_list = [] - for g_tmp in Gk: - Gn_nearest_init = [g_tmp.copy()] - ghat_new_list_tmp, _ = iam_upgraded(Gn_nearest_median, - Gn_nearest_init, params_ged=params_ged, **params_iam) - ghat_new_list += ghat_new_list_tmp - else: # only the best graph in D_k is used to initialize IAM. - Gn_nearest_init = [g.copy() for g in Gk] - ghat_new_list, _ = iam_upgraded(Gn_nearest_median, Gn_nearest_init, - params_ged=params_ged, **params_iam) - -# for g in g_tmp_list: -# nx.draw_networkx(g) -# plt.show() -# draw_Letter_graph(g) -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(ghat_new_list + Gn_median, gkernel, False) - dhat_new_list = [] - - for idx, g_tmp in enumerate(ghat_new_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(ghat_new_list), - len(ghat_new_list) + len(Gn_median) + 1), - alpha, knew, withterm3=False)) - - # find the new k nearest graphs. - for idx_g, ghat_new in enumerate(ghat_new_list): - dhat_new = dhat_new_list[idx_g] - - # if the new distance is smaller than the max of D_k. - if dhat_new < dis_k[-1] and np.abs(dhat_new - dis_k[-1]) >= epsilon: - # check if the new distance is the same as one in D_k. - is_duplicate = False - for dis_tmp in dis_k[1:-1]: - if np.abs(dhat_new - dis_tmp) < epsilon: - is_duplicate = True - print('IAM: duplicate k nearest graph generated.') - break - if not is_duplicate: - if np.abs(dhat_new - dhat) < epsilon: - print('IAM: I am equal!') -# dhat = dhat_new -# ghat_list = [ghat_new.copy()] - else: - print('IAM: we got better k nearest neighbors!') - nb_updated_k_iam += 1 - print('the k nearest neighbors are updated', - nb_updated_k_iam, 'times.') - - dis_k = [dhat_new] + dis_k[0:k-1] # add the new nearest distance. - Gk = [ghat_new.copy()] + Gk[0:k-1] # add the corresponding graph. - sort_idx = np.argsort(dis_k) - dis_k = [dis_k[idx] for idx in sort_idx[0:k]] # the new k nearest distances. - Gk = [Gk[idx] for idx in sort_idx[0:k]] - if dhat_new < dhat: - print('IAM: I have smaller distance!') - print(str(dhat) + '->' + str(dhat_new)) - dhat = dhat_new - ghat_list = [Gk[0].copy()] - r = 0 - nb_updated_iam += 1 - - print('the graph is updated by IAM', nb_updated_iam, - 'times.') - nx.draw(Gk[0], labels=nx.get_node_attributes(Gk[0], 'atom'), - with_labels=True) - ## plt.savefig("results/gk_iam/simple_two/xx" + str(i) + ".png", format="PNG") - plt.show() - - found_iam = True - - # when new distance is not smaller than the max of D_k, use random generation. - if not found_iam: - print('Distance not better, switching to random generation now.') - print(str(dhat) + '->' + str(dhat_new)) - - if InitRandomWithAllDk: # use all k nearest graphs as the initials. - init_list = [g_init.copy() for g_init in Gk] - else: # use just the nearest graph as the initial. - init_list = [Gk[0].copy()] - - # number of edges to be changed. - if len(init_list) == 1: - # @todo what if the log is negetive? how to choose alpha (scalar)? seems fdgs is always 1. - # fdgs = dhat_new - fdgs = nb_updated_random + 1 - if fdgs < 1: - fdgs = 1 - fdgs = int(np.ceil(np.log(fdgs))) - if fdgs < 1: - fdgs += 1 - # fdgs = nb_updated_random + 1 # @todo: - fdgs_list = [fdgs] - else: - # @todo what if the log is negetive? how to choose alpha (scalar)? - fdgs_list = np.array(dis_k[:]) - if np.min(fdgs_list) < 1: - fdgs_list /= dis_k[0] - fdgs_list = [int(item) for item in np.ceil(np.log(fdgs_list))] - if np.min(fdgs_list) < 1: - fdgs_list = np.array(fdgs_list) + 1 - - l = 0 - found_random = False - while l < l_max and not found_random: - for idx_g, g_tmp in enumerate(init_list): - # add and delete edges. - ghat_new = nx.convert_node_labels_to_integers(g_tmp.copy()) - # @todo: should we use just half of the adjacency matrix for undirected graphs? - nb_vpairs = nx.number_of_nodes(ghat_new) * (nx.number_of_nodes(ghat_new) - 1) - np.random.seed() - # which edges to change. - # @todo: what if fdgs is bigger than nb_vpairs? - idx_change = random.sample(range(nb_vpairs), fdgs_list[idx_g] if - fdgs_list[idx_g] < nb_vpairs else nb_vpairs) -# idx_change = np.random.randint(0, nx.number_of_nodes(gs) * -# (nx.number_of_nodes(gs) - 1), fdgs) - for item in idx_change: - node1 = int(item / (nx.number_of_nodes(ghat_new) - 1)) - node2 = (item - node1 * (nx.number_of_nodes(ghat_new) - 1)) - if node2 >= node1: # skip the self pair. - node2 += 1 - # @todo: is the randomness correct? - if not ghat_new.has_edge(node1, node2): - ghat_new.add_edge(node1, node2) - # nx.draw_networkx(gs) - # plt.show() - # nx.draw_networkx(ghat_new) - # plt.show() - else: - ghat_new.remove_edge(node1, node2) - # nx.draw_networkx(gs) - # plt.show() - # nx.draw_networkx(ghat_new) - # plt.show() - # nx.draw_networkx(ghat_new) - # plt.show() - - # compute distance between \psi and the new generated graph. - knew = compute_kernel([ghat_new] + Gn_median, gkernel, verbose=False) - dhat_new = dis_gstar(0, range(1, len(Gn_median) + 1), - alpha, knew, withterm3=False) - # @todo: the new distance is smaller or also equal? - if dhat_new < dis_k[-1] and np.abs(dhat_new - dis_k[-1]) >= epsilon: - # check if the new distance is the same as one in D_k. - is_duplicate = False - for dis_tmp in dis_k[1:-1]: - if np.abs(dhat_new - dis_tmp) < epsilon: - is_duplicate = True - print('Random: duplicate k nearest graph generated.') - break - if not is_duplicate: - if np.abs(dhat_new - dhat) < epsilon: - print('Random: I am equal!') - # dhat = dhat_new - # ghat_list = [ghat_new.copy()] - else: - print('Random: we got better k nearest neighbors!') - print('l =', str(l)) - nb_updated_k_random += 1 - print('the k nearest neighbors are updated by random generation', - nb_updated_k_random, 'times.') - - dis_k = [dhat_new] + dis_k # add the new nearest distances. - Gk = [ghat_new.copy()] + Gk # add the corresponding graphs. - sort_idx = np.argsort(dis_k) - dis_k = [dis_k[idx] for idx in sort_idx[0:k]] # the new k nearest distances. - Gk = [Gk[idx] for idx in sort_idx[0:k]] - if dhat_new < dhat: - print('\nRandom: I am smaller!') - print('l =', str(l)) - print(dhat, '->', dhat_new) - dhat = dhat_new - ghat_list = [ghat_new.copy()] - r = 0 - nb_updated_random += 1 - - print('the graph is updated by random generation', - nb_updated_random, 'times.') - - nx.draw(ghat_new, labels=nx.get_node_attributes(ghat_new, 'atom'), - with_labels=True) - ## plt.savefig("results/gk_iam/simple_two/xx" + str(i) + ".png", format="PNG") - plt.show() - found_random = True - break - l += 1 - if not found_random: # l == l_max: - r += 1 - - dis_of_each_itr.append(dhat) - itr_total += 1 - print('\nthe k shortest distances are', dis_k) - print('the shortest distances for previous iterations are', dis_of_each_itr) - - print('\n\nthe graph is updated by IAM', nb_updated_iam, 'times, and by random generation', - nb_updated_random, 'times.') - print('\nthe k nearest neighbors are updated by IAM', nb_updated_k_iam, - 'times, and by random generation', nb_updated_k_random, 'times.') - print('distances in kernel space:', dis_of_each_itr, '\n') - - return dhat, ghat_list, dis_of_each_itr[-1], \ - nb_updated_iam, nb_updated_random, nb_updated_k_iam, nb_updated_k_random - - -############################################################################### -# Old implementations. - -#def gk_iam(Gn, alpha): -# """This function constructs graph pre-image by the iterative pre-image -# framework in reference [1], algorithm 1, where the step of generating new -# graphs randomly is replaced by the IAM algorithm in reference [2]. -# -# notes -# ----- -# Every time a better graph is acquired, the older one is replaced by it. -# """ -# pass -# # compute k nearest neighbors of phi in DN. -# dis_list = [] # distance between g_star and each graph. -# for ig, g in tqdm(enumerate(Gn), desc='computing distances', file=sys.stdout): -# dtemp = k_list[ig] - 2 * (alpha * k_g1_list[ig] + (1 - alpha) * -# k_g2_list[ig]) + (alpha * alpha * k_list[idx1] + alpha * -# (1 - alpha) * k_g2_list[idx1] + (1 - alpha) * alpha * -# k_g1_list[idx2] + (1 - alpha) * (1 - alpha) * k_list[idx2]) -# dis_list.append(dtemp) -# -# # sort -# sort_idx = np.argsort(dis_list) -# dis_gs = [dis_list[idis] for idis in sort_idx[0:k]] -# g0hat = Gn[sort_idx[0]] # the nearest neighbor of phi in DN -# if dis_gs[0] == 0: # the exact pre-image. -# print('The exact pre-image is found from the input dataset.') -# return 0, g0hat -# dhat = dis_gs[0] # the nearest distance -# Gk = [Gn[ig] for ig in sort_idx[0:k]] # the k nearest neighbors -# gihat_list = [] -# -## i = 1 -# r = 1 -# while r < r_max: -# print('r =', r) -## found = False -# Gs_nearest = Gk + gihat_list -# g_tmp = iam(Gs_nearest) -# -# # compute distance between \psi and the new generated graph. -# knew = marginalizedkernel([g_tmp, g1, g2], node_label='atom', edge_label=None, -# p_quit=lmbda, n_iteration=20, remove_totters=False, -# n_jobs=multiprocessing.cpu_count(), verbose=False) -# dnew = knew[0][0, 0] - 2 * (alpha * knew[0][0, 1] + (1 - alpha) * -# knew[0][0, 2]) + (alpha * alpha * k_list[idx1] + alpha * -# (1 - alpha) * k_g2_list[idx1] + (1 - alpha) * alpha * -# k_g1_list[idx2] + (1 - alpha) * (1 - alpha) * k_list[idx2]) -# if dnew <= dhat: # the new distance is smaller -# print('I am smaller!') -# dhat = dnew -# g_new = g_tmp.copy() # found better graph. -# gihat_list = [g_new] -# dis_gs.append(dhat) -# r = 0 -# else: -# r += 1 -# -# ghat = ([g0hat] if len(gihat_list) == 0 else gihat_list) -# -# return dhat, ghat - - -#def gk_iam_nearest(Gn, alpha, idx_gi, Kmatrix, k, r_max): -# """This function constructs graph pre-image by the iterative pre-image -# framework in reference [1], algorithm 1, where the step of generating new -# graphs randomly is replaced by the IAM algorithm in reference [2]. -# -# notes -# ----- -# Every time a better graph is acquired, its distance in kernel space is -# compared with the k nearest ones, and the k nearest distances from the k+1 -# distances will be used as the new ones. -# """ -# # compute k nearest neighbors of phi in DN. -# dis_list = [] # distance between g_star and each graph. -# for ig, g in tqdm(enumerate(Gn), desc='computing distances', file=sys.stdout): -# dtemp = dis_gstar(ig, idx_gi, alpha, Kmatrix) -## dtemp = k_list[ig] - 2 * (alpha * k_g1_list[ig] + (1 - alpha) * -## k_g2_list[ig]) + (alpha * alpha * k_list[0] + alpha * -## (1 - alpha) * k_g2_list[0] + (1 - alpha) * alpha * -## k_g1_list[6] + (1 - alpha) * (1 - alpha) * k_list[6]) -# dis_list.append(dtemp) -# -# # sort -# sort_idx = np.argsort(dis_list) -# dis_gs = [dis_list[idis] for idis in sort_idx[0:k]] # the k shortest distances -# g0hat = Gn[sort_idx[0]] # the nearest neighbor of phi in DN -# if dis_gs[0] == 0: # the exact pre-image. -# print('The exact pre-image is found from the input dataset.') -# return 0, g0hat -# dhat = dis_gs[0] # the nearest distance -# ghat = g0hat.copy() -# Gk = [Gn[ig].copy() for ig in sort_idx[0:k]] # the k nearest neighbors -# for gi in Gk: -# nx.draw_networkx(gi) -# plt.show() -# print(gi.nodes(data=True)) -# print(gi.edges(data=True)) -# Gs_nearest = Gk.copy() -## gihat_list = [] -# -## i = 1 -# r = 1 -# while r < r_max: -# print('r =', r) -## found = False -## Gs_nearest = Gk + gihat_list -## g_tmp = iam(Gs_nearest) -# g_tmp = test_iam_with_more_graphs_as_init(Gs_nearest, Gs_nearest, c_ei=1, c_er=1, c_es=1) -# nx.draw_networkx(g_tmp) -# plt.show() -# print(g_tmp.nodes(data=True)) -# print(g_tmp.edges(data=True)) -# -# # compute distance between \psi and the new generated graph. -# gi_list = [Gn[i] for i in idx_gi] -# knew = compute_kernel([g_tmp] + gi_list, 'untilhpathkernel', False) -# dnew = dis_gstar(0, range(1, len(gi_list) + 1), alpha, knew) -# -## dnew = knew[0, 0] - 2 * (alpha[0] * knew[0, 1] + alpha[1] * -## knew[0, 2]) + (alpha[0] * alpha[0] * k_list[0] + alpha[0] * -## alpha[1] * k_g2_list[0] + alpha[1] * alpha[0] * -## k_g1_list[1] + alpha[1] * alpha[1] * k_list[1]) -# if dnew <= dhat and g_tmp != ghat: # the new distance is smaller -# print('I am smaller!') -# print(str(dhat) + '->' + str(dnew)) -## nx.draw_networkx(ghat) -## plt.show() -## print('->') -## nx.draw_networkx(g_tmp) -## plt.show() -# -# dhat = dnew -# g_new = g_tmp.copy() # found better graph. -# ghat = g_tmp.copy() -# dis_gs.append(dhat) # add the new nearest distance. -# Gs_nearest.append(g_new) # add the corresponding graph. -# sort_idx = np.argsort(dis_gs) -# dis_gs = [dis_gs[idx] for idx in sort_idx[0:k]] # the new k nearest distances. -# Gs_nearest = [Gs_nearest[idx] for idx in sort_idx[0:k]] -# r = 0 -# else: -# r += 1 -# -# return dhat, ghat - - -#def gk_iam_nearest_multi(Gn, alpha, idx_gi, Kmatrix, k, r_max): -# """This function constructs graph pre-image by the iterative pre-image -# framework in reference [1], algorithm 1, where the step of generating new -# graphs randomly is replaced by the IAM algorithm in reference [2]. -# -# notes -# ----- -# Every time a set of n better graphs is acquired, their distances in kernel space are -# compared with the k nearest ones, and the k nearest distances from the k+n -# distances will be used as the new ones. -# """ -# Gn_median = [Gn[idx].copy() for idx in idx_gi] -# # compute k nearest neighbors of phi in DN. -# dis_list = [] # distance between g_star and each graph. -# for ig, g in tqdm(enumerate(Gn), desc='computing distances', file=sys.stdout): -# dtemp = dis_gstar(ig, idx_gi, alpha, Kmatrix) -## dtemp = k_list[ig] - 2 * (alpha * k_g1_list[ig] + (1 - alpha) * -## k_g2_list[ig]) + (alpha * alpha * k_list[0] + alpha * -## (1 - alpha) * k_g2_list[0] + (1 - alpha) * alpha * -## k_g1_list[6] + (1 - alpha) * (1 - alpha) * k_list[6]) -# dis_list.append(dtemp) -# -# # sort -# sort_idx = np.argsort(dis_list) -# dis_gs = [dis_list[idis] for idis in sort_idx[0:k]] # the k shortest distances -# nb_best = len(np.argwhere(dis_gs == dis_gs[0]).flatten().tolist()) -# g0hat_list = [Gn[idx] for idx in sort_idx[0:nb_best]] # the nearest neighbors of phi in DN -# if dis_gs[0] == 0: # the exact pre-image. -# print('The exact pre-image is found from the input dataset.') -# return 0, g0hat_list -# dhat = dis_gs[0] # the nearest distance -# ghat_list = [g.copy() for g in g0hat_list] -# for g in ghat_list: -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) -# Gk = [Gn[ig].copy() for ig in sort_idx[0:k]] # the k nearest neighbors -# for gi in Gk: -# nx.draw_networkx(gi) -# plt.show() -# print(gi.nodes(data=True)) -# print(gi.edges(data=True)) -# Gs_nearest = Gk.copy() -## gihat_list = [] -# -## i = 1 -# r = 1 -# while r < r_max: -# print('r =', r) -## found = False -## Gs_nearest = Gk + gihat_list -## g_tmp = iam(Gs_nearest) -# g_tmp_list = test_iam_moreGraphsAsInit_tryAllPossibleBestGraphs_deleteNodesInIterations( -# Gn_median, Gs_nearest, c_ei=1, c_er=1, c_es=1) -# for g in g_tmp_list: -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) -# -# # compute distance between \psi and the new generated graphs. -# gi_list = [Gn[i] for i in idx_gi] -# knew = compute_kernel(g_tmp_list + gi_list, 'marginalizedkernel', False) -# dnew_list = [] -# for idx, g_tmp in enumerate(g_tmp_list): -# dnew_list.append(dis_gstar(idx, range(len(g_tmp_list), -# len(g_tmp_list) + len(gi_list) + 1), alpha, knew)) -# -## dnew = knew[0, 0] - 2 * (alpha[0] * knew[0, 1] + alpha[1] * -## knew[0, 2]) + (alpha[0] * alpha[0] * k_list[0] + alpha[0] * -## alpha[1] * k_g2_list[0] + alpha[1] * alpha[0] * -## k_g1_list[1] + alpha[1] * alpha[1] * k_list[1]) -# -# # find the new k nearest graphs. -# dis_gs = dnew_list + dis_gs # add the new nearest distances. -# Gs_nearest = [g.copy() for g in g_tmp_list] + Gs_nearest # add the corresponding graphs. -# sort_idx = np.argsort(dis_gs) -# if len([i for i in sort_idx[0:k] if i < len(dnew_list)]) > 0: -# print('We got better k nearest neighbors! Hurray!') -# dis_gs = [dis_gs[idx] for idx in sort_idx[0:k]] # the new k nearest distances. -# print(dis_gs[-1]) -# Gs_nearest = [Gs_nearest[idx] for idx in sort_idx[0:k]] -# nb_best = len(np.argwhere(dis_gs == dis_gs[0]).flatten().tolist()) -# if len([i for i in sort_idx[0:nb_best] if i < len(dnew_list)]) > 0: -# print('I have smaller or equal distance!') -# dhat = dis_gs[0] -# print(str(dhat) + '->' + str(dhat)) -# idx_best_list = np.argwhere(dnew_list == dhat).flatten().tolist() -# ghat_list = [g_tmp_list[idx].copy() for idx in idx_best_list] -# for g in ghat_list: -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) -# r = 0 -# else: -# r += 1 -# -# return dhat, ghat_list \ No newline at end of file diff --git a/gklearn/preimage/preimage_random.py b/gklearn/preimage/preimage_random.py deleted file mode 100644 index e5f74cd..0000000 --- a/gklearn/preimage/preimage_random.py +++ /dev/null @@ -1,309 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Wed Mar 6 16:03:11 2019 - -pre-image -@author: ljia -""" - -import sys -import numpy as np -import random -from tqdm import tqdm -import networkx as nx -import matplotlib.pyplot as plt - -from gklearn.preimage.utils import compute_kernel, dis_gstar - - -def preimage_random(Gn_init, Gn_median, alpha, idx_gi, Kmatrix, k, r_max, l, gkernel): - Gn_init = [nx.convert_node_labels_to_integers(g) for g in Gn_init] - - # compute k nearest neighbors of phi in DN. - dis_list = [] # distance between g_star and each graph. - term3 = 0 - for i1, a1 in enumerate(alpha): - for i2, a2 in enumerate(alpha): - term3 += a1 * a2 * Kmatrix[idx_gi[i1], idx_gi[i2]] - for ig, g in tqdm(enumerate(Gn_init), desc='computing distances', file=sys.stdout): - dtemp = dis_gstar(ig, idx_gi, alpha, Kmatrix, term3=term3) - dis_list.append(dtemp) -# print(np.max(dis_list)) -# print(np.min(dis_list)) -# print(np.min([item for item in dis_list if item != 0])) -# print(np.mean(dis_list)) - - # sort - sort_idx = np.argsort(dis_list) - dis_gs = [dis_list[idis] for idis in sort_idx[0:k]] # the k shortest distances - nb_best = len(np.argwhere(dis_gs == dis_gs[0]).flatten().tolist()) - g0hat_list = [Gn_init[idx] for idx in sort_idx[0:nb_best]] # the nearest neighbors of phi in DN - if dis_gs[0] == 0: # the exact pre-image. - print('The exact pre-image is found from the input dataset.') - return 0, g0hat_list[0], 0 - dhat = dis_gs[0] # the nearest distance -# ghat_list = [g.copy() for g in g0hat_list] -# for g in ghat_list: -# draw_Letter_graph(g) -# nx.draw_networkx(g) -# plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - Gk = [Gn_init[ig].copy() for ig in sort_idx[0:k]] # the k nearest neighbors -# for gi in Gk: -## nx.draw_networkx(gi) -## plt.show() -# draw_Letter_graph(g) -# print(gi.nodes(data=True)) -# print(gi.edges(data=True)) - Gs_nearest = [g.copy() for g in Gk] - gihat_list = [] - dihat_list = [] - -# i = 1 - r = 0 -# sod_list = [dhat] -# found = False - dis_of_each_itr = [dhat] - nb_updated = 0 - g_best = [] - while r < r_max: - print('\nr =', r) - print('itr for gk =', nb_updated, '\n') - found = False - dis_bests = dis_gs + dihat_list - # @todo what if the log is negetive? how to choose alpha (scalar)? - fdgs_list = np.array(dis_bests) - if np.min(fdgs_list) < 1: - fdgs_list /= np.min(dis_bests) - fdgs_list = [int(item) for item in np.ceil(np.log(fdgs_list))] - if np.min(fdgs_list) < 1: - fdgs_list = np.array(fdgs_list) + 1 - - for ig, gs in enumerate(Gs_nearest + gihat_list): -# nx.draw_networkx(gs) -# plt.show() - for trail in range(0, l): -# for trail in tqdm(range(0, l), desc='l loops', file=sys.stdout): - # add and delete edges. - gtemp = gs.copy() - np.random.seed() - # which edges to change. - # @todo: should we use just half of the adjacency matrix for undirected graphs? - nb_vpairs = nx.number_of_nodes(gs) * (nx.number_of_nodes(gs) - 1) - # @todo: what if fdgs is bigger than nb_vpairs? - idx_change = random.sample(range(nb_vpairs), fdgs_list[ig] if - fdgs_list[ig] < nb_vpairs else nb_vpairs) -# idx_change = np.random.randint(0, nx.number_of_nodes(gs) * -# (nx.number_of_nodes(gs) - 1), fdgs) - for item in idx_change: - node1 = int(item / (nx.number_of_nodes(gs) - 1)) - node2 = (item - node1 * (nx.number_of_nodes(gs) - 1)) - if node2 >= node1: # skip the self pair. - node2 += 1 - # @todo: is the randomness correct? - if not gtemp.has_edge(node1, node2): - gtemp.add_edge(node1, node2) -# nx.draw_networkx(gs) -# plt.show() -# nx.draw_networkx(gtemp) -# plt.show() - else: - gtemp.remove_edge(node1, node2) -# nx.draw_networkx(gs) -# plt.show() -# nx.draw_networkx(gtemp) -# plt.show() -# nx.draw_networkx(gtemp) -# plt.show() - - # compute distance between \psi and the new generated graph. -# knew = marginalizedkernel([gtemp, g1, g2], node_label='atom', edge_label=None, -# p_quit=lmbda, n_iteration=20, remove_totters=False, -# n_jobs=multiprocessing.cpu_count(), verbose=False) - knew = compute_kernel([gtemp] + Gn_median, gkernel, verbose=False) - dnew = dis_gstar(0, range(1, len(Gn_median) + 1), alpha, knew, - withterm3=False) - if dnew <= dhat: # @todo: the new distance is smaller or also equal? - if dnew < dhat: - print('\nI am smaller!') - print('ig =', str(ig), ', l =', str(trail)) - print(dhat, '->', dnew) - nb_updated += 1 - elif dnew == dhat: - print('I am equal!') -# nx.draw_networkx(gtemp) -# plt.show() -# print(gtemp.nodes(data=True)) -# print(gtemp.edges(data=True)) - dhat = dnew - gnew = gtemp.copy() - found = True # found better graph. - if found: - r = 0 - gihat_list = [gnew] - dihat_list = [dhat] - else: - r += 1 - - dis_of_each_itr.append(dhat) - print('the shortest distances for previous iterations are', dis_of_each_itr) -# dis_best.append(dhat) - g_best = (g0hat_list[0] if len(gihat_list) == 0 else gihat_list[0]) - print('distances in kernel space:', dis_of_each_itr, '\n') - - return dhat, g_best, nb_updated -# return 0, 0, 0 - - -if __name__ == '__main__': - from gklearn.utils.graphfiles import loadDataset - -# ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', -# 'extra_params': {}} # node/edge symb - ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', - 'extra_params': {}} # node nsymb -# ds = {'name': 'Acyclic', 'dataset': '../datasets/monoterpenoides/trainset_9.ds', -# 'extra_params': {}} -# ds = {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', -# 'extra_params': {}} # node symb - - DN, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - #DN = DN[0:10] - - lmbda = 0.03 # termination probalility - r_max = 3 # 10 # iteration limit. - l = 500 - alpha_range = np.linspace(0.5, 0.5, 1) - #alpha_range = np.linspace(0.1, 0.9, 9) - k = 10 # 5 # k nearest neighbors - - # randomly select two molecules - #np.random.seed(1) - #idx1, idx2 = np.random.randint(0, len(DN), 2) - #g1 = DN[idx1] - #g2 = DN[idx2] - idx1 = 0 - idx2 = 6 - g1 = DN[idx1] - g2 = DN[idx2] - - # compute - k_list = [] # kernel between each graph and itself. - k_g1_list = [] # kernel between each graph and g1 - k_g2_list = [] # kernel between each graph and g2 - for ig, g in tqdm(enumerate(DN), desc='computing self kernels', file=sys.stdout): - # ktemp = marginalizedkernel([g, g1, g2], node_label='atom', edge_label=None, - # p_quit=lmbda, n_iteration=20, remove_totters=False, - # n_jobs=multiprocessing.cpu_count(), verbose=False) - ktemp = compute_kernel([g, g1, g2], 'untilhpathkernel', verbose=False) - k_list.append(ktemp[0, 0]) - k_g1_list.append(ktemp[0, 1]) - k_g2_list.append(ktemp[0, 2]) - - g_best = [] - dis_best = [] - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - # compute k nearest neighbors of phi in DN. - dis_list = [] # distance between g_star and each graph. - for ig, g in tqdm(enumerate(DN), desc='computing distances', file=sys.stdout): - dtemp = k_list[ig] - 2 * (alpha * k_g1_list[ig] + (1 - alpha) * - k_g2_list[ig]) + (alpha * alpha * k_list[idx1] + alpha * - (1 - alpha) * k_g2_list[idx1] + (1 - alpha) * alpha * - k_g1_list[idx2] + (1 - alpha) * (1 - alpha) * k_list[idx2]) - dis_list.append(np.sqrt(dtemp)) - - # sort - sort_idx = np.argsort(dis_list) - dis_gs = [dis_list[idis] for idis in sort_idx[0:k]] - g0hat = DN[sort_idx[0]] # the nearest neighbor of phi in DN - if dis_gs[0] == 0: # the exact pre-image. - print('The exact pre-image is found from the input dataset.') - g_pimg = g0hat - break - dhat = dis_gs[0] # the nearest distance - Dk = [DN[ig] for ig in sort_idx[0:k]] # the k nearest neighbors - gihat_list = [] - - i = 1 - r = 1 - while r < r_max: - print('r =', r) - found = False - for ig, gs in enumerate(Dk + gihat_list): - # nx.draw_networkx(gs) - # plt.show() - # @todo what if the log is negetive? - fdgs = int(np.abs(np.ceil(np.log(alpha * dis_gs[ig])))) - for trail in tqdm(range(0, l), desc='l loop', file=sys.stdout): - # add and delete edges. - gtemp = gs.copy() - np.random.seed() - # which edges to change. - # @todo: should we use just half of the adjacency matrix for undirected graphs? - nb_vpairs = nx.number_of_nodes(gs) * (nx.number_of_nodes(gs) - 1) - # @todo: what if fdgs is bigger than nb_vpairs? - idx_change = random.sample(range(nb_vpairs), fdgs if fdgs < nb_vpairs else nb_vpairs) - # idx_change = np.random.randint(0, nx.number_of_nodes(gs) * - # (nx.number_of_nodes(gs) - 1), fdgs) - for item in idx_change: - node1 = int(item / (nx.number_of_nodes(gs) - 1)) - node2 = (item - node1 * (nx.number_of_nodes(gs) - 1)) - if node2 >= node1: # skip the self pair. - node2 += 1 - # @todo: is the randomness correct? - if not gtemp.has_edge(node1, node2): - # @todo: how to update the bond_type? 0 or 1? - gtemp.add_edges_from([(node1, node2, {'bond_type': 1})]) - # nx.draw_networkx(gs) - # plt.show() - # nx.draw_networkx(gtemp) - # plt.show() - else: - gtemp.remove_edge(node1, node2) - # nx.draw_networkx(gs) - # plt.show() - # nx.draw_networkx(gtemp) - # plt.show() - # nx.draw_networkx(gtemp) - # plt.show() - - # compute distance between phi and the new generated graph. - # knew = marginalizedkernel([gtemp, g1, g2], node_label='atom', edge_label=None, - # p_quit=lmbda, n_iteration=20, remove_totters=False, - # n_jobs=multiprocessing.cpu_count(), verbose=False) - knew = compute_kernel([gtemp, g1, g2], 'untilhpathkernel', verbose=False) - dnew = np.sqrt(knew[0, 0] - 2 * (alpha * knew[0, 1] + (1 - alpha) * - knew[0, 2]) + (alpha * alpha * k_list[idx1] + alpha * - (1 - alpha) * k_g2_list[idx1] + (1 - alpha) * alpha * - k_g1_list[idx2] + (1 - alpha) * (1 - alpha) * k_list[idx2])) - if dnew < dhat: # @todo: the new distance is smaller or also equal? - print('I am smaller!') - print(dhat, '->', dnew) - nx.draw_networkx(gtemp) - plt.show() - print(gtemp.nodes(data=True)) - print(gtemp.edges(data=True)) - dhat = dnew - gnew = gtemp.copy() - found = True # found better graph. - r = 0 - elif dnew == dhat: - print('I am equal!') - if found: - gihat_list = [gnew] - dis_gs.append(dhat) - else: - r += 1 - dis_best.append(dhat) - g_best += ([g0hat] if len(gihat_list) == 0 else gihat_list) - - - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-image is') - nx.draw_networkx(g_best[idx]) - plt.show() \ No newline at end of file diff --git a/gklearn/preimage/python_code.py b/gklearn/preimage/python_code.py deleted file mode 100644 index 3772526..0000000 --- a/gklearn/preimage/python_code.py +++ /dev/null @@ -1,122 +0,0 @@ - elif opt_name == 'random-inits': - try: - num_random_inits_ = std::stoul(opt_val) - desired_num_random_inits_ = num_random_inits_ - - except: - raise Error('Invalid argument "' + opt_val + '" for option random-inits. Usage: options = "[--random-inits ]"') - - if num_random_inits_ <= 0: - raise Error('Invalid argument "' + opt_val + '" for option random-inits. Usage: options = "[--random-inits ]"') - - } - elif opt_name == 'randomness': - if opt_val == 'PSEUDO': - use_real_randomness_ = False - - elif opt_val == 'REAL': - use_real_randomness_ = True - - else: - raise Error('Invalid argument "' + opt_val + '" for option randomness. Usage: options = "[--randomness REAL|PSEUDO] [...]"') - - } - elif opt_name == 'stdout': - if opt_val == '0': - print_to_stdout_ = 0 - - elif opt_val == '1': - print_to_stdout_ = 1 - - elif opt_val == '2': - print_to_stdout_ = 2 - - else: - raise Error('Invalid argument "' + opt_val + '" for option stdout. Usage: options = "[--stdout 0|1|2] [...]"') - - } - elif opt_name == 'refine': - if opt_val == 'TRUE': - refine_ = True - - elif opt_val == 'FALSE': - refine_ = False - - else: - raise Error('Invalid argument "' + opt_val + '" for option refine. Usage: options = "[--refine TRUE|FALSE] [...]"') - - } - elif opt_name == 'time-limit': - try: - time_limit_in_sec_ = std::stod(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option time-limit. Usage: options = "[--time-limit ] [...]') - - } - elif opt_name == 'max-itrs': - try: - max_itrs_ = std::stoi(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option max-itrs. Usage: options = "[--max-itrs ] [...]') - - } - elif opt_name == 'max-itrs-without-update': - try: - max_itrs_without_update_ = std::stoi(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option max-itrs-without-update. Usage: options = "[--max-itrs-without-update ] [...]') - - } - elif opt_name == 'seed': - try: - seed_ = std::stoul(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option seed. Usage: options = "[--seed ] [...]') - - } - elif opt_name == 'epsilon': - try: - epsilon_ = std::stod(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option epsilon. Usage: options = "[--epsilon ] [...]') - - if epsilon_ <= 0: - raise Error('Invalid argument "' + opt_val + '" for option epsilon. Usage: options = "[--epsilon ] [...]') - - } - elif opt_name == 'inits-increase-order': - try: - num_inits_increase_order_ = std::stoul(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option inits-increase-order. Usage: options = "[--inits-increase-order ]"') - - if num_inits_increase_order_ <= 0: - raise Error('Invalid argument "' + opt_val + '" for option inits-increase-order. Usage: options = "[--inits-increase-order ]"') - - } - elif opt_name == 'init-type-increase-order': - init_type_increase_order_ = opt_val - if opt_val != 'CLUSTERS' and opt_val != 'K-MEANS++': - raise Exception(std::string('Invalid argument ') + opt_val + ' for option init-type-increase-order. Usage: options = "[--init-type-increase-order CLUSTERS|K-MEANS++] [...]"') - - } - elif opt_name == 'max-itrs-increase-order': - try: - max_itrs_increase_order_ = std::stoi(opt_val) - - except: - raise Error('Invalid argument "' + opt_val + '" for option max-itrs-increase-order. Usage: options = "[--max-itrs-increase-order ] [...]') - - } - else: - std::string valid_options('[--init-type ] [--random-inits ] [--randomness ] [--seed ] [--stdout ] ') - valid_options += '[--time-limit ] [--max-itrs ] [--epsilon ] ' - valid_options += '[--inits-increase-order ] [--init-type-increase-order ] [--max-itrs-increase-order ]' - raise Error(std::string('Invalid option "') + opt_name + '". Usage: options = "' + valid_options + '"') - diff --git a/gklearn/preimage/test.py b/gklearn/preimage/test.py deleted file mode 100644 index 4110a6f..0000000 --- a/gklearn/preimage/test.py +++ /dev/null @@ -1,83 +0,0 @@ -#export LD_LIBRARY_PATH=.:/export/home/lambertn/Documents/gedlibpy/lib/fann/:/export/home/lambertn/Documents/gedlibpy/lib/libsvm.3.22:/export/home/lambertn/Documents/gedlibpy/lib/nomad - -#Pour que "import script" trouve les librairies qu'a besoin GedLib -#Equivalent à définir la variable d'environnement LD_LIBRARY_PATH sur un bash -import gedlibpy.librariesImport -from gedlibpy import gedlibpy -import networkx as nx - - -def init() : - print("List of Edit Cost Options : ") - for i in gedlibpy.list_of_edit_cost_options : - print (i) - print("") - - print("List of Method Options : ") - for j in gedlibpy.list_of_method_options : - print (j) - print("") - - print("List of Init Options : ") - for k in gedlibpy.list_of_init_options : - print (k) - print("") - -def test(): - - gedlibpy.load_GXL_graphs('include/gedlib-master/data/datasets/Mutagenicity/data/', 'collections/MUTA_10.xml') - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost("CHEM_1") - gedlibpy.init() - gedlibpy.set_method("IPFP", "") - gedlibpy.init_method() - g = listID[0] - h = listID[1] - gedlibpy.run_method(g, h) - print("Node Map : ", gedlibpy.get_node_map(g,h)) - print("Forward map : " , gedlibpy.get_forward_map(g, h), ", Backward map : ", gedlibpy.get_backward_map(g, h)) - print("Assignment Matrix : ") - print(gedlibpy.get_assignment_matrix(g, h)) - print ("Upper Bound = " + str(gedlibpy.get_upper_bound(g,h)) + ", Lower Bound = " + str(gedlibpy.get_lower_bound(g, h)) + ", Runtime = " + str(gedlibpy.get_runtime(g, h))) - - -def convertGraph(G): - G_new = nx.Graph() - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd), chem=attrs['atom']) - for nd1, nd2, attrs in G.edges(data=True): - G_new.add_edge(str(nd1), str(nd2), valence=attrs['bond_type']) - - return G_new - - -def testNxGrapĥ(): - from gklearn.utils.graphfiles import loadDataset - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - - gedlibpy.restart_env() - for graph in Gn: - g_new = convertGraph(graph) - gedlibpy.add_nx_graph(g_new, "") - - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost("CHEM_1") - gedlibpy.init() - gedlibpy.set_method("IPFP", "") - gedlibpy.init_method() - - print(listID) - g = listID[0] - h = listID[1] - - gedlibpy.run_method(g, h) - - print("Node Map : ", gedlibpy.get_node_map(g, h)) - print("Forward map : " , gedlibpy.get_forward_map(g, h), ", Backward map : ", gedlibpy.get_backward_map(g, h)) - print ("Upper Bound = " + str(gedlibpy.get_upper_bound(g, h)) + ", Lower Bound = " + str(gedlibpy.get_lower_bound(g, h)) + ", Runtime = " + str(gedlibpy.get_runtime(g, h))) - -#test() -init() -#testNxGrapĥ() diff --git a/gklearn/preimage/test_fitDistance.py b/gklearn/preimage/test_fitDistance.py deleted file mode 100644 index 2945a24..0000000 --- a/gklearn/preimage/test_fitDistance.py +++ /dev/null @@ -1,648 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Oct 24 11:50:56 2019 - -@author: ljia -""" -from matplotlib import pyplot as plt -import numpy as np -from tqdm import tqdm - -from gklearn.utils.graphfiles import loadDataset -from gklearn.preimage.utils import remove_edges -from gklearn.preimage.fitDistance import fit_GED_to_kernel_distance -from gklearn.preimage.utils import normalize_distance_matrix - - -def test_update_costs(): - from preimage.fitDistance import update_costs - import cvxpy as cp - - ds = np.load('results/xp_fit_method/fit_data_debug4.gm.npz') - nb_cost_mat = ds['nb_cost_mat'] - dis_k_vec = ds['dis_k_vec'] - n_edit_operations = ds['n_edit_operations'] - ged_vec_init = ds['ged_vec_init'] - ged_mat = ds['ged_mat'] - - nb_cost_mat_new = nb_cost_mat[:,[2,3,4]] - x = cp.Variable(nb_cost_mat_new.shape[1]) - cost_fun = cp.sum_squares(nb_cost_mat_new * x - dis_k_vec) -# constraints = [x >= [0.000 for i in range(nb_cost_mat_new.shape[1])], -# np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0] -# constraints = [x >= [0.000 for i in range(nb_cost_mat_new.shape[1])], -# np.array([1.0, 1.0, -1.0, 0.0, 0.0]).T@x >= 0.0, -# np.array([0.0, 0.0, 0.0, 1.0, -1.0]).T@x == 0.0] - constraints = [x >= [0.00 for i in range(nb_cost_mat_new.shape[1])], - np.array([0.0, 1.0, -1.0]).T@x == 0.0] -# constraints = [x >= [0.00000 for i in range(nb_cost_mat_new.shape[1])]] - prob = cp.Problem(cp.Minimize(cost_fun), constraints) - prob.solve() - print(x.value) - edit_costs_new = np.concatenate((x.value, np.array([0.0]))) - residual = np.sqrt(prob.value) - - -def median_paper_clcpc_python_best(): - """c_vs <= c_vi + c_vr, c_es <= c_ei + c_er with ged computation with - python invoking the c++ code by bash command (with updated library). - """ -# ds = {'name': 'monoterpenoides', -# 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb -# _, y_all = loadDataset(ds['dataset']) - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - itr_max = 6 - algo_options = '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1' - params_ged = {'lib': 'gedlibpy', 'cost': 'CONSTANT', 'method': 'IPFP', - 'algo_options': algo_options, 'stabilizer': None} - - y_all = ['3', '1', '4', '6', '7', '8', '9', '2'] - repeats = 50 - collection_path = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/monoterpenoides/' - graph_dir = collection_path + 'gxl/' - - fn_edit_costs_output = 'results/median_paper/edit_costs_output.python_init40.k10.txt' - - for y in y_all: - for repeat in range(repeats): - edit_costs_output_file = open(fn_edit_costs_output, 'a') - collection_file = collection_path + 'monoterpenoides_' + y + '_' + str(repeat) + '.xml' - Gn, _ = loadDataset(collection_file, extra_params=graph_dir) - edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ - nb_cost_mat_list = fit_GED_to_kernel_distance(Gn, node_label, edge_label, - gkernel, itr_max, params_ged=params_ged, - parallel=True) - total_time = np.sum(time_list) -# print('\nedit_costs:', edit_costs) -# print('\nresidual_list:', residual_list) -# print('\nedit_cost_list:', edit_cost_list) -# print('\ndistance matrix in kernel space:', dis_k_mat) -# print('\nged matrix:', ged_mat) -# print('\ntotal time:', total_time) -# print('\nnb_cost_mat:', nb_cost_mat_list[-1]) - np.savez('results/median_paper/fit_distance.clcpc.python_init40.monot.elabeled.uhpkernel.y' - + y + '.repeat' + str(repeat) + '.k10..gm', - edit_costs=edit_costs, - residual_list=residual_list, edit_cost_list=edit_cost_list, - dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, - total_time=total_time, nb_cost_mat_list=nb_cost_mat_list) - - for ec in edit_costs: - edit_costs_output_file.write(str(ec) + ' ') - edit_costs_output_file.write('\n') - edit_costs_output_file.close() - - -# # normalized distance matrices. -# gmfile = np.load('results/fit_distance.cs_leq_ci_plus_cr.cost_leq_1en2.monot.elabeled.uhpkernel.gm.npz') -# edit_costs = gmfile['edit_costs'] -# residual_list = gmfile['residual_list'] -# edit_cost_list = gmfile['edit_cost_list'] -# dis_k_mat = gmfile['dis_k_mat'] -# ged_mat = gmfile['ged_mat'] -# total_time = gmfile['total_time'] -# nb_cost_mat_list = gmfile['nb_cost_mat_list'] - - nb_consistent, nb_inconsistent, ratio_consistent = pairwise_substitution_consistence(dis_k_mat, ged_mat) - print(nb_consistent, nb_inconsistent, ratio_consistent) - -# norm_dis_k_mat = normalize_distance_matrix(dis_k_mat) -# plt.imshow(norm_dis_k_mat) -# plt.colorbar() -# plt.savefig('results/median_paper/norm_dis_k_mat.clcpc.python_best.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.eps', format='eps', dpi=300) -# plt.savefig('results/median_paper/norm_dis_k_mat.clcpc.python_best.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.png', format='png') -# # plt.show() -# plt.clf() -# -# norm_ged_mat = normalize_distance_matrix(ged_mat) -# plt.imshow(norm_ged_mat) -# plt.colorbar() -# plt.savefig('results/median_paper/norm_ged_mat.clcpc.python_best.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.eps', format='eps', dpi=300) -# plt.savefig('results/median_paper/norm_ged_mat.clcpc.python_best.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.png', format='png') -# # plt.show() -# plt.clf() -# -# norm_diff = norm_ged_mat - norm_dis_k_mat -# plt.imshow(norm_diff) -# plt.colorbar() -# plt.savefig('results/median_paper/diff_mat_norm_ged_dis_k.clcpc.python_best.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.eps', format='eps', dpi=300) -# plt.savefig('results/median_paper/diff_mat_norm_ged_dis_k.clcpc.python_best.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.png', format='png') -# # plt.show() -# plt.clf() -# # draw_count_bar(norm_diff) - - -def median_paper_clcpc_python_bash_cpp(): - """c_vs <= c_vi + c_vr, c_es <= c_ei + c_er with ged computation with - python invoking the c++ code by bash command (with updated library). - """ -# ds = {'name': 'monoterpenoides', -# 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb -# _, y_all = loadDataset(ds['dataset']) - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - itr_max = 20 - algo_options = '--threads 6 --initial-solutions 10 --ratio-runs-from-initial-solutions .5' - params_ged = {'lib': 'gedlib-bash', 'cost': 'CONSTANT', 'method': 'IPFP', - 'algo_options': algo_options} - - y_all = ['3', '1', '4', '6', '7', '8', '9', '2'] - repeats = 50 - collection_path = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/monoterpenoides/' - graph_dir = collection_path + 'gxl/' - - fn_edit_costs_output = 'results/median_paper/edit_costs_output.txt' - - for y in y_all: - for repeat in range(repeats): - edit_costs_output_file = open(fn_edit_costs_output, 'a') - collection_file = collection_path + 'monoterpenoides_' + y + '_' + str(repeat) + '.xml' - Gn, _ = loadDataset(collection_file, extra_params=graph_dir) - edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ - nb_cost_mat_list, coef_dk = fit_GED_to_kernel_distance(Gn, node_label, edge_label, - gkernel, itr_max, params_ged=params_ged, - parallel=False) - total_time = np.sum(time_list) -# print('\nedit_costs:', edit_costs) -# print('\nresidual_list:', residual_list) -# print('\nedit_cost_list:', edit_cost_list) -# print('\ndistance matrix in kernel space:', dis_k_mat) -# print('\nged matrix:', ged_mat) -# print('\ntotal time:', total_time) -# print('\nnb_cost_mat:', nb_cost_mat_list[-1]) - np.savez('results/median_paper/fit_distance.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' - + y + '.repeat' + str(repeat) + '.gm', - edit_costs=edit_costs, - residual_list=residual_list, edit_cost_list=edit_cost_list, - dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, - total_time=total_time, nb_cost_mat_list=nb_cost_mat_list, - coef_dk=coef_dk) - - for ec in edit_costs: - edit_costs_output_file.write(str(ec) + ' ') - edit_costs_output_file.write('\n') - edit_costs_output_file.close() - - -# # normalized distance matrices. -# gmfile = np.load('results/fit_distance.cs_leq_ci_plus_cr.cost_leq_1en2.monot.elabeled.uhpkernel.gm.npz') -# edit_costs = gmfile['edit_costs'] -# residual_list = gmfile['residual_list'] -# edit_cost_list = gmfile['edit_cost_list'] -# dis_k_mat = gmfile['dis_k_mat'] -# ged_mat = gmfile['ged_mat'] -# total_time = gmfile['total_time'] -# nb_cost_mat_list = gmfile['nb_cost_mat_list'] -# coef_dk = gmfile['coef_dk'] - - nb_consistent, nb_inconsistent, ratio_consistent = pairwise_substitution_consistence(dis_k_mat, ged_mat) - print(nb_consistent, nb_inconsistent, ratio_consistent) - -# norm_dis_k_mat = normalize_distance_matrix(dis_k_mat) -# plt.imshow(norm_dis_k_mat) -# plt.colorbar() -# plt.savefig('results/median_paper/norm_dis_k_mat.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.eps', format='eps', dpi=300) -# plt.savefig('results/median_paper/norm_dis_k_mat.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.png', format='png') -# # plt.show() -# plt.clf() -# -# norm_ged_mat = normalize_distance_matrix(ged_mat) -# plt.imshow(norm_ged_mat) -# plt.colorbar() -# plt.savefig('results/median_paper/norm_ged_mat.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.eps', format='eps', dpi=300) -# plt.savefig('results/median_paper/norm_ged_mat.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.png', format='png') -# # plt.show() -# plt.clf() -# -# norm_diff = norm_ged_mat - norm_dis_k_mat -# plt.imshow(norm_diff) -# plt.colorbar() -# plt.savefig('results/median_paper/diff_mat_norm_ged_dis_k.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.eps', format='eps', dpi=300) -# plt.savefig('results/median_paper/diff_mat_norm_ged_dis_k.clcpc.python_bash_cpp.monot.elabeled.uhpkernel.y' -# + y + '.repeat' + str(repeat) + '.png', format='png') -# # plt.show() -# plt.clf() -# # draw_count_bar(norm_diff) - - - - - -def test_cs_leq_ci_plus_cr_python_bash_cpp(): - """c_vs <= c_vi + c_vr, c_es <= c_ei + c_er with ged computation with - python invoking the c++ code by bash command (with updated library). - """ - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:10] - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - itr_max = 10 - algo_options = '--threads 6 --initial-solutions 10 --ratio-runs-from-initial-solutions .5' - params_ged = {'lib': 'gedlib-bash', 'cost': 'CONSTANT', 'method': 'IPFP', - 'algo_options': algo_options} - edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ - nb_cost_mat_list, coef_dk = fit_GED_to_kernel_distance(Gn, node_label, edge_label, - gkernel, itr_max, params_ged=params_ged, - parallel=False) - total_time = np.sum(time_list) - print('\nedit_costs:', edit_costs) - print('\nresidual_list:', residual_list) - print('\nedit_cost_list:', edit_cost_list) - print('\ndistance matrix in kernel space:', dis_k_mat) - print('\nged matrix:', ged_mat) - print('\ntotal time:', total_time) - print('\nnb_cost_mat:', nb_cost_mat_list[-1]) - np.savez('results/fit_distance.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel.gm', - edit_costs=edit_costs, - residual_list=residual_list, edit_cost_list=edit_cost_list, - dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, - total_time=total_time, nb_cost_mat_list=nb_cost_mat_list, - coef_dk=coef_dk) - -# ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', -# 'extra_params': {}} # node/edge symb -# Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -## Gn = Gn[0:10] -## remove_edges(Gn) -# gkernel = 'untilhpathkernel' -# node_label = 'atom' -# edge_label = 'bond_type' -# itr_max = 10 -# edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ -# nb_cost_mat_list, coef_dk = fit_GED_to_kernel_distance(Gn, node_label, edge_label, -# gkernel, itr_max) -# total_time = np.sum(time_list) -# print('\nedit_costs:', edit_costs) -# print('\nresidual_list:', residual_list) -# print('\nedit_cost_list:', edit_cost_list) -# print('\ndistance matrix in kernel space:', dis_k_mat) -# print('\nged matrix:', ged_mat) -# print('\ntotal time:', total_time) -# print('\nnb_cost_mat:', nb_cost_mat_list[-1]) -# np.savez('results/fit_distance.cs_leq_ci_plus_cr.mutag.elabeled.uhpkernel.gm', -# edit_costs=edit_costs, -# residual_list=residual_list, edit_cost_list=edit_cost_list, -# dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, -# total_time=total_time, nb_cost_mat_list=nb_cost_mat_list, coef_dk) - - -# # normalized distance matrices. -# gmfile = np.load('results/fit_distance.cs_leq_ci_plus_cr.monot.elabeled.uhpkernel.gm.npz') -# edit_costs = gmfile['edit_costs'] -# residual_list = gmfile['residual_list'] -# edit_cost_list = gmfile['edit_cost_list'] -# dis_k_mat = gmfile['dis_k_mat'] -# ged_mat = gmfile['ged_mat'] -# total_time = gmfile['total_time'] -# nb_cost_mat_list = gmfile['nb_cost_mat_list'] -# coef_dk = gmfile['coef_dk'] - - nb_consistent, nb_inconsistent, ratio_consistent = pairwise_substitution_consistence(dis_k_mat, ged_mat) - print(nb_consistent, nb_inconsistent, ratio_consistent) - -# dis_k_sub = pairwise_substitution(dis_k_mat) -# ged_sub = pairwise_substitution(ged_mat) -# np.savez('results/sub_dis_mat.cs_leq_ci_plus_cr.gm', -# dis_k_sub=dis_k_sub, ged_sub=ged_sub) - - - norm_dis_k_mat = normalize_distance_matrix(dis_k_mat) - plt.imshow(norm_dis_k_mat) - plt.colorbar() - plt.savefig('results/norm_dis_k_mat.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel' - + '.eps', format='eps', dpi=300) - plt.savefig('results/norm_dis_k_mat.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel' - + '.png', format='png') -# plt.show() - plt.clf() - - norm_ged_mat = normalize_distance_matrix(ged_mat) - plt.imshow(norm_ged_mat) - plt.colorbar() - plt.savefig('results/norm_ged_mat.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel' - + '.eps', format='eps', dpi=300) - plt.savefig('results/norm_ged_mat.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel' - + '.png', format='png') -# plt.show() - plt.clf() - - norm_diff = norm_ged_mat - norm_dis_k_mat - plt.imshow(norm_diff) - plt.colorbar() - plt.savefig('results/diff_mat_norm_ged_dis_k.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel' - + '.eps', format='eps', dpi=300) - plt.savefig('results/diff_mat_norm_ged_dis_k.cs_leq_ci_plus_cr.python_bash_cpp.monot.elabeled.uhpkernel' - + '.png', format='png') -# plt.show() - plt.clf() -# draw_count_bar(norm_diff) - - -def test_anycosts(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:10] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - itr_max = 10 - edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ - nb_cost_mat_list, coef_dk = fit_GED_to_kernel_distance(Gn, gkernel, itr_max) - total_time = np.sum(time_list) - print('\nedit_costs:', edit_costs) - print('\nresidual_list:', residual_list) - print('\nedit_cost_list:', edit_cost_list) - print('\ndistance matrix in kernel space:', dis_k_mat) - print('\nged matrix:', ged_mat) - print('\ntotal time:', total_time) - print('\nnb_cost_mat:', nb_cost_mat_list[-1]) - np.savez('results/fit_distance.any_costs.gm', edit_costs=edit_costs, - residual_list=residual_list, edit_cost_list=edit_cost_list, - dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, - total_time=total_time, nb_cost_mat_list=nb_cost_mat_list) - -# # normalized distance matrices. -# gmfile = np.load('results/fit_distance.any_costs.gm.npz') -# edit_costs = gmfile['edit_costs'] -# residual_list = gmfile['residual_list'] -# edit_cost_list = gmfile['edit_cost_list'] -# dis_k_mat = gmfile['dis_k_mat'] -# ged_mat = gmfile['ged_mat'] -# total_time = gmfile['total_time'] -## nb_cost_mat_list = gmfile['nb_cost_mat_list'] - - norm_dis_k_mat = normalize_distance_matrix(dis_k_mat) - plt.imshow(norm_dis_k_mat) - plt.colorbar() - plt.savefig('results/norm_dis_k_mat.any_costs' + '.eps', format='eps', dpi=300) -# plt.savefig('results/norm_dis_k_mat.any_costs' + '.png', format='png') -# plt.show() - plt.clf() - - norm_ged_mat = normalize_distance_matrix(ged_mat) - plt.imshow(norm_ged_mat) - plt.colorbar() - plt.savefig('results/norm_ged_mat.any_costs' + '.eps', format='eps', dpi=300) -# plt.savefig('results/norm_ged_mat.any_costs' + '.png', format='png') -# plt.show() - plt.clf() - - norm_diff = norm_ged_mat - norm_dis_k_mat - plt.imshow(norm_diff) - plt.colorbar() - plt.savefig('results/diff_mat_norm_ged_dis_k.any_costs' + '.eps', format='eps', dpi=300) -# plt.savefig('results/diff_mat_norm_ged_dis_k.any_costs' + '.png', format='png') -# plt.show() - plt.clf() -# draw_count_bar(norm_diff) - - -def test_cs_leq_ci_plus_cr(): - """c_vs <= c_vi + c_vr, c_es <= c_ei + c_er - """ - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:10] - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - itr_max = 10 - edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ - nb_cost_mat_list, coef_dk = fit_GED_to_kernel_distance(Gn, node_label, edge_label, - gkernel, itr_max, - fitkernel='gaussian') - total_time = np.sum(time_list) - print('\nedit_costs:', edit_costs) - print('\nresidual_list:', residual_list) - print('\nedit_cost_list:', edit_cost_list) - print('\ndistance matrix in kernel space:', dis_k_mat) - print('\nged matrix:', ged_mat) - print('\ntotal time:', total_time) - print('\nnb_cost_mat:', nb_cost_mat_list[-1]) - np.savez('results/fit_distance.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel.gm', - edit_costs=edit_costs, - residual_list=residual_list, edit_cost_list=edit_cost_list, - dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, - total_time=total_time, nb_cost_mat_list=nb_cost_mat_list, - coef_dk=coef_dk) - -# ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', -# 'extra_params': {}} # node/edge symb -# Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -## Gn = Gn[0:10] -## remove_edges(Gn) -# gkernel = 'untilhpathkernel' -# node_label = 'atom' -# edge_label = 'bond_type' -# itr_max = 10 -# edit_costs, residual_list, edit_cost_list, dis_k_mat, ged_mat, time_list, \ -# nb_cost_mat_list, coef_dk = fit_GED_to_kernel_distance(Gn, node_label, edge_label, -# gkernel, itr_max) -# total_time = np.sum(time_list) -# print('\nedit_costs:', edit_costs) -# print('\nresidual_list:', residual_list) -# print('\nedit_cost_list:', edit_cost_list) -# print('\ndistance matrix in kernel space:', dis_k_mat) -# print('\nged matrix:', ged_mat) -# print('\ntotal time:', total_time) -# print('\nnb_cost_mat:', nb_cost_mat_list[-1]) -# np.savez('results/fit_distance.cs_leq_ci_plus_cr.cost_leq_1en2.mutag.elabeled.uhpkernel.gm', -# edit_costs=edit_costs, -# residual_list=residual_list, edit_cost_list=edit_cost_list, -# dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, -# total_time=total_time, nb_cost_mat_list=nb_cost_mat_list, coef_dk) - - -# # normalized distance matrices. -# gmfile = np.load('results/fit_distance.cs_leq_ci_plus_cr.cost_leq_1en2.monot.elabeled.uhpkernel.gm.npz') -# edit_costs = gmfile['edit_costs'] -# residual_list = gmfile['residual_list'] -# edit_cost_list = gmfile['edit_cost_list'] -# dis_k_mat = gmfile['dis_k_mat'] -# ged_mat = gmfile['ged_mat'] -# total_time = gmfile['total_time'] -# nb_cost_mat_list = gmfile['nb_cost_mat_list'] -# coef_dk = gmfile['coef_dk'] - - nb_consistent, nb_inconsistent, ratio_consistent = pairwise_substitution_consistence(dis_k_mat, ged_mat) - print(nb_consistent, nb_inconsistent, ratio_consistent) - -# dis_k_sub = pairwise_substitution(dis_k_mat) -# ged_sub = pairwise_substitution(ged_mat) -# np.savez('results/sub_dis_mat.cs_leq_ci_plus_cr.cost_leq_1en2.gm', -# dis_k_sub=dis_k_sub, ged_sub=ged_sub) - - - norm_dis_k_mat = normalize_distance_matrix(dis_k_mat) - plt.imshow(norm_dis_k_mat) - plt.colorbar() - plt.savefig('results/norm_dis_k_mat.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel' - + '.eps', format='eps', dpi=300) - plt.savefig('results/norm_dis_k_mat.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel' - + '.png', format='png') -# plt.show() - plt.clf() - - norm_ged_mat = normalize_distance_matrix(ged_mat) - plt.imshow(norm_ged_mat) - plt.colorbar() - plt.savefig('results/norm_ged_mat.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel' - + '.eps', format='eps', dpi=300) - plt.savefig('results/norm_ged_mat.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel' - + '.png', format='png') -# plt.show() - plt.clf() - - norm_diff = norm_ged_mat - norm_dis_k_mat - plt.imshow(norm_diff) - plt.colorbar() - plt.savefig('results/diff_mat_norm_ged_dis_k.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel' - + '.eps', format='eps', dpi=300) - plt.savefig('results/diff_mat_norm_ged_dis_k.cs_leq_ci_plus_cr.gaussian.cost_leq_1en2.monot.elabeled.uhpkernel' - + '.png', format='png') -# plt.show() - plt.clf() -# draw_count_bar(norm_diff) - - -def test_unfitted(): - """unfitted. - """ - from fitDistance import compute_geds - from utils import kernel_distance_matrix - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:10] - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - - -# ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', -# 'extra_params': {}} # node/edge symb -# Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -## Gn = Gn[0:10] -## remove_edges(Gn) -# gkernel = 'marginalizedkernel' - - dis_k_mat, _, _, _ = kernel_distance_matrix(Gn, node_label, edge_label, gkernel=gkernel) - ged_all, ged_mat, n_edit_operations = compute_geds(Gn, [3, 3, 1, 3, 3, 1], - [0, 1, 2, 3, 4, 5], parallel=True) - print('\ndistance matrix in kernel space:', dis_k_mat) - print('\nged matrix:', ged_mat) -# np.savez('results/fit_distance.cs_leq_ci_plus_cr.cost_leq_1en2.gm', edit_costs=edit_costs, -# residual_list=residual_list, edit_cost_list=edit_cost_list, -# dis_k_mat=dis_k_mat, ged_mat=ged_mat, time_list=time_list, -# total_time=total_time, nb_cost_mat_list=nb_cost_mat_list) - - # normalized distance matrices. -# gmfile = np.load('results/fit_distance.cs_leq_ci_plus_cr.cost_leq_1en3.gm.npz') -# edit_costs = gmfile['edit_costs'] -# residual_list = gmfile['residual_list'] -# edit_cost_list = gmfile['edit_cost_list'] -# dis_k_mat = gmfile['dis_k_mat'] -# ged_mat = gmfile['ged_mat'] -# total_time = gmfile['total_time'] -# nb_cost_mat_list = gmfile['nb_cost_mat_list'] - - nb_consistent, nb_inconsistent, ratio_consistent = pairwise_substitution_consistence(dis_k_mat, ged_mat) - print(nb_consistent, nb_inconsistent, ratio_consistent) - - norm_dis_k_mat = normalize_distance_matrix(dis_k_mat) - plt.imshow(norm_dis_k_mat) - plt.colorbar() - plt.savefig('results/norm_dis_k_mat.unfitted.MUTAG' + '.eps', format='eps', dpi=300) - plt.savefig('results/norm_dis_k_mat.unfitted.MUTAG' + '.png', format='png') -# plt.show() - plt.clf() - - norm_ged_mat = normalize_distance_matrix(ged_mat) - plt.imshow(norm_ged_mat) - plt.colorbar() - plt.savefig('results/norm_ged_mat.unfitted.MUTAG' + '.eps', format='eps', dpi=300) - plt.savefig('results/norm_ged_mat.unfitted.MUTAG' + '.png', format='png') -# plt.show() - plt.clf() - - norm_diff = norm_ged_mat - norm_dis_k_mat - plt.imshow(norm_diff) - plt.colorbar() - plt.savefig('results/diff_mat_norm_ged_dis_k.unfitted.MUTAG' + '.eps', format='eps', dpi=300) - plt.savefig('results/diff_mat_norm_ged_dis_k.unfitted.MUTAG' + '.png', format='png') -# plt.show() - plt.clf() - draw_count_bar(norm_diff) - - -def pairwise_substitution_consistence(mat1, mat2): - """ - """ - nb_consistent = 0 - nb_inconsistent = 0 - # the matrix is considered symmetric. - upper_tri1 = mat1[np.triu_indices_from(mat1)] - upper_tri2 = mat2[np.tril_indices_from(mat2)] - for i in tqdm(range(len(upper_tri1)), desc='computing consistence', file=sys.stdout): - for j in range(i, len(upper_tri1)): - if np.sign(upper_tri1[i] - upper_tri1[j]) == np.sign(upper_tri2[i] - upper_tri2[j]): - nb_consistent += 1 - else: - nb_inconsistent += 1 - return nb_consistent, nb_inconsistent, nb_consistent / (nb_consistent + nb_inconsistent) - - -def pairwise_substitution(mat): - # the matrix is considered symmetric. - upper_tri = mat[np.triu_indices_from(mat)] - sub_list = [] - for i in tqdm(range(len(upper_tri)), desc='computing', file=sys.stdout): - for j in range(i, len(upper_tri)): - sub_list.append(upper_tri[i] - upper_tri[j]) - return sub_list - - -def draw_count_bar(norm_diff): - import pandas - from collections import Counter, OrderedDict - norm_diff_cnt = norm_diff.flatten() - norm_diff_cnt = norm_diff_cnt * 10 - norm_diff_cnt = np.floor(norm_diff_cnt) - norm_diff_cnt = Counter(norm_diff_cnt) - norm_diff_cnt = OrderedDict(sorted(norm_diff_cnt.items())) - df = pandas.DataFrame.from_dict(norm_diff_cnt, orient='index') - df.plot(kind='bar') - - -if __name__ == '__main__': -# test_anycosts() -# test_cs_leq_ci_plus_cr() -# test_unfitted() - -# test_cs_leq_ci_plus_cr_python_bash_cpp() -# median_paper_clcpc_python_bash_cpp() -# median_paper_clcpc_python_best() - -# x = np.array([[1,2,3],[4,5,6],[7,8,9]]) -# xx = pairwise_substitution(x) - - test_update_costs() \ No newline at end of file diff --git a/gklearn/preimage/test_ged.py b/gklearn/preimage/test_ged.py deleted file mode 100644 index 74e18a0..0000000 --- a/gklearn/preimage/test_ged.py +++ /dev/null @@ -1,520 +0,0 @@ -#export LD_LIBRARY_PATH=.:/export/home/lambertn/Documents/gedlibpy/lib/fann/:/export/home/lambertn/Documents/gedlibpy/lib/libsvm.3.22:/export/home/lambertn/Documents/gedlibpy/lib/nomad - -#Pour que "import script" trouve les librairies qu'a besoin GedLib -#Equivalent à définir la variable d'environnement LD_LIBRARY_PATH sur un bash -#import gedlibpy_linlin.librariesImport -#from gedlibpy_linlin import gedlibpy -from libs import * -import networkx as nx -import numpy as np -from tqdm import tqdm -import sys - - -def test_NON_SYMBOLIC_cost(): - """Test edit cost LETTER2. - """ - from gklearn.preimage.ged import GED, get_nb_edit_operations_nonsymbolic, get_nb_edit_operations_letter - from gklearn.preimage.test_k_closest_graphs import reform_attributes - from gklearn.utils.graphfiles import loadDataset - - dataset = '../../datasets/Letter-high/Letter-high_A.txt' - Gn, y_all = loadDataset(dataset) - - g1 = Gn[200] - g2 = Gn[1780] - reform_attributes(g1) - reform_attributes(g2) - - c_vi = 0.675 - c_vr = 0.675 - c_vs = 0.75 - c_ei = 0.425 - c_er = 0.425 - c_es = 0 - - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] - dis, pi_forward, pi_backward = GED(g1, g2, lib='gedlibpy', - cost='NON_SYMBOLIC', method='IPFP', edit_cost_constant=edit_cost_constant, - algo_options='', stabilizer=None) - n_vi, n_vr, sod_vs, n_ei, n_er, sod_es = get_nb_edit_operations_nonsymbolic(g1, g2, - pi_forward, pi_backward) - - print('# of operations:', n_vi, n_vr, sod_vs, n_ei, n_er, sod_es) - print('c_vi, c_vr, c_vs, c_ei, c_er:', c_vi, c_vr, c_vs, c_ei, c_er, c_es) - cost_computed = c_vi * n_vi + c_vr * n_vr + c_vs * sod_vs \ - + c_ei * n_ei + c_er * n_er + c_es * sod_es - print('dis (cost computed by GED):', dis) - print('cost computed by # of operations and edit cost constants:', cost_computed) - - -def test_LETTER2_cost(): - """Test edit cost LETTER2. - """ - from gklearn.preimage.ged import GED, get_nb_edit_operations_letter - from gklearn.preimage.test_k_closest_graphs import reform_attributes - from gklearn.utils.graphfiles import loadDataset - - ds = {'dataset': 'cpp_ext/data/collections/Letter.xml', - 'graph_dir': os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/HIGH/'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['graph_dir']) - - g1 = Gn[200] - g2 = Gn[1780] - reform_attributes(g1) - reform_attributes(g2) - - c_vi = 0.675 - c_vr = 0.675 - c_vs = 0.75 - c_ei = 0.425 - c_er = 0.425 - - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er] - dis, pi_forward, pi_backward = GED(g1, g2, dataset='letter', lib='gedlibpy', - cost='LETTER2', method='IPFP', edit_cost_constant=edit_cost_constant, - algo_options='', stabilizer=None) - n_vi, n_vr, n_vs, sod_vs, n_ei, n_er = get_nb_edit_operations_letter(g1, g2, - pi_forward, pi_backward) - - print('# of operations:', n_vi, n_vr, n_vs, sod_vs, n_ei, n_er) - print('c_vi, c_vr, c_vs, c_ei, c_er:', c_vi, c_vr, c_vs, c_ei, c_er) - cost_computed = c_vi * n_vi + c_vr * n_vr + c_vs * sod_vs \ - + c_ei * n_ei + c_er * n_er - print('dis (cost computed by GED):', dis) - print('cost computed by # of operations and edit cost constants:', cost_computed) - - - -def test_get_nb_edit_operations_letter(): - """Test whether function preimage.ged.get_nb_edit_operations_letter returns - correct numbers of edit operations. The distance/cost computed by GED - should be the same as the cost computed by number of operations and edit - cost constants. - """ - from gklearn.preimage.ged import GED, get_nb_edit_operations_letter - from gklearn.preimage.test_k_closest_graphs import reform_attributes - from gklearn.utils.graphfiles import loadDataset - - ds = {'dataset': 'cpp_ext/data/collections/Letter.xml', - 'graph_dir': os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/HIGH/'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['graph_dir']) - - g1 = Gn[200] - g2 = Gn[1780] - reform_attributes(g1) - reform_attributes(g2) - - c_vir = 0.9 - c_eir = 1.7 - alpha = 0.75 - - edit_cost_constant = [c_vir, c_eir, alpha] - dis, pi_forward, pi_backward = GED(g1, g2, dataset='letter', lib='gedlibpy', - cost='LETTER', method='IPFP', edit_cost_constant=edit_cost_constant, - algo_options='', stabilizer=None) - n_vi, n_vr, n_vs, c_vs, n_ei, n_er = get_nb_edit_operations_letter(g1, g2, - pi_forward, pi_backward) - - print('# of operations and costs:', n_vi, n_vr, n_vs, c_vs, n_ei, n_er) - print('c_vir, c_eir, alpha:', c_vir, c_eir, alpha) - cost_computed = alpha * c_vir * (n_vi + n_vr) \ - + alpha * c_vs \ - + (1 - alpha) * c_eir * (n_ei + n_er) - print('dis (cost computed by GED):', dis) - print('cost computed by # of operations and edit cost constants:', cost_computed) - - -def test_get_nb_edit_operations(): - """Test whether function preimage.ged.get_nb_edit_operations returns correct - numbers of edit operations. The distance/cost computed by GED should be the - same as the cost computed by number of operations and edit cost constants. - """ - from gklearn.preimage.ged import GED, get_nb_edit_operations - from gklearn.utils.graphfiles import loadDataset - import os - - ds = {'dataset': '../../datasets/monoterpenoides/dataset_10+.ds', - 'graph_dir': os.path.dirname(os.path.realpath(__file__)) + '../../datasets/monoterpenoides/'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) - - g1 = Gn[20] - g2 = Gn[108] - - c_vi = 3 - c_vr = 3 - c_vs = 1 - c_ei = 3 - c_er = 3 - c_es = 1 - - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] - dis, pi_forward, pi_backward = GED(g1, g2, dataset='monoterpenoides', lib='gedlibpy', - cost='CONSTANT', method='IPFP', edit_cost_constant=edit_cost_constant, - algo_options='', stabilizer=None) - n_vi, n_vr, n_vs, n_ei, n_er, n_es = get_nb_edit_operations(g1, g2, - pi_forward, pi_backward) - - print('# of operations and costs:', n_vi, n_vr, n_vs, n_ei, n_er, n_es) - print('edit costs:', c_vi, c_vr, c_vs, c_ei, c_er, c_es) - cost_computed = n_vi * c_vi + n_vr * c_vr + n_vs * c_vs \ - + n_ei * c_ei + n_er * c_er + n_es * c_es - print('dis (cost computed by GED):', dis) - print('cost computed by # of operations and edit cost constants:', cost_computed) - - -def test_ged_python_bash_cpp(): - """Test ged computation with python invoking the c++ code by bash command (with updated library). - """ - from gklearn.utils.graphfiles import loadDataset - from gklearn.preimage.ged import GED - - data_dir_prefix = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/' -# collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/gxl/monoterpenoides.xml' - collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/monoterpenoides_3_20.xml' - graph_dir = data_dir_prefix +'generated_datsets/monoterpenoides/gxl/' - - Gn, y = loadDataset(collection_file, extra_params=graph_dir) - - algo_options = '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1' - - for repeat in range(0, 3): - # Generate the result file. - ged_filename = data_dir_prefix + 'output/test_ged/ged_mat_python_bash_' + str(repeat) + '_init40.3_20.txt' -# runtime_filename = data_dir_prefix + 'output/test_ged/runtime_mat_python_min_' + str(repeat) + '.txt' - - ged_file = open(ged_filename, 'a') -# runtime_file = open(runtime_filename, 'a') - - ged_mat = np.empty((len(Gn), len(Gn))) -# runtime_mat = np.empty((len(Gn), len(Gn))) - - for i in tqdm(range(len(Gn)), desc='computing GEDs', file=sys.stdout): - for j in range(len(Gn)): - print(i, j) - g1 = Gn[i] - g2 = Gn[j] - upper_bound, _, _ = GED(g1, g2, lib='gedlib-bash', cost='CONSTANT', - method='IPFP', - edit_cost_constant=[3.0, 3.0, 1.0, 3.0, 3.0, 1.0], - algo_options=algo_options) -# runtime = gedlibpy.get_runtime(g1, g2) - ged_mat[i][j] = upper_bound -# runtime_mat[i][j] = runtime - - # Write to files. - ged_file.write(str(int(upper_bound)) + ' ') -# runtime_file.write(str(runtime) + ' ') - - ged_file.write('\n') -# runtime_file.write('\n') - - ged_file.close() -# runtime_file.close() - - print('ged_mat') - print(ged_mat) -# print('runtime_mat:') -# print(runtime_mat) - - return - - - -def test_ged_best_settings_updated(): - """Test ged computation with best settings the same as in the C++ code (with updated library). - """ - - data_dir_prefix = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/' - collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/gxl/monoterpenoides.xml' -# collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/monoterpenoides_3_20.xml' - - graph_dir = data_dir_prefix +'generated_datsets/monoterpenoides/gxl/' - - algo_options = '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1' - - for repeat in range(0, 3): - # Generate the result file. - ged_filename = data_dir_prefix + 'output/test_ged/ged_mat_python_updated_' + str(repeat) + '_init40.txt' - runtime_filename = data_dir_prefix + 'output/test_ged/runtime_mat_python_updated_' + str(repeat) + '_init40.txt' - - gedlibpy.restart_env() - gedlibpy.load_GXL_graphs(graph_dir, collection_file) - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost('CONSTANT', [3.0, 3.0, 1.0, 3.0, 3.0, 1.0]) - gedlibpy.init() - gedlibpy.set_method("IPFP", algo_options) - gedlibpy.init_method() - - ged_mat = np.empty((len(listID), len(listID))) - runtime_mat = np.empty((len(listID), len(listID))) - - for i in tqdm(range(len(listID)), desc='computing GEDs', file=sys.stdout): - ged_file = open(ged_filename, 'a') - runtime_file = open(runtime_filename, 'a') - - for j in range(len(listID)): - g1 = listID[i] - g2 = listID[j] - gedlibpy.run_method(g1, g2) - upper_bound = gedlibpy.get_upper_bound(g1, g2) - runtime = gedlibpy.get_runtime(g1, g2) - ged_mat[i][j] = upper_bound - runtime_mat[i][j] = runtime - - # Write to files. - ged_file.write(str(int(upper_bound)) + ' ') - runtime_file.write(str(runtime) + ' ') - - ged_file.write('\n') - runtime_file.write('\n') - - ged_file.close() - runtime_file.close() - - print('ged_mat') - print(ged_mat) - print('runtime_mat:') - print(runtime_mat) - - return - - -def test_ged_best_settings(): - """Test ged computation with best settings the same as in the C++ code. - """ - - data_dir_prefix = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/' - collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/gxl/monoterpenoides.xml' - graph_dir = data_dir_prefix +'generated_datsets/monoterpenoides/gxl/' - - algo_options = '--threads 6 --initial-solutions 10 --ratio-runs-from-initial-solutions .5' - - for repeat in range(0, 3): - # Generate the result file. - ged_filename = data_dir_prefix + 'output/test_ged/ged_mat_python_best_settings_' + str(repeat) + '.txt' - runtime_filename = data_dir_prefix + 'output/test_ged/runtime_mat_python_best_settings_' + str(repeat) + '.txt' - - ged_file = open(ged_filename, 'a') - runtime_file = open(runtime_filename, 'a') - - gedlibpy.restart_env() - gedlibpy.load_GXL_graphs(graph_dir, collection_file) - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost('CONSTANT', [3.0, 3.0, 1.0, 3.0, 3.0, 1.0]) - gedlibpy.init() - gedlibpy.set_method("IPFP", algo_options) - gedlibpy.init_method() - - ged_mat = np.empty((len(listID), len(listID))) - runtime_mat = np.empty((len(listID), len(listID))) - - for i in tqdm(range(len(listID)), desc='computing GEDs', file=sys.stdout): - for j in range(len(listID)): - g1 = listID[i] - g2 = listID[j] - gedlibpy.run_method(g1, g2) - upper_bound = gedlibpy.get_upper_bound(g1, g2) - runtime = gedlibpy.get_runtime(g1, g2) - ged_mat[i][j] = upper_bound - runtime_mat[i][j] = runtime - - # Write to files. - ged_file.write(str(int(upper_bound)) + ' ') - runtime_file.write(str(runtime) + ' ') - - ged_file.write('\n') - runtime_file.write('\n') - - ged_file.close() - runtime_file.close() - - print('ged_mat') - print(ged_mat) - print('runtime_mat:') - print(runtime_mat) - - return - - - -def test_ged_default(): - """Test ged computation with default settings. - """ - - data_dir_prefix = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/' - collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/gxl/monoterpenoides.xml' - graph_dir = data_dir_prefix +'generated_datsets/monoterpenoides/gxl/' - - for repeat in range(3): - # Generate the result file. - ged_filename = data_dir_prefix + 'output/test_ged/ged_mat_python_default_' + str(repeat) + '.txt' - runtime_filename = data_dir_prefix + 'output/test_ged/runtime_mat_python_default_' + str(repeat) + '.txt' - - ged_file = open(ged_filename, 'a') - runtime_file = open(runtime_filename, 'a') - - gedlibpy.restart_env() - gedlibpy.load_GXL_graphs(graph_dir, collection_file) - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost('CONSTANT', [3.0, 3.0, 1.0, 3.0, 3.0, 1.0]) - gedlibpy.init() - gedlibpy.set_method("IPFP", "") - gedlibpy.init_method() - - ged_mat = np.empty((len(listID), len(listID))) - runtime_mat = np.empty((len(listID), len(listID))) - - for i in tqdm(range(len(listID)), desc='computing GEDs', file=sys.stdout): - for j in range(len(listID)): - g1 = listID[i] - g2 = listID[j] - gedlibpy.run_method(g1, g2) - upper_bound = gedlibpy.get_upper_bound(g1, g2) - runtime = gedlibpy.get_runtime(g1, g2) - ged_mat[i][j] = upper_bound - runtime_mat[i][j] = runtime - - # Write to files. - ged_file.write(str(int(upper_bound)) + ' ') - runtime_file.write(str(runtime) + ' ') - - ged_file.write('\n') - runtime_file.write('\n') - - ged_file.close() - runtime_file.close() - - print('ged_mat') - print(ged_mat) - print('runtime_mat:') - print(runtime_mat) - - return - - -def test_ged_min(): - """Test ged computation with the "min" stabilizer. - """ - from gklearn.utils.graphfiles import loadDataset - from gklearn.preimage.ged import GED - - data_dir_prefix = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/' - collection_file = data_dir_prefix + 'generated_datsets/monoterpenoides/gxl/monoterpenoides.xml' - graph_dir = data_dir_prefix +'generated_datsets/monoterpenoides/gxl/' - - Gn, y = loadDataset(collection_file, extra_params=graph_dir) - -# algo_options = '--threads 6 --initial-solutions 10 --ratio-runs-from-initial-solutions .5' - - for repeat in range(0, 3): - # Generate the result file. - ged_filename = data_dir_prefix + 'output/test_ged/ged_mat_python_min_' + str(repeat) + '.txt' -# runtime_filename = data_dir_prefix + 'output/test_ged/runtime_mat_python_min_' + str(repeat) + '.txt' - - ged_file = open(ged_filename, 'a') -# runtime_file = open(runtime_filename, 'a') - - ged_mat = np.empty((len(Gn), len(Gn))) -# runtime_mat = np.empty((len(Gn), len(Gn))) - - for i in tqdm(range(len(Gn)), desc='computing GEDs', file=sys.stdout): - for j in range(len(Gn)): - g1 = Gn[i] - g2 = Gn[j] - upper_bound, _, _ = GED(g1, g2, lib='gedlibpy', cost='CONSTANT', - method='IPFP', - edit_cost_constant=[3.0, 3.0, 1.0, 3.0, 3.0, 1.0], - stabilizer='min', repeat=10) -# runtime = gedlibpy.get_runtime(g1, g2) - ged_mat[i][j] = upper_bound -# runtime_mat[i][j] = runtime - - # Write to files. - ged_file.write(str(int(upper_bound)) + ' ') -# runtime_file.write(str(runtime) + ' ') - - ged_file.write('\n') -# runtime_file.write('\n') - - ged_file.close() -# runtime_file.close() - - print('ged_mat') - print(ged_mat) -# print('runtime_mat:') -# print(runtime_mat) - - return - - -def init() : - print("List of Edit Cost Options : ") - for i in gedlibpy.list_of_edit_cost_options : - print (i) - print("") - - print("List of Method Options : ") - for j in gedlibpy.list_of_method_options : - print (j) - print("") - - print("List of Init Options : ") - for k in gedlibpy.list_of_init_options : - print (k) - print("") - - - - -def convertGraph(G): - G_new = nx.Graph() - for nd, attrs in G.nodes(data=True): - G_new.add_node(str(nd), chem=attrs['atom']) - for nd1, nd2, attrs in G.edges(data=True): - G_new.add_edge(str(nd1), str(nd2), valence=attrs['bond_type']) - - return G_new - - -def testNxGrapĥ(): - from gklearn.utils.graphfiles import loadDataset - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - - gedlibpy.restart_env() - for graph in Gn: - g_new = convertGraph(graph) - gedlibpy.add_nx_graph(g_new, "") - - listID = gedlibpy.get_all_graph_ids() - gedlibpy.set_edit_cost("CHEM_1") - gedlibpy.init() - gedlibpy.set_method("IPFP", "") - gedlibpy.init_method() - - print(listID) - g = listID[0] - h = listID[1] - - gedlibpy.run_method(g, h) - - print("Node Map : ", gedlibpy.get_node_map(g, h)) - print("Forward map : " , gedlibpy.get_forward_map(g, h), ", Backward map : ", gedlibpy.get_backward_map(g, h)) - print ("Upper Bound = " + str(gedlibpy.get_upper_bound(g, h)) + ", Lower Bound = " + str(gedlibpy.get_lower_bound(g, h)) + ", Runtime = " + str(gedlibpy.get_runtime(g, h))) - -if __name__ == '__main__': -# test_ged_default() -# test_ged_min() -# test_ged_best_settings() -# test_ged_best_settings_updated() -# test_ged_python_bash_cpp() -# test_get_nb_edit_operations() -# test_get_nb_edit_operations_letter() -# test_LETTER2_cost() - test_NON_SYMBOLIC_cost() - - - #init() - #testNxGrapĥ() diff --git a/gklearn/preimage/test_iam.py b/gklearn/preimage/test_iam.py deleted file mode 100644 index 5897f50..0000000 --- a/gklearn/preimage/test_iam.py +++ /dev/null @@ -1,964 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Sep 5 15:59:00 2019 - -@author: ljia -""" - -import numpy as np -import networkx as nx -import matplotlib.pyplot as plt -import time -import random -#from tqdm import tqdm - -from gklearn.utils.graphfiles import loadDataset -#from gklearn.utils.logger2file import * -from gklearn.preimage.iam import iam_upgraded -from gklearn.preimage.utils import remove_edges, compute_kernel, get_same_item_indices, dis_gstar -#from gklearn.preimage.ged import ged_median - - -def test_iam_monoterpenoides_with_init40(): - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - # unfitted edit costs. - c_vi = 3 - c_vr = 3 - c_vs = 1 - c_ei = 3 - c_er = 3 - c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.0001 - removeNodes = False - connected_iam = False - # parameters for IAM function -# ged_cost = 'CONSTANT' - ged_cost = 'CONSTANT' - ged_method = 'IPFP' - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] - ged_stabilizer = None -# ged_repeat = 50 - algo_options = '--threads 8 --initial-solutions 40 --ratio-runs-from-initial-solutions 1' - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'algo_options': algo_options, - 'stabilizer': ged_stabilizer} - - - collection_path = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/monoterpenoides/' - graph_dir = collection_path + 'gxl/' - y_all = ['3', '1', '4', '6', '7', '8', '9', '2'] - repeats = 50 - - # classify graphs according to classes. - time_list = [] - dis_ks_min_list = [] - dis_ks_set_median_list = [] - sod_gs_list = [] - g_best = [] - sod_set_median_list = [] - sod_list_list = [] - for y in y_all: - print('\n-------------------------------------------------------') - print('class of y:', y) - - time_list.append([]) - dis_ks_min_list.append([]) - dis_ks_set_median_list.append([]) - sod_gs_list.append([]) - g_best.append([]) - sod_set_median_list.append([]) - - for repeat in range(repeats): - # load median set. - collection_file = collection_path + 'monoterpenoides_' + y + '_' + str(repeat) + '.xml' - Gn_median, _ = loadDataset(collection_file, extra_params=graph_dir) - Gn_candidate = [g.copy() for g in Gn_median] - - time0 = time.time() - G_gen_median_list, sod_gen_median, sod_list, G_set_median_list, sod_set_median \ - = iam_upgraded(Gn_median, - Gn_candidate, c_ei=c_ei, c_er=c_er, c_es=c_es, ite_max=ite_max_iam, - epsilon=epsilon_iam, node_label=node_label, edge_label=edge_label, - connected=connected_iam, removeNodes=removeNodes, - params_ged=params_ged) - time_total = time.time() - time0 - print('\ntime: ', time_total) - time_list[-1].append(time_total) - g_best[-1].append(G_gen_median_list[0]) - sod_set_median_list[-1].append(sod_set_median) - print('\nsmallest sod of the set median:', sod_set_median) - sod_gs_list[-1].append(sod_gen_median) - print('\nsmallest sod in graph space:', sod_gen_median) - sod_list_list.append(sod_list) - -# # show the best graph and save it to file. -# print('one of the possible corresponding pre-images is') -# nx.draw(G_gen_median_list[0], labels=nx.get_node_attributes(G_gen_median_list[0], 'atom'), -# with_labels=True) -## plt.show() -# # plt.savefig('results/iam/mutag_median.fit_costs2.001.nb' + str(nb_median) + -## plt.savefig('results/iam/paper_compare/monoter_y' + str(y_class) + -## '_repeat' + str(repeat) + '_' + str(time.time()) + -## '.png', format="PNG") -# plt.clf() -# # print(G_gen_median_list[0].nodes(data=True)) -# # print(G_gen_median_list[0].edges(data=True)) - - print('\nsods of the set median for this class:', sod_set_median_list[-1]) - print('\nsods in graph space for this class:', sod_gs_list[-1]) -# print('\ndistance in kernel space of set median for this class:', -# dis_ks_set_median_list[-1]) -# print('\nsmallest distances in kernel space for this class:', -# dis_ks_min_list[-1]) - print('\ntimes for this class:', time_list[-1]) - - sod_set_median_list[-1] = np.mean(sod_set_median_list[-1]) - sod_gs_list[-1] = np.mean(sod_gs_list[-1]) -# dis_ks_set_median_list[-1] = np.mean(dis_ks_set_median_list[-1]) -# dis_ks_min_list[-1] = np.mean(dis_ks_min_list[-1]) - time_list[-1] = np.mean(time_list[-1]) - - print() - print('\nmean sods of the set median for each class:', sod_set_median_list) - print('\nmean sods in graph space for each class:', sod_gs_list) -# print('\ndistances in kernel space of set median for each class:', -# dis_ks_set_median_list) -# print('\nmean smallest distances in kernel space for each class:', -# dis_ks_min_list) - print('\nmean times for each class:', time_list) - - print('\nmean sods of the set median of all:', np.mean(sod_set_median_list)) - print('\nmean sods in graph space of all:', np.mean(sod_gs_list)) -# print('\nmean distances in kernel space of set median of all:', -# np.mean(dis_ks_set_median_list)) -# print('\nmean smallest distances in kernel space of all:', -# np.mean(dis_ks_min_list)) - print('\nmean times of all:', np.mean(time_list)) - - - - -def test_iam_monoterpenoides(): - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - - # parameters for GED function from the IAM paper. - # fitted edit costs (Gaussian). - c_vi = 0.03620133402089074 - c_vr = 0.0417574590207099 - c_vs = 0.009992282328587499 - c_ei = 0.08293120042342755 - c_er = 0.09512220476358019 - c_es = 0.09222529696841467 -# # fitted edit costs (linear combinations). -# c_vi = 0.1749684054238749 -# c_vr = 0.0734054228711457 -# c_vs = 0.05017781726016715 -# c_ei = 0.1869431164806936 -# c_er = 0.32055856948274 -# c_es = 0.2569469379247611 -# # unfitted edit costs. -# c_vi = 3 -# c_vr = 3 -# c_vs = 1 -# c_ei = 3 -# c_er = 3 -# c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = False - connected_iam = False - # parameters for IAM function -# ged_cost = 'CONSTANT' - ged_cost = 'CONSTANT' - ged_method = 'IPFP' - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] -# edit_cost_constant = [] - ged_stabilizer = 'min' - ged_repeat = 50 - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # classify graphs according to letters. - time_list = [] - dis_ks_min_list = [] - dis_ks_set_median_list = [] - sod_gs_list = [] - g_best = [] - sod_set_median_list = [] - sod_list_list = [] - idx_dict = get_same_item_indices(y_all) - for y_class in idx_dict: - print('\n-------------------------------------------------------') - print('class of y:', y_class) - Gn_class = [Gn[i].copy() for i in idx_dict[y_class]] - - time_list.append([]) - dis_ks_min_list.append([]) - dis_ks_set_median_list.append([]) - sod_gs_list.append([]) - g_best.append([]) - sod_set_median_list.append([]) - - for repeat in range(50): - idx_rdm = random.sample(range(len(Gn_class)), 10) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn_class[idx].copy() for idx in idx_rdm] - Gn_candidate = [g.copy() for g in Gn_median] - - alpha_range = [1 / len(Gn_median)] * len(Gn_median) - time0 = time.time() - G_gen_median_list, sod_gen_median, sod_list, G_set_median_list, sod_set_median \ - = iam_upgraded(Gn_median, - Gn_candidate, c_ei=c_ei, c_er=c_er, c_es=c_es, ite_max=ite_max_iam, - epsilon=epsilon_iam, connected=connected_iam, removeNodes=removeNodes, - params_ged=params_ged) - time_total = time.time() - time0 - print('\ntime: ', time_total) - time_list[-1].append(time_total) - g_best[-1].append(G_gen_median_list[0]) - sod_set_median_list[-1].append(sod_set_median) - print('\nsmallest sod of the set median:', sod_set_median) - sod_gs_list[-1].append(sod_gen_median) - print('\nsmallest sod in graph space:', sod_gen_median) - sod_list_list.append(sod_list) - - # show the best graph and save it to file. - print('one of the possible corresponding pre-images is') - nx.draw(G_gen_median_list[0], labels=nx.get_node_attributes(G_gen_median_list[0], 'atom'), - with_labels=True) -# plt.show() - # plt.savefig('results/iam/mutag_median.fit_costs2.001.nb' + str(nb_median) + -# plt.savefig('results/iam/paper_compare/monoter_y' + str(y_class) + -# '_repeat' + str(repeat) + '_' + str(time.time()) + -# '.png', format="PNG") - plt.clf() - # print(G_gen_median_list[0].nodes(data=True)) - # print(G_gen_median_list[0].edges(data=True)) - - - # compute distance between \psi and the set median graph. - knew_set_median = compute_kernel(G_set_median_list + Gn_median, - gkernel, node_label, edge_label, False) - dhat_new_set_median_list = [] - for idx, g_tmp in enumerate(G_set_median_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_set_median_list.append(dis_gstar(idx, range(len(G_set_median_list), - len(G_set_median_list) + len(Gn_median) + 1), - alpha_range, knew_set_median, withterm3=False)) - - print('\ndistance in kernel space of set median: ', dhat_new_set_median_list[0]) - dis_ks_set_median_list[-1].append(dhat_new_set_median_list[0]) - - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(G_gen_median_list + Gn_median, gkernel, node_label, - edge_label, False) - dhat_new_list = [] - for idx, g_tmp in enumerate(G_gen_median_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(G_gen_median_list), - len(G_gen_median_list) + len(Gn_median) + 1), - alpha_range, knew, withterm3=False)) - - print('\nsmallest distance in kernel space: ', dhat_new_list[0]) - dis_ks_min_list[-1].append(dhat_new_list[0]) - - - print('\nsods of the set median for this class:', sod_set_median_list[-1]) - print('\nsods in graph space for this class:', sod_gs_list[-1]) - print('\ndistance in kernel space of set median for this class:', - dis_ks_set_median_list[-1]) - print('\nsmallest distances in kernel space for this class:', - dis_ks_min_list[-1]) - print('\ntimes for this class:', time_list[-1]) - - sod_set_median_list[-1] = np.mean(sod_set_median_list[-1]) - sod_gs_list[-1] = np.mean(sod_gs_list[-1]) - dis_ks_set_median_list[-1] = np.mean(dis_ks_set_median_list[-1]) - dis_ks_min_list[-1] = np.mean(dis_ks_min_list[-1]) - time_list[-1] = np.mean(time_list[-1]) - - print() - print('\nmean sods of the set median for each class:', sod_set_median_list) - print('\nmean sods in graph space for each class:', sod_gs_list) - print('\ndistances in kernel space of set median for each class:', - dis_ks_set_median_list) - print('\nmean smallest distances in kernel space for each class:', - dis_ks_min_list) - print('\nmean times for each class:', time_list) - - print('\nmean sods of the set median of all:', np.mean(sod_set_median_list)) - print('\nmean sods in graph space of all:', np.mean(sod_gs_list)) - print('\nmean distances in kernel space of set median of all:', - np.mean(dis_ks_set_median_list)) - print('\nmean smallest distances in kernel space of all:', - np.mean(dis_ks_min_list)) - print('\nmean times of all:', np.mean(time_list)) - - nb_better_sods = 0 - nb_worse_sods = 0 - nb_same_sods = 0 - for sods in sod_list_list: - if sods[0] > sods[-1]: - nb_better_sods += 1 - elif sods[0] < sods[-1]: - nb_worse_sods += 1 - else: - nb_same_sods += 1 - print('\n In', str(len(sod_list_list)), 'sod lists,', str(nb_better_sods), - 'are getting better,', str(nb_worse_sods), 'are getting worse,', - str(nb_same_sods), 'are not changed; ', str(nb_better_sods / len(sod_list_list)), - 'sods are improved.') - - -def test_iam_mutag(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - - # parameters for GED function from the IAM paper. - # fitted edit costs. - c_vi = 0.03523843108436513 - c_vr = 0.03347339739350128 - c_vs = 0.06871290673612238 - c_ei = 0.08591999846720685 - c_er = 0.07962086440894103 - c_es = 0.08596855855478233 - # unfitted edit costs. -# c_vi = 3 -# c_vr = 3 -# c_vs = 1 -# c_ei = 3 -# c_er = 3 -# c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = False - connected_iam = False - # parameters for IAM function -# ged_cost = 'CONSTANT' - ged_cost = 'CONSTANT' - ged_method = 'IPFP' - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] -# edit_cost_constant = [] - ged_stabilizer = 'min' - ged_repeat = 50 - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # classify graphs according to letters. - time_list = [] - dis_ks_min_list = [] - dis_ks_set_median_list = [] - sod_gs_list = [] - g_best = [] - sod_set_median_list = [] - sod_list_list = [] - idx_dict = get_same_item_indices(y_all) - for y_class in idx_dict: - print('\n-------------------------------------------------------') - print('class of y:', y_class) - Gn_class = [Gn[i].copy() for i in idx_dict[y_class]] - - time_list.append([]) - dis_ks_min_list.append([]) - dis_ks_set_median_list.append([]) - sod_gs_list.append([]) - g_best.append([]) - sod_set_median_list.append([]) - - for repeat in range(50): - idx_rdm = random.sample(range(len(Gn_class)), 10) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn_class[idx].copy() for idx in idx_rdm] - Gn_candidate = [g.copy() for g in Gn_median] - - alpha_range = [1 / len(Gn_median)] * len(Gn_median) - time0 = time.time() - G_gen_median_list, sod_gen_median, sod_list, G_set_median_list, sod_set_median \ - = iam_upgraded(Gn_median, - Gn_candidate, c_ei=c_ei, c_er=c_er, c_es=c_es, ite_max=ite_max_iam, - epsilon=epsilon_iam, connected=connected_iam, removeNodes=removeNodes, - params_ged=params_ged) - time_total = time.time() - time0 - print('\ntime: ', time_total) - time_list[-1].append(time_total) - g_best[-1].append(G_gen_median_list[0]) - sod_set_median_list[-1].append(sod_set_median) - print('\nsmallest sod of the set median:', sod_set_median) - sod_gs_list[-1].append(sod_gen_median) - print('\nsmallest sod in graph space:', sod_gen_median) - sod_list_list.append(sod_list) - - # show the best graph and save it to file. - print('one of the possible corresponding pre-images is') - nx.draw(G_gen_median_list[0], labels=nx.get_node_attributes(G_gen_median_list[0], 'atom'), - with_labels=True) -# plt.show() - # plt.savefig('results/iam/mutag_median.fit_costs2.001.nb' + str(nb_median) + -# plt.savefig('results/iam/paper_compare/mutag_y' + str(y_class) + -# '_repeat' + str(repeat) + '_' + str(time.time()) + -# '.png', format="PNG") - plt.clf() - # print(G_gen_median_list[0].nodes(data=True)) - # print(G_gen_median_list[0].edges(data=True)) - - - # compute distance between \psi and the set median graph. - knew_set_median = compute_kernel(G_set_median_list + Gn_median, - gkernel, node_label, edge_label, False) - dhat_new_set_median_list = [] - for idx, g_tmp in enumerate(G_set_median_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_set_median_list.append(dis_gstar(idx, range(len(G_set_median_list), - len(G_set_median_list) + len(Gn_median) + 1), - alpha_range, knew_set_median, withterm3=False)) - - print('\ndistance in kernel space of set median: ', dhat_new_set_median_list[0]) - dis_ks_set_median_list[-1].append(dhat_new_set_median_list[0]) - - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(G_gen_median_list + Gn_median, gkernel, node_label, - edge_label, False) - dhat_new_list = [] - for idx, g_tmp in enumerate(G_gen_median_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(G_gen_median_list), - len(G_gen_median_list) + len(Gn_median) + 1), - alpha_range, knew, withterm3=False)) - - print('\nsmallest distance in kernel space: ', dhat_new_list[0]) - dis_ks_min_list[-1].append(dhat_new_list[0]) - - - print('\nsods of the set median for this class:', sod_set_median_list[-1]) - print('\nsods in graph space for this class:', sod_gs_list[-1]) - print('\ndistance in kernel space of set median for this class:', - dis_ks_set_median_list[-1]) - print('\nsmallest distances in kernel space for this class:', - dis_ks_min_list[-1]) - print('\ntimes for this class:', time_list[-1]) - - sod_set_median_list[-1] = np.mean(sod_set_median_list[-1]) - sod_gs_list[-1] = np.mean(sod_gs_list[-1]) - dis_ks_set_median_list[-1] = np.mean(dis_ks_set_median_list[-1]) - dis_ks_min_list[-1] = np.mean(dis_ks_min_list[-1]) - time_list[-1] = np.mean(time_list[-1]) - - print() - print('\nmean sods of the set median for each class:', sod_set_median_list) - print('\nmean sods in graph space for each class:', sod_gs_list) - print('\ndistances in kernel space of set median for each class:', - dis_ks_set_median_list) - print('\nmean smallest distances in kernel space for each class:', - dis_ks_min_list) - print('\nmean times for each class:', time_list) - - print('\nmean sods of the set median of all:', np.mean(sod_set_median_list)) - print('\nmean sods in graph space of all:', np.mean(sod_gs_list)) - print('\nmean distances in kernel space of set median of all:', - np.mean(dis_ks_set_median_list)) - print('\nmean smallest distances in kernel space of all:', - np.mean(dis_ks_min_list)) - print('\nmean times of all:', np.mean(time_list)) - - nb_better_sods = 0 - nb_worse_sods = 0 - nb_same_sods = 0 - for sods in sod_list_list: - if sods[0] > sods[-1]: - nb_better_sods += 1 - elif sods[0] < sods[-1]: - nb_worse_sods += 1 - else: - nb_same_sods += 1 - print('\n In', str(len(sod_list_list)), 'sod lists,', str(nb_better_sods), - 'are getting better,', str(nb_worse_sods), 'are getting worse,', - str(nb_same_sods), 'are not changed; ', str(nb_better_sods / len(sod_list_list)), - 'sods are improved.') - - -############################################################################### -# tests on different numbers of median-sets. - -def test_iam_median_nb(): - - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility -# # parameters for GED function -# c_vi = 0.037 -# c_vr = 0.038 -# c_vs = 0.075 -# c_ei = 0.001 -# c_er = 0.001 -# c_es = 0.0 -# ite_max_iam = 50 -# epsilon_iam = 0.001 -# removeNodes = False -# connected_iam = False -# # parameters for IAM function -# ged_cost = 'CONSTANT' -# ged_method = 'IPFP' -# edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] -# ged_stabilizer = 'min' -# ged_repeat = 50 -# params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, -# 'edit_cost_constant': edit_cost_constant, -# 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # parameters for GED function - c_vi = 4 - c_vr = 4 - c_vs = 2 - c_ei = 1 - c_er = 1 - c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = False - connected_iam = False - # parameters for IAM function - ged_cost = 'CHEM_1' - ged_method = 'IPFP' - edit_cost_constant = [] - ged_stabilizer = 'min' - ged_repeat = 50 - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - - # number of graphs; we what to compute the median of these graphs. -# nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - nb_median_range = [len(Gn)] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] -# sod_gs_min_list = [] -# nb_updated_list = [] -# nb_updated_k_list = [] - g_best = [] - for nb_median in nb_median_range: - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - Gn_candidate = [g.copy() for g in Gn] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### -# gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') -# km_tmp = gmfile['gm'] -# time_km = gmfile['gmtime'] -# # modify mixed gram matrix. -# km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) -# for i in range(len(Gn)): -# for j in range(i, len(Gn)): -# km[i, j] = km_tmp[i, j] -# km[j, i] = km[i, j] -# for i in range(len(Gn)): -# for j, idx in enumerate(idx_rdm): -# km[i, len(Gn) + j] = km[i, idx] -# km[len(Gn) + j, i] = km[i, idx] -# for i, idx1 in enumerate(idx_rdm): -# for j, idx2 in enumerate(idx_rdm): -# km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - time0 = time.time() - ghat_new_list, sod_min = iam_upgraded(Gn_median, Gn_candidate, - c_ei=c_ei, c_er=c_er, c_es=c_es, ite_max=ite_max_iam, - epsilon=epsilon_iam, connected=connected_iam, removeNodes=removeNodes, - params_ged=params_ged) - - time_total = time.time() - time0 - print('\ntime: ', time_total) - time_list.append(time_total) - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(ghat_new_list + Gn_median, gkernel, False) - dhat_new_list = [] - for idx, g_tmp in enumerate(ghat_new_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(ghat_new_list), - len(ghat_new_list) + len(Gn_median) + 1), - alpha_range, knew, withterm3=False)) - - print('\nsmallest distance in kernel space: ', dhat_new_list[0]) - dis_ks_min_list.append(dhat_new_list[0]) - g_best.append(ghat_new_list[0]) - - # show the best graph and save it to file. -# print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat_new_list[0], labels=nx.get_node_attributes(ghat_new_list[0], 'atom'), - with_labels=True) - plt.show() -# plt.savefig('results/iam/mutag_median.fit_costs2.001.nb' + str(nb_median) + - plt.savefig('results/iam/mutag_median_unfit2.nb' + str(nb_median) + - '.png', format="PNG") - plt.clf() -# print(ghat_list[0].nodes(data=True)) -# print(ghat_list[0].edges(data=True)) - - sod_gs_list.append(sod_min) -# sod_gs_min_list.append(np.min(sod_min)) - print('\nsmallest sod in graph space: ', sod_min) - - print('\nsods in graph space: ', sod_gs_list) -# print('\nsmallest sod in graph space for each set of median graphs: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs: ', - dis_ks_min_list) -# print('\nnumber of updates of the best graph for each set of median graphs by IAM: ', -# nb_updated_list) -# print('\nnumber of updates of k nearest graphs for each set of median graphs by IAM: ', -# nb_updated_k_list) - print('\ntimes:', time_list) - - -def test_iam_letter_h(): - from median import draw_Letter_graph - ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', - 'extra_params': {}} # node nsymb -# ds = {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt', -# 'extra_params': {}} # node nsymb -# Gn = Gn[0:50] - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - gkernel = 'structuralspkernel' - - # parameters for GED function from the IAM paper. - c_vi = 3 - c_vr = 3 - c_vs = 1 - c_ei = 3 - c_er = 3 - c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = False - connected_iam = False - # parameters for IAM function -# ged_cost = 'CONSTANT' - ged_cost = 'LETTER' - ged_method = 'IPFP' -# edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] - edit_cost_constant = [] - ged_stabilizer = 'min' - ged_repeat = 50 - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # classify graphs according to letters. - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - g_best = [] - sod_set_median_list = [] - idx_dict = get_same_item_indices(y_all) - for letter in idx_dict: - print('\n-------------------------------------------------------') - print('letter', letter) - Gn_let = [Gn[i].copy() for i in idx_dict[letter]] - - time_list.append([]) - dis_ks_min_list.append([]) - sod_gs_list.append([]) - g_best.append([]) - sod_set_median_list.append([]) - - for repeat in range(50): - idx_rdm = random.sample(range(len(Gn_let)), 50) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn_let[idx].copy() for idx in idx_rdm] - Gn_candidate = [g.copy() for g in Gn_median] - - alpha_range = [1 / len(Gn_median)] * len(Gn_median) - time0 = time.time() - ghat_new_list, sod_min, sod_set_median = iam_upgraded(Gn_median, - Gn_candidate, c_ei=c_ei, c_er=c_er, c_es=c_es, ite_max=ite_max_iam, - epsilon=epsilon_iam, connected=connected_iam, removeNodes=removeNodes, - params_ged=params_ged) - time_total = time.time() - time0 - print('\ntime: ', time_total) - time_list[-1].append(time_total) - g_best[-1].append(ghat_new_list[0]) - sod_set_median_list[-1].append(sod_set_median) - print('\nsmallest sod of the set median:', sod_set_median) - sod_gs_list[-1].append(sod_min) - print('\nsmallest sod in graph space:', sod_min) - - # show the best graph and save it to file. - print('one of the possible corresponding pre-images is') - draw_Letter_graph(ghat_new_list[0], savepath='results/iam/paper_compare/') - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(ghat_new_list + Gn_median, gkernel, False) - dhat_new_list = [] - for idx, g_tmp in enumerate(ghat_new_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(ghat_new_list), - len(ghat_new_list) + len(Gn_median) + 1), - alpha_range, knew, withterm3=False)) - - print('\nsmallest distance in kernel space: ', dhat_new_list[0]) - dis_ks_min_list[-1].append(dhat_new_list[0]) - - print('\nsods of the set median for this letter:', sod_set_median_list[-1]) - print('\nsods in graph space for this letter:', sod_gs_list[-1]) - print('\nsmallest distances in kernel space for this letter:', - dis_ks_min_list[-1]) - print('\ntimes for this letter:', time_list[-1]) - - sod_set_median_list[-1] = np.mean(sod_set_median_list[-1]) - sod_gs_list[-1] = np.mean(sod_gs_list[-1]) - dis_ks_min_list[-1] = np.mean(dis_ks_min_list[-1]) - time_list[-1] = np.mean(time_list[-1]) - - print('\nmean sods of the set median for each letter:', sod_set_median_list) - print('\nmean sods in graph space for each letter:', sod_gs_list) - print('\nmean smallest distances in kernel space for each letter:', - dis_ks_min_list) - print('\nmean times for each letter:', time_list) - - print('\nmean sods of the set median of all:', np.mean(sod_set_median_list)) - print('\nmean sods in graph space of all:', np.mean(sod_gs_list)) - print('\nmean smallest distances in kernel space of all:', - np.mean(dis_ks_min_list)) - print('\nmean times of all:', np.mean(time_list)) - - - - - - - - - -def test_iam_fitdistance(): - - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] -# remove_edges(Gn) - gkernel = 'marginalizedkernel' - node_label = 'atom' - edge_label = 'bond_type' - -# lmbda = 0.03 # termination probalility -# # parameters for GED function -# c_vi = 0.037 -# c_vr = 0.038 -# c_vs = 0.075 -# c_ei = 0.001 -# c_er = 0.001 -# c_es = 0.0 -# ite_max_iam = 50 -# epsilon_iam = 0.001 -# removeNodes = False -# connected_iam = False -# # parameters for IAM function -# ged_cost = 'CONSTANT' -# ged_method = 'IPFP' -# edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] -# ged_stabilizer = 'min' -# ged_repeat = 50 -# params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, -# 'edit_cost_constant': edit_cost_constant, -# 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # parameters for GED function - c_vi = 4 - c_vr = 4 - c_vs = 2 - c_ei = 1 - c_er = 1 - c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = False - connected_iam = False - # parameters for IAM function - ged_cost = 'CHEM_1' - ged_method = 'IPFP' - edit_cost_constant = [] - ged_stabilizer = 'min' - ged_repeat = 50 - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - - # number of graphs; we what to compute the median of these graphs. -# nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - nb_median_range = [10] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - time_list = [] - dis_ks_min_list = [] - dis_ks_gen_median_list = [] - sod_gs_list = [] -# sod_gs_min_list = [] -# nb_updated_list = [] -# nb_updated_k_list = [] - g_best = [] - for nb_median in nb_median_range: - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - Gn_candidate = [g.copy() for g in Gn_median] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### -# gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') -# km_tmp = gmfile['gm'] -# time_km = gmfile['gmtime'] -# # modify mixed gram matrix. -# km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) -# for i in range(len(Gn)): -# for j in range(i, len(Gn)): -# km[i, j] = km_tmp[i, j] -# km[j, i] = km[i, j] -# for i in range(len(Gn)): -# for j, idx in enumerate(idx_rdm): -# km[i, len(Gn) + j] = km[i, idx] -# km[len(Gn) + j, i] = km[i, idx] -# for i, idx1 in enumerate(idx_rdm): -# for j, idx2 in enumerate(idx_rdm): -# km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - time0 = time.time() - G_gen_median_list, sod_gen_median, sod_list, G_set_median_list, sod_set_median \ - = iam_upgraded(Gn_median, Gn_candidate, - c_ei=c_ei, c_er=c_er, c_es=c_es, ite_max=ite_max_iam, - epsilon=epsilon_iam, connected=connected_iam, removeNodes=removeNodes, - params_ged=params_ged) - - time_total = time.time() - time0 - print('\ntime: ', time_total) - time_list.append(time_total) - - # compute distance between \psi and the new generated graphs. - knew = compute_kernel(G_gen_median_list + Gn_median, gkernel, node_label, - edge_label, False) - dhat_new_list = [] - for idx, g_tmp in enumerate(G_gen_median_list): - # @todo: the term3 below could use the one at the beginning of the function. - dhat_new_list.append(dis_gstar(idx, range(len(G_gen_median_list), - len(G_gen_median_list) + len(Gn_median) + 1), - alpha_range, knew, withterm3=False)) - - print('\nsmallest distance in kernel space: ', dhat_new_list[0]) - dis_ks_min_list.append(dhat_new_list[0]) - g_best.append(G_gen_median_list[0]) - - # show the best graph and save it to file. -# print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(G_gen_median_list[0], labels=nx.get_node_attributes(G_gen_median_list[0], 'atom'), - with_labels=True) - plt.show() -# plt.savefig('results/iam/mutag_median.fit_costs2.001.nb' + str(nb_median) + -# plt.savefig('results/iam/mutag_median_unfit2.nb' + str(nb_median) + -# '.png', format="PNG") - plt.clf() -# print(ghat_list[0].nodes(data=True)) -# print(ghat_list[0].edges(data=True)) - - sod_gs_list.append(sod_gen_median) -# sod_gs_min_list.append(np.min(sod_gen_median)) - print('\nsmallest sod in graph space: ', sod_gen_median) - print('\nsmallest sod of set median in graph space: ', sod_set_median) - - print('\nsods in graph space: ', sod_gs_list) -# print('\nsmallest sod in graph space for each set of median graphs: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs: ', - dis_ks_min_list) -# print('\nnumber of updates of the best graph for each set of median graphs by IAM: ', -# nb_updated_list) -# print('\nnumber of updates of k nearest graphs for each set of median graphs by IAM: ', -# nb_updated_k_list) - print('\ntimes:', time_list) - - - - - -############################################################################### - - -if __name__ == '__main__': -############################################################################### -# tests on different numbers of median-sets. -# test_iam_median_nb() -# test_iam_letter_h() -# test_iam_monoterpenoides() -# test_iam_mutag() - -# test_iam_fitdistance() -# print("test log") - - test_iam_monoterpenoides_with_init40() diff --git a/gklearn/preimage/test_k_closest_graphs.py b/gklearn/preimage/test_k_closest_graphs.py deleted file mode 100644 index 56971c7..0000000 --- a/gklearn/preimage/test_k_closest_graphs.py +++ /dev/null @@ -1,462 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Mon Dec 16 11:53:54 2019 - -@author: ljia -""" -import numpy as np -import math -import networkx as nx -import matplotlib.pyplot as plt -import time -import random -from tqdm import tqdm -from itertools import combinations, islice -import multiprocessing -from multiprocessing import Pool -from functools import partial - -from gklearn.utils.graphfiles import loadDataset, loadGXL -#from gklearn.utils.logger2file import * -from gklearn.preimage.iam import iam_upgraded, iam_bash -from gklearn.preimage.utils import compute_kernel, dis_gstar, kernel_distance_matrix -from gklearn.preimage.fitDistance import fit_GED_to_kernel_distance -#from gklearn.preimage.ged import ged_median - - -def fit_edit_cost_constants(fit_method, edit_cost_name, - edit_cost_constants=None, initial_solutions=1, - Gn_median=None, node_label=None, edge_label=None, - gkernel=None, dataset=None, init_ecc=None, - Gn=None, Kmatrix_median=None): - """fit edit cost constants. - """ - if fit_method == 'random': # random - if edit_cost_name == 'LETTER': - edit_cost_constants = random.sample(range(1, 10), 3) - edit_cost_constants = [item * 0.1 for item in edit_cost_constants] - elif edit_cost_name == 'LETTER2': - random.seed(time.time()) - edit_cost_constants = random.sample(range(1, 10), 5) -# edit_cost_constants = [item * 0.1 for item in edit_cost_constants] - elif edit_cost_name == 'NON_SYMBOLIC': - edit_cost_constants = random.sample(range(1, 10), 6) - if Gn_median[0].graph['node_attrs'] == []: - edit_cost_constants[2] = 0 - if Gn_median[0].graph['edge_attrs'] == []: - edit_cost_constants[5] = 0 - else: - edit_cost_constants = random.sample(range(1, 10), 6) - print('edit cost constants used:', edit_cost_constants) - elif fit_method == 'expert': # expert - if init_ecc is None: - if edit_cost_name == 'LETTER': - edit_cost_constants = [0.9, 1.7, 0.75] - elif edit_cost_name == 'LETTER2': - edit_cost_constants = [0.675, 0.675, 0.75, 0.425, 0.425] - else: - edit_cost_constants = [3, 3, 1, 3, 3, 1] - else: - edit_cost_constants = init_ecc - elif fit_method == 'k-graphs': - itr_max = 6 - if init_ecc is None: - if edit_cost_name == 'LETTER': - init_costs = [0.9, 1.7, 0.75] - elif edit_cost_name == 'LETTER2': - init_costs = [0.675, 0.675, 0.75, 0.425, 0.425] - elif edit_cost_name == 'NON_SYMBOLIC': - init_costs = [0, 0, 1, 1, 1, 0] - if Gn_median[0].graph['node_attrs'] == []: - init_costs[2] = 0 - if Gn_median[0].graph['edge_attrs'] == []: - init_costs[5] = 0 - else: - init_costs = [3, 3, 1, 3, 3, 1] - else: - init_costs = init_ecc - algo_options = '--threads 1 --initial-solutions ' \ - + str(initial_solutions) + ' --ratio-runs-from-initial-solutions 1' - params_ged = {'lib': 'gedlibpy', 'cost': edit_cost_name, 'method': 'IPFP', - 'algo_options': algo_options, 'stabilizer': None} - # fit on k-graph subset - edit_cost_constants, _, _, _, _, _, _ = fit_GED_to_kernel_distance(Gn_median, - node_label, edge_label, gkernel, itr_max, params_ged=params_ged, - init_costs=init_costs, dataset=dataset, Kmatrix=Kmatrix_median, - parallel=True) - elif fit_method == 'whole-dataset': - itr_max = 6 - if init_ecc is None: - if edit_cost_name == 'LETTER': - init_costs = [0.9, 1.7, 0.75] - elif edit_cost_name == 'LETTER2': - init_costs = [0.675, 0.675, 0.75, 0.425, 0.425] - else: - init_costs = [3, 3, 1, 3, 3, 1] - else: - init_costs = init_ecc - algo_options = '--threads 1 --initial-solutions ' \ - + str(initial_solutions) + ' --ratio-runs-from-initial-solutions 1' - params_ged = {'lib': 'gedlibpy', 'cost': edit_cost_name, 'method': 'IPFP', - 'algo_options': algo_options, 'stabilizer': None} - # fit on all subset - edit_cost_constants, _, _, _, _, _, _ = fit_GED_to_kernel_distance(Gn, - node_label, edge_label, gkernel, itr_max, params_ged=params_ged, - init_costs=init_costs, dataset=dataset, parallel=True) - elif fit_method == 'precomputed': - pass - - return edit_cost_constants - - -def compute_distances_to_true_median(Gn_median, fname_sm, fname_gm, - gkernel, edit_cost_name, - Kmatrix_median=None): - # reform graphs. - set_median = loadGXL(fname_sm) - gen_median = loadGXL(fname_gm) -# print(gen_median.nodes(data=True)) -# print(gen_median.edges(data=True)) - if edit_cost_name == 'LETTER' or edit_cost_name == 'LETTER2' or edit_cost_name == 'NON_SYMBOLIC': -# dataset == 'Fingerprint': -# for g in Gn_median: -# reform_attributes(g) - reform_attributes(set_median, Gn_median[0].graph['node_attrs'], - Gn_median[0].graph['edge_attrs']) - reform_attributes(gen_median, Gn_median[0].graph['node_attrs'], - Gn_median[0].graph['edge_attrs']) - - if edit_cost_name == 'LETTER' or edit_cost_name == 'LETTER2' or edit_cost_name == 'NON_SYMBOLIC': - node_label = None - edge_label = None - else: - node_label = 'chem' - edge_label = 'valence' - - # compute Gram matrix for median set. - if Kmatrix_median is None: - Kmatrix_median = compute_kernel(Gn_median, gkernel, node_label, edge_label, False) - - # compute distance in kernel space for set median. - kernel_sm = [] - for G_median in Gn_median: - km_tmp = compute_kernel([set_median, G_median], gkernel, node_label, edge_label, False) - kernel_sm.append(km_tmp[0, 1]) - Kmatrix_sm = np.concatenate((np.array([kernel_sm]), np.copy(Kmatrix_median)), axis=0) - Kmatrix_sm = np.concatenate((np.array([[km_tmp[0, 0]] + kernel_sm]).T, Kmatrix_sm), axis=1) -# Kmatrix_sm = compute_kernel([set_median] + Gn_median, gkernel, -# node_label, edge_label, False) - dis_k_sm = dis_gstar(0, range(1, 1+len(Gn_median)), - [1 / len(Gn_median)] * len(Gn_median), Kmatrix_sm, withterm3=False) -# print(gen_median.nodes(data=True)) -# print(gen_median.edges(data=True)) -# print(set_median.nodes(data=True)) -# print(set_median.edges(data=True)) - - # compute distance in kernel space for generalized median. - kernel_gm = [] - for G_median in Gn_median: - km_tmp = compute_kernel([gen_median, G_median], gkernel, node_label, edge_label, False) - kernel_gm.append(km_tmp[0, 1]) - Kmatrix_gm = np.concatenate((np.array([kernel_gm]), np.copy(Kmatrix_median)), axis=0) - Kmatrix_gm = np.concatenate((np.array([[km_tmp[0, 0]] + kernel_gm]).T, Kmatrix_gm), axis=1) -# Kmatrix_gm = compute_kernel([gen_median] + Gn_median, gkernel, -# node_label, edge_label, False) - dis_k_gm = dis_gstar(0, range(1, 1+len(Gn_median)), - [1 / len(Gn_median)] * len(Gn_median), Kmatrix_gm, withterm3=False) - - # compute distance in kernel space for each graph in median set. - dis_k_gi = [] - for idx in range(len(Gn_median)): - dis_k_gi.append(dis_gstar(idx+1, range(1, 1+len(Gn_median)), - [1 / len(Gn_median)] * len(Gn_median), Kmatrix_gm, withterm3=False)) - - print('dis_k_sm:', dis_k_sm) - print('dis_k_gm:', dis_k_gm) - print('dis_k_gi:', dis_k_gi) - idx_dis_k_gi_min = np.argmin(dis_k_gi) - dis_k_gi_min = dis_k_gi[idx_dis_k_gi_min] - print('min dis_k_gi:', dis_k_gi_min) - - return dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min, idx_dis_k_gi_min - - -def median_on_k_closest_graphs(Gn, node_label, edge_label, gkernel, k, fit_method, - graph_dir=None, initial_solutions=1, - edit_cost_constants=None, group_min=None, - dataset=None, edit_cost_name=None, init_ecc=None, - Kmatrix=None, parallel=True): -# dataset = dataset.lower() - -# # compute distances in kernel space. -# dis_mat, _, _, _ = kernel_distance_matrix(Gn, node_label, edge_label, -# Kmatrix=None, gkernel=gkernel) -# # ged. -# gmfile = np.load('results/test_k_closest_graphs/ged_mat.fit_on_whole_dataset.with_medians.gm.npz') -# ged_mat = gmfile['ged_mat'] -# dis_mat = ged_mat[0:len(Gn), 0:len(Gn)] - -# # choose k closest graphs -# time0 = time.time() -# sod_ks_min, group_min = get_closest_k_graphs(dis_mat, k, parallel) -# time_spent = time.time() - time0 -# print('closest graphs:', sod_ks_min, group_min) -# print('time spent:', time_spent) -# group_min = (12, 13, 22, 29) # closest w.r.t path kernel -# group_min = (77, 85, 160, 171) # closest w.r.t ged -# group_min = (0,1,2,3,4,5,6,7,8,9,10,11) # closest w.r.t treelet kernel - Gn_median = [Gn[g].copy() for g in group_min] - if Kmatrix is not None: - Kmatrix_median = np.copy(Kmatrix[group_min,:]) - Kmatrix_median = Kmatrix_median[:,group_min] - else: - Kmatrix_median = None - - - # 1. fit edit cost constants. - time0 = time.time() - edit_cost_constants = fit_edit_cost_constants(fit_method, edit_cost_name, - edit_cost_constants=edit_cost_constants, initial_solutions=initial_solutions, - Gn_median=Gn_median, node_label=node_label, edge_label=edge_label, - gkernel=gkernel, dataset=dataset, init_ecc=init_ecc, - Gn=Gn, Kmatrix_median=Kmatrix_median) - time_fitting = time.time() - time0 - - - # 2. compute set median and gen median using IAM (C++ through bash). - print('\nstart computing set median and gen median using IAM (C++ through bash)...\n') - group_fnames = [Gn[g].graph['filename'] for g in group_min] - time0 = time.time() - sod_sm, sod_gm, fname_sm, fname_gm = iam_bash(group_fnames, edit_cost_constants, - cost=edit_cost_name, initial_solutions=initial_solutions, - graph_dir=graph_dir, dataset=dataset) - time_generating = time.time() - time0 - print('\nmedians computed.\n') - - - # 3. compute distances to the true median. - print('\nstart computing distances to true median....\n') - Gn_median = [Gn[g].copy() for g in group_min] - dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min, idx_dis_k_gi_min = \ - compute_distances_to_true_median(Gn_median, fname_sm, fname_gm, - gkernel, edit_cost_name, - Kmatrix_median=Kmatrix_median) - idx_dis_k_gi_min = group_min[idx_dis_k_gi_min] - print('index min dis_k_gi:', idx_dis_k_gi_min) - print('sod_sm:', sod_sm) - print('sod_gm:', sod_gm) - - # collect return values. - return (sod_sm, sod_gm), \ - (dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min, idx_dis_k_gi_min), \ - (time_fitting, time_generating) - - -def reform_attributes(G, na_names=[], ea_names=[]): - if not na_names == []: - for node in G.nodes: - G.nodes[node]['attributes'] = [G.node[node][a_name] for a_name in na_names] - if not ea_names == []: - for edge in G.edges: - G.edges[edge]['attributes'] = [G.edge[edge][a_name] for a_name in ea_names] - - -def get_closest_k_graphs(dis_mat, k, parallel): - k_graph_groups = combinations(range(0, len(dis_mat)), k) - sod_ks_min = np.inf - if parallel: - len_combination = get_combination_length(len(dis_mat), k) - len_itr_max = int(len_combination if len_combination < 1e7 else 1e7) -# pos_cur = 0 - graph_groups_slices = split_iterable(k_graph_groups, len_itr_max, len_combination) - for graph_groups_cur in graph_groups_slices: -# while True: -# graph_groups_cur = islice(k_graph_groups, pos_cur, pos_cur + len_itr_max) - graph_groups_cur_list = list(graph_groups_cur) - print('current position:', graph_groups_cur_list[0]) - len_itr_cur = len(graph_groups_cur_list) -# if len_itr_cur < len_itr_max: -# break - - itr = zip(graph_groups_cur_list, range(0, len_itr_cur)) - sod_k_list = np.empty(len_itr_cur) - graphs_list = [None] * len_itr_cur - n_jobs = multiprocessing.cpu_count() - chunksize = int(len_itr_max / n_jobs + 1) - n_jobs = multiprocessing.cpu_count() - def init_worker(dis_mat_toshare): - global G_dis_mat - G_dis_mat = dis_mat_toshare - pool = Pool(processes=n_jobs, initializer=init_worker, initargs=(dis_mat,)) -# iterator = tqdm(pool.imap_unordered(_get_closest_k_graphs_parallel, -# itr, chunksize), -# desc='Choosing k closest graphs', file=sys.stdout) - iterator = pool.imap_unordered(_get_closest_k_graphs_parallel, itr, chunksize) - for graphs, i, sod_ks in iterator: - sod_k_list[i] = sod_ks - graphs_list[i] = graphs - pool.close() - pool.join() - - arg_min = np.argmin(sod_k_list) - sod_ks_cur = sod_k_list[arg_min] - group_cur = graphs_list[arg_min] - if sod_ks_cur < sod_ks_min: - sod_ks_min = sod_ks_cur - group_min = group_cur - print('get closer graphs:', sod_ks_min, group_min) - else: - for items in tqdm(k_graph_groups, desc='Choosing k closest graphs', file=sys.stdout): - # if items[0] != itmp: - # itmp = items[0] - # print(items) - k_graph_pairs = combinations(items, 2) - sod_ks = 0 - for i1, i2 in k_graph_pairs: - sod_ks += dis_mat[i1, i2] - if sod_ks < sod_ks_min: - sod_ks_min = sod_ks - group_min = items - print('get closer graphs:', sod_ks_min, group_min) - - return sod_ks_min, group_min - - -def _get_closest_k_graphs_parallel(itr): - k_graph_pairs = combinations(itr[0], 2) - sod_ks = 0 - for i1, i2 in k_graph_pairs: - sod_ks += G_dis_mat[i1, i2] - - return itr[0], itr[1], sod_ks - - -def split_iterable(iterable, n, len_iter): - it = iter(iterable) - for i in range(0, len_iter, n): - piece = islice(it, n) - yield piece - - -def get_combination_length(n, k): - len_combination = 1 - for i in range(n, n - k, -1): - len_combination *= i - return int(len_combination / math.factorial(k)) - - -############################################################################### - -def test_k_closest_graphs(): - ds = {'name': 'monoterpenoides', - 'dataset': '../datasets/monoterpenoides/dataset_10+.ds'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] -# gkernel = 'untilhpathkernel' -# gkernel = 'weisfeilerlehmankernel' - gkernel = 'treeletkernel' - node_label = 'atom' - edge_label = 'bond_type' - - k = 5 - edit_costs = [0.16229209837639536, 0.06612870523413916, 0.04030113378793905, 0.20723547009415202, 0.3338607220394598, 0.27054392518077297] - -# sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min \ -# = median_on_k_closest_graphs(Gn, node_label, edge_label, gkernel, k, -# 'precomputed', edit_costs=edit_costs, -## 'k-graphs', -# parallel=False) -# -# sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min \ -# = median_on_k_closest_graphs(Gn, node_label, edge_label, gkernel, k, -# 'expert', parallel=False) - - sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min \ - = median_on_k_closest_graphs(Gn, node_label, edge_label, gkernel, k, - 'expert', parallel=False) - return - - -def test_k_closest_graphs_with_cv(): - gkernel = 'untilhpathkernel' - node_label = 'atom' - edge_label = 'bond_type' - - k = 4 - - y_all = ['3', '1', '4', '6', '7', '8', '9', '2'] - repeats = 50 - collection_path = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/monoterpenoides/' - graph_dir = collection_path + 'gxl/' - - sod_sm_list = [] - sod_gm_list = [] - dis_k_sm_list = [] - dis_k_gm_list = [] - dis_k_gi_min_list = [] - for y in y_all: - print('\n-------------------------------------------------------') - print('class of y:', y) - - sod_sm_list.append([]) - sod_gm_list.append([]) - dis_k_sm_list.append([]) - dis_k_gm_list.append([]) - dis_k_gi_min_list.append([]) - - for repeat in range(repeats): - print('\nrepeat ', repeat) - collection_file = collection_path + 'monoterpenoides_' + y + '_' + str(repeat) + '.xml' - Gn, _ = loadDataset(collection_file, extra_params=graph_dir) - sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min \ - = median_on_k_closest_graphs(Gn, node_label, edge_label, gkernel, - k, 'whole-dataset', graph_dir=graph_dir, - parallel=False) - - sod_sm_list[-1].append(sod_sm) - sod_gm_list[-1].append(sod_gm) - dis_k_sm_list[-1].append(dis_k_sm) - dis_k_gm_list[-1].append(dis_k_gm) - dis_k_gi_min_list[-1].append(dis_k_gi_min) - - print('\nsods of the set median for this class:', sod_sm_list[-1]) - print('\nsods of the gen median for this class:', sod_gm_list[-1]) - print('\ndistances in kernel space of set median for this class:', - dis_k_sm_list[-1]) - print('\ndistances in kernel space of gen median for this class:', - dis_k_gm_list[-1]) - print('\ndistances in kernel space of min graph for this class:', - dis_k_gi_min_list[-1]) - - sod_sm_list[-1] = np.mean(sod_sm_list[-1]) - sod_gm_list[-1] = np.mean(sod_gm_list[-1]) - dis_k_sm_list[-1] = np.mean(dis_k_sm_list[-1]) - dis_k_gm_list[-1] = np.mean(dis_k_gm_list[-1]) - dis_k_gi_min_list[-1] = np.mean(dis_k_gi_min_list[-1]) - - print() - print('\nmean sods of the set median for each class:', sod_sm_list) - print('\nmean sods of the gen median for each class:', sod_gm_list) - print('\nmean distance in kernel space of set median for each class:', - dis_k_sm_list) - print('\nmean distances in kernel space of gen median for each class:', - dis_k_gm_list) - print('\nmean distances in kernel space of min graph for each class:', - dis_k_gi_min_list) - - print('\nmean sods of the set median of all:', np.mean(sod_sm_list)) - print('\nmean sods of the gen median of all:', np.mean(sod_gm_list)) - print('\nmean distances in kernel space of set median of all:', - np.mean(dis_k_sm_list)) - print('\nmean distances in kernel space of gen median of all:', - np.mean(dis_k_gm_list)) - print('\nmean distances in kernel space of min graph of all:', - np.mean(dis_k_gi_min_list)) - - return - - -if __name__ == '__main__': - test_k_closest_graphs() -# test_k_closest_graphs_with_cv() \ No newline at end of file diff --git a/gklearn/preimage/test_median_preimage_generator.py b/gklearn/preimage/test_median_preimage_generator.py deleted file mode 100644 index 2f458af..0000000 --- a/gklearn/preimage/test_median_preimage_generator.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Mar 27 17:30:55 2020 - -@author: ljia -""" -import multiprocessing -import functools -from gklearn.utils.kernels import deltakernel, gaussiankernel, kernelproduct -from gklearn.preimage import MedianPreimageGenerator -from gklearn.utils import Dataset - - -def test_median_preimage_generator(): - - # 1. set parameters. - print('1. setting parameters...') - ds_name = 'Letter-high' - mpg = MedianPreimageGenerator() - mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3], - 'ds_name': 'Letter-high', - 'parallel': True, - 'time_limit_in_sec': 0, - 'max_itrs': 100, - 'max_itrs_without_update': 3, - 'epsilon_ratio': 0.01, - 'verbose': 2} - mpg.set_options(**mpg_options) - mixkernel = functools.partial(kernelproduct, deltakernel, gaussiankernel) - sub_kernels = {'symb': deltakernel, 'nsymb': gaussiankernel, 'mix': mixkernel} - mpg.kernel_options = {'name': 'structuralspkernel', - 'edge_weight': None, - 'node_kernels': sub_kernels, - 'edge_kernels': sub_kernels, - 'compute_method': 'naive', - 'parallel': 'imap_unordered', -# 'parallel': None, - 'n_jobs': multiprocessing.cpu_count(), - 'normalize': True, - 'verbose': 2} - mpg.ged_options = {'method': 'IPFP', - 'initial_solutions': 40, - 'edit_cost': 'LETTER2', - 'attr_distance': 'euclidean', - 'ratio_runs_from_initial_solutions': 1, - 'threads': multiprocessing.cpu_count(), - 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} - mpg.mge_options = {'init_type': 'MEDOID', - 'random_inits': 10, - 'time_limit': 600, - 'verbose': 2, - 'refine': False} - - - # 2. get dataset. - print('2. getting dataset...') - mpg.dataset = Dataset() - mpg.dataset.load_predefined_dataset(ds_name) - mpg.dataset.cut_graphs(range(0, 10)) - - # 3. compute median preimage. - print('3. computing median preimage...') - mpg.run() - - -if __name__ == '__main__': - test_median_preimage_generator() \ No newline at end of file diff --git a/gklearn/preimage/test_others.py b/gklearn/preimage/test_others.py deleted file mode 100644 index a277a17..0000000 --- a/gklearn/preimage/test_others.py +++ /dev/null @@ -1,686 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Jul 4 12:20:16 2019 - -@author: ljia -""" -import numpy as np -import networkx as nx -import matplotlib.pyplot as plt -import time -from tqdm import tqdm - -from gklearn.utils.graphfiles import loadDataset -from gklearn.preimage.median import draw_Letter_graph -from gklearn.preimage.ged import GED, ged_median -from gklearn.preimage.utils import get_same_item_indices, compute_kernel, gram2distances, \ - dis_gstar, remove_edges - - -# --------------------------- These are tests --------------------------------# - -def test_who_is_the_closest_in_kernel_space(Gn): - idx_gi = [0, 6] - g1 = Gn[idx_gi[0]] - g2 = Gn[idx_gi[1]] - # create the "median" graph. - gnew = g2.copy() - gnew.remove_node(0) - nx.draw_networkx(gnew) - plt.show() - print(gnew.nodes(data=True)) - Gn = [gnew] + Gn - - # compute gram matrix - Kmatrix = compute_kernel(Gn, 'untilhpathkernel', True) - # the distance matrix - dmatrix = gram2distances(Kmatrix) - print(np.sort(dmatrix[idx_gi[0] + 1])) - print(np.argsort(dmatrix[idx_gi[0] + 1])) - print(np.sort(dmatrix[idx_gi[1] + 1])) - print(np.argsort(dmatrix[idx_gi[1] + 1])) - # for all g in Gn, compute (d(g1, g) + d(g2, g)) / 2 - dis_median = [(dmatrix[i, idx_gi[0] + 1] + dmatrix[i, idx_gi[1] + 1]) / 2 for i in range(len(Gn))] - print(np.sort(dis_median)) - print(np.argsort(dis_median)) - return - - -def test_who_is_the_closest_in_GED_space(Gn): - idx_gi = [0, 6] - g1 = Gn[idx_gi[0]] - g2 = Gn[idx_gi[1]] - # create the "median" graph. - gnew = g2.copy() - gnew.remove_node(0) - nx.draw_networkx(gnew) - plt.show() - print(gnew.nodes(data=True)) - Gn = [gnew] + Gn - - # compute GEDs - ged_matrix = np.zeros((len(Gn), len(Gn))) - for i1 in tqdm(range(len(Gn)), desc='computing GEDs', file=sys.stdout): - for i2 in range(len(Gn)): - dis, _, _ = GED(Gn[i1], Gn[i2], lib='gedlib') - ged_matrix[i1, i2] = dis - print(np.sort(ged_matrix[idx_gi[0] + 1])) - print(np.argsort(ged_matrix[idx_gi[0] + 1])) - print(np.sort(ged_matrix[idx_gi[1] + 1])) - print(np.argsort(ged_matrix[idx_gi[1] + 1])) - # for all g in Gn, compute (GED(g1, g) + GED(g2, g)) / 2 - dis_median = [(ged_matrix[i, idx_gi[0] + 1] + ged_matrix[i, idx_gi[1] + 1]) / 2 for i in range(len(Gn))] - print(np.sort(dis_median)) - print(np.argsort(dis_median)) - return - - -def test_will_IAM_give_the_median_graph_we_wanted(Gn): - idx_gi = [0, 6] - g1 = Gn[idx_gi[0]].copy() - g2 = Gn[idx_gi[1]].copy() -# del Gn[idx_gi[0]] -# del Gn[idx_gi[1] - 1] - g_median = test_iam_with_more_graphs_as_init([g1, g2], [g1, g2], c_ei=1, c_er=1, c_es=1) -# g_median = test_iam_with_more_graphs_as_init(Gn, Gn, c_ei=1, c_er=1, c_es=1) - nx.draw_networkx(g_median) - plt.show() - print(g_median.nodes(data=True)) - print(g_median.edges(data=True)) - - -def test_new_IAM_allGraph_deleteNodes(Gn): - idx_gi = [0, 6] -# g1 = Gn[idx_gi[0]].copy() -# g2 = Gn[idx_gi[1]].copy() - -# g1 = nx.Graph(name='haha') -# g1.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'O'}), (2, {'atom': 'C'})]) -# g1.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'})]) -# g2 = nx.Graph(name='hahaha') -# g2.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'O'}), (2, {'atom': 'C'}), -# (3, {'atom': 'O'}), (4, {'atom': 'C'})]) -# g2.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'}), -# (2, 3, {'bond_type': '1'}), (3, 4, {'bond_type': '1'})]) - - g1 = nx.Graph(name='haha') - g1.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'C'}), (2, {'atom': 'C'}), - (3, {'atom': 'S'}), (4, {'atom': 'S'})]) - g1.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'}), - (2, 3, {'bond_type': '1'}), (2, 4, {'bond_type': '1'})]) - g2 = nx.Graph(name='hahaha') - g2.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'C'}), (2, {'atom': 'C'}), - (3, {'atom': 'O'}), (4, {'atom': 'O'})]) - g2.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'}), - (2, 3, {'bond_type': '1'}), (2, 4, {'bond_type': '1'})]) - -# g2 = g1.copy() -# g2.add_nodes_from([(3, {'atom': 'O'})]) -# g2.add_nodes_from([(4, {'atom': 'C'})]) -# g2.add_edges_from([(1, 3, {'bond_type': '1'})]) -# g2.add_edges_from([(3, 4, {'bond_type': '1'})]) - -# del Gn[idx_gi[0]] -# del Gn[idx_gi[1] - 1] - - nx.draw_networkx(g1) - plt.show() - print(g1.nodes(data=True)) - print(g1.edges(data=True)) - nx.draw_networkx(g2) - plt.show() - print(g2.nodes(data=True)) - print(g2.edges(data=True)) - - g_median = test_iam_moreGraphsAsInit_tryAllPossibleBestGraphs_deleteNodesInIterations([g1, g2], [g1, g2], c_ei=1, c_er=1, c_es=1) -# g_median = test_iam_moreGraphsAsInit_tryAllPossibleBestGraphs_deleteNodesInIterations(Gn, Gn, c_ei=1, c_er=1, c_es=1) - nx.draw_networkx(g_median) - plt.show() - print(g_median.nodes(data=True)) - print(g_median.edges(data=True)) - - -def test_the_simple_two(Gn, gkernel): - from gk_iam import gk_iam_nearest_multi - lmbda = 0.03 # termination probalility - r_max = 10 # recursions - l = 500 - alpha_range = np.linspace(0.5, 0.5, 1) - k = 2 # k nearest neighbors - - # randomly select two molecules - np.random.seed(1) - idx_gi = [0, 6] # np.random.randint(0, len(Gn), 2) - g1 = Gn[idx_gi[0]] - g2 = Gn[idx_gi[1]] - Gn_mix = [g.copy() for g in Gn] - Gn_mix.append(g1.copy()) - Gn_mix.append(g2.copy()) - -# g_tmp = iam([g1, g2]) -# nx.draw_networkx(g_tmp) -# plt.show() - - # compute -# k_list = [] # kernel between each graph and itself. -# k_g1_list = [] # kernel between each graph and g1 -# k_g2_list = [] # kernel between each graph and g2 -# for ig, g in tqdm(enumerate(Gn), desc='computing self kernels', file=sys.stdout): -# ktemp = compute_kernel([g, g1, g2], 'marginalizedkernel', False) -# k_list.append(ktemp[0][0, 0]) -# k_g1_list.append(ktemp[0][0, 1]) -# k_g2_list.append(ktemp[0][0, 2]) - - km = compute_kernel(Gn_mix, gkernel, True) -# k_list = np.diag(km) # kernel between each graph and itself. -# k_g1_list = km[idx_gi[0]] # kernel between each graph and g1 -# k_g2_list = km[idx_gi[1]] # kernel between each graph and g2 - - g_best = [] - dis_best = [] - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - dhat, ghat_list = gk_iam_nearest_multi(Gn, [g1, g2], [alpha, 1 - alpha], - range(len(Gn), len(Gn) + 2), km, - k, r_max,gkernel) - dis_best.append(dhat) - g_best.append(ghat_list) - - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-images are') - for g in g_best[idx]: - nx.draw_networkx(g) - plt.show() - print(g.nodes(data=True)) - print(g.edges(data=True)) - - -def test_remove_bests(Gn, gkernel): - from gk_iam import gk_iam_nearest_multi - lmbda = 0.03 # termination probalility - r_max = 10 # recursions - l = 500 - alpha_range = np.linspace(0.5, 0.5, 1) - k = 20 # k nearest neighbors - - # randomly select two molecules - np.random.seed(1) - idx_gi = [0, 6] # np.random.randint(0, len(Gn), 2) - g1 = Gn[idx_gi[0]] - g2 = Gn[idx_gi[1]] - # remove the best 2 graphs. - del Gn[idx_gi[0]] - del Gn[idx_gi[1] - 1] -# del Gn[8] - - Gn_mix = [g.copy() for g in Gn] - Gn_mix.append(g1.copy()) - Gn_mix.append(g2.copy()) - - - # compute - km = compute_kernel(Gn_mix, gkernel, True) - g_best = [] - dis_best = [] - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - dhat, ghat_list = gk_iam_nearest_multi(Gn, [g1, g2], [alpha, 1 - alpha], - range(len(Gn), len(Gn) + 2), km, - k, r_max, gkernel) - dis_best.append(dhat) - g_best.append(ghat_list) - - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-images are') - for g in g_best[idx]: - draw_Letter_graph(g) -# nx.draw_networkx(g) -# plt.show() - print(g.nodes(data=True)) - print(g.edges(data=True)) - - -############################################################################### -# Tests on dataset Letter-H. - -def test_gkiam_letter_h(): - from gk_iam import gk_iam_nearest_multi - ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', - 'extra_params': {}} # node nsymb -# ds = {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt', -# 'extra_params': {}} # node nsymb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - gkernel = 'structuralspkernel' - - lmbda = 0.03 # termination probalility - r_max = 3 # recursions -# alpha_range = np.linspace(0.5, 0.5, 1) - k = 10 # k nearest neighbors - - # classify graphs according to letters. - idx_dict = get_same_item_indices(y_all) - time_list = [] - sod_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - for letter in idx_dict: - print('\n-------------------------------------------------------\n') - Gn_let = [Gn[i].copy() for i in idx_dict[letter]] - Gn_mix = Gn_let + [g.copy() for g in Gn_let] - - alpha_range = np.linspace(1 / len(Gn_let), 1 / len(Gn_let), 1) - - # compute - time0 = time.time() - km = compute_kernel(Gn_mix, gkernel, True) - g_best = [] - dis_best = [] - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - dhat, ghat_list, sod_ks, nb_updated = gk_iam_nearest_multi(Gn_let, - Gn_let, [alpha] * len(Gn_let), range(len(Gn_let), len(Gn_mix)), - km, k, r_max, gkernel, c_ei=1.7, c_er=1.7, c_es=1.7, - ged_cost='LETTER', ged_method='IPFP', saveGXL='gedlib-letter') - dis_best.append(dhat) - g_best.append(ghat_list) - time_list.append(time.time() - time0) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-images are') - for g in g_best[idx]: - draw_Letter_graph(g, savepath='results/gk_iam/') -# nx.draw_networkx(g) -# plt.show() - print(g.nodes(data=True)) - print(g.edges(data=True)) - - # compute the corresponding sod in graph space. (alpha range not considered.) - sod_tmp, _ = ged_median(g_best[0], Gn_let, ged_cost='LETTER', - ged_method='IPFP', saveGXL='gedlib-letter') - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - sod_ks_min_list.append(sod_ks) - nb_updated_list.append(nb_updated) - - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each letter: ', sod_gs_min_list) - print('\nsmallest sod in kernel space for each letter: ', sod_ks_min_list) - print('\nnumber of updates for each letter: ', nb_updated_list) - print('\ntimes:', time_list) - -#def compute_letter_median_by_average(Gn): -# return g_median - - -def test_iam_letter_h(): - from iam import test_iam_moreGraphsAsInit_tryAllPossibleBestGraphs_deleteNodesInIterations - ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', - 'extra_params': {}} # node nsymb -# ds = {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt', -# 'extra_params': {}} # node nsymb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - - lmbda = 0.03 # termination probalility -# alpha_range = np.linspace(0.5, 0.5, 1) - - # classify graphs according to letters. - idx_dict = get_same_item_indices(y_all) - time_list = [] - sod_list = [] - sod_min_list = [] - for letter in idx_dict: - Gn_let = [Gn[i].copy() for i in idx_dict[letter]] - - alpha_range = np.linspace(1 / len(Gn_let), 1 / len(Gn_let), 1) - - # compute - g_best = [] - dis_best = [] - time0 = time.time() - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - ghat_list, dhat = test_iam_moreGraphsAsInit_tryAllPossibleBestGraphs_deleteNodesInIterations( - Gn_let, Gn_let, c_ei=1.7, c_er=1.7, c_es=1.7, - ged_cost='LETTER', ged_method='IPFP', saveGXL='gedlib-letter') - dis_best.append(dhat) - g_best.append(ghat_list) - time_list.append(time.time() - time0) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-images are') - for g in g_best[idx]: - draw_Letter_graph(g, savepath='results/iam/') -# nx.draw_networkx(g) -# plt.show() - print(g.nodes(data=True)) - print(g.edges(data=True)) - - # compute the corresponding sod in kernel space. (alpha range not considered.) - gkernel = 'structuralspkernel' - sod_tmp = [] - Gn_mix = g_best[0] + Gn_let - km = compute_kernel(Gn_mix, gkernel, True) - for ig, g in tqdm(enumerate(g_best[0]), desc='computing kernel sod', file=sys.stdout): - dtemp = dis_gstar(ig, range(len(g_best[0]), len(Gn_mix)), - [alpha_range[0]] * len(Gn_let), km, withterm3=False) - sod_tmp.append(dtemp) - sod_list.append(sod_tmp) - sod_min_list.append(np.min(sod_tmp)) - - - print('\nsods in kernel space: ', sod_list) - print('\nsmallest sod in kernel space for each letter: ', sod_min_list) - print('\ntimes:', time_list) - - -def test_random_preimage_letter_h(): - from preimage_random import preimage_random - ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', - 'extra_params': {}} # node nsymb -# ds = {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt', -# 'extra_params': {}} # node nsymb - # ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', -# 'extra_params': {}} # node/edge symb -# ds = {'name': 'Acyclic', 'dataset': '../datasets/monoterpenoides/trainset_9.ds', -# 'extra_params': {}} -# ds = {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', -# 'extra_params': {}} # node symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - gkernel = 'structuralspkernel' - -# lmbda = 0.03 # termination probalility - r_max = 3 # 10 # recursions - l = 500 -# alpha_range = np.linspace(0.5, 0.5, 1) - #alpha_range = np.linspace(0.1, 0.9, 9) - k = 10 # 5 # k nearest neighbors - - # classify graphs according to letters. - idx_dict = get_same_item_indices(y_all) - time_list = [] - sod_list = [] - sod_min_list = [] - for letter in idx_dict: - print('\n-------------------------------------------------------\n') - Gn_let = [Gn[i].copy() for i in idx_dict[letter]] - Gn_mix = Gn_let + [g.copy() for g in Gn_let] - - alpha_range = np.linspace(1 / len(Gn_let), 1 / len(Gn_let), 1) - - # compute - time0 = time.time() - km = compute_kernel(Gn_mix, gkernel, True) - g_best = [] - dis_best = [] - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - dhat, ghat_list = preimage_random(Gn_let, Gn_let, [alpha] * len(Gn_let), - range(len(Gn_let), len(Gn_mix)), km, - k, r_max, gkernel, c_ei=1.7, - c_er=1.7, c_es=1.7) - dis_best.append(dhat) - g_best.append(ghat_list) - time_list.append(time.time() - time0) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-images are') - for g in g_best[idx]: - draw_Letter_graph(g, savepath='results/gk_iam/') -# nx.draw_networkx(g) -# plt.show() - print(g.nodes(data=True)) - print(g.edges(data=True)) - - # compute the corresponding sod in graph space. (alpha range not considered.) - sod_tmp, _ = ged_median(g_best[0], Gn_let) - sod_list.append(sod_tmp) - sod_min_list.append(np.min(sod_tmp)) - - - print('\nsods in graph space: ', sod_list) - print('\nsmallest sod in graph space for each letter: ', sod_min_list) - print('\ntimes:', time_list) - - - - - - - -def test_gkiam_mutag(): - from gk_iam import gk_iam_nearest_multi - ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', - 'extra_params': {}} # node nsymb -# ds = {'name': 'Letter-med', 'dataset': '../datasets/Letter-med/Letter-med_A.txt', -# 'extra_params': {}} # node nsymb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) - gkernel = 'structuralspkernel' - - lmbda = 0.03 # termination probalility - r_max = 3 # recursions -# alpha_range = np.linspace(0.5, 0.5, 1) - k = 20 # k nearest neighbors - - # classify graphs according to letters. - idx_dict = get_same_item_indices(y_all) - time_list = [] - sod_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - for letter in idx_dict: - print('\n-------------------------------------------------------\n') - Gn_let = [Gn[i].copy() for i in idx_dict[letter]] - Gn_mix = Gn_let + [g.copy() for g in Gn_let] - - alpha_range = np.linspace(1 / len(Gn_let), 1 / len(Gn_let), 1) - - # compute - time0 = time.time() - km = compute_kernel(Gn_mix, gkernel, True) - g_best = [] - dis_best = [] - # for each alpha - for alpha in alpha_range: - print('alpha =', alpha) - dhat, ghat_list, sod_ks, nb_updated = gk_iam_nearest_multi(Gn_let, Gn_let, [alpha] * len(Gn_let), - range(len(Gn_let), len(Gn_mix)), km, - k, r_max, gkernel, c_ei=1.7, - c_er=1.7, c_es=1.7) - dis_best.append(dhat) - g_best.append(ghat_list) - time_list.append(time.time() - time0) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_best[idx]) - print('the corresponding pre-images are') - for g in g_best[idx]: - draw_Letter_graph(g, savepath='results/gk_iam/') -# nx.draw_networkx(g) -# plt.show() - print(g.nodes(data=True)) - print(g.edges(data=True)) - - # compute the corresponding sod in graph space. (alpha range not considered.) - sod_tmp, _ = ged_median(g_best[0], Gn_let) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - sod_ks_min_list.append(sod_ks) - nb_updated_list.append(nb_updated) - - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each letter: ', sod_gs_min_list) - print('\nsmallest sod in kernel space for each letter: ', sod_ks_min_list) - print('\nnumber of updates for each letter: ', nb_updated_list) - print('\ntimes:', time_list) - - -############################################################################### -# Re-test. - -def retest_the_simple_two(): - from gk_iam import gk_iam_nearest_multi - - # The two simple graphs. -# g1 = nx.Graph(name='haha') -# g1.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'O'}), (2, {'atom': 'C'})]) -# g1.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'})]) -# g2 = nx.Graph(name='hahaha') -# g2.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'O'}), (2, {'atom': 'C'}), -# (3, {'atom': 'O'}), (4, {'atom': 'C'})]) -# g2.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'}), -# (2, 3, {'bond_type': '1'}), (3, 4, {'bond_type': '1'})]) - - g1 = nx.Graph(name='haha') - g1.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'C'}), (2, {'atom': 'C'}), - (3, {'atom': 'S'}), (4, {'atom': 'S'})]) - g1.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'}), - (2, 3, {'bond_type': '1'}), (2, 4, {'bond_type': '1'})]) - g2 = nx.Graph(name='hahaha') - g2.add_nodes_from([(0, {'atom': 'C'}), (1, {'atom': 'C'}), (2, {'atom': 'C'}), - (3, {'atom': 'O'}), (4, {'atom': 'O'})]) - g2.add_edges_from([(0, 1, {'bond_type': '1'}), (1, 2, {'bond_type': '1'}), - (2, 3, {'bond_type': '1'}), (2, 4, {'bond_type': '1'})]) - -# # randomly select two molecules -# np.random.seed(1) -# idx_gi = [0, 6] # np.random.randint(0, len(Gn), 2) -# g1 = Gn[idx_gi[0]] -# g2 = Gn[idx_gi[1]] -# Gn_mix = [g.copy() for g in Gn] -# Gn_mix.append(g1.copy()) -# Gn_mix.append(g2.copy()) - - Gn = [g1.copy(), g2.copy()] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 10 # recursions -# l = 500 - alpha_range = np.linspace(0.5, 0.5, 1) - k = 2 # k nearest neighbors - epsilon = 1e-6 - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - c_ei=1 - c_er=1 - c_es=1 - - Gn_mix = Gn + [g1.copy(), g2.copy()] - - # compute - time0 = time.time() - km = compute_kernel(Gn_mix, gkernel, True) - time_km = time.time() - time0 - - time_list = [] - sod_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - g_best = [] - # for each alpha - for alpha in alpha_range: - print('\n-------------------------------------------------------\n') - print('alpha =', alpha) - time0 = time.time() - dhat, ghat_list, sod_ks, nb_updated = gk_iam_nearest_multi(Gn, [g1, g2], - [alpha, 1 - alpha], range(len(Gn), len(Gn) + 2), km, k, r_max, - gkernel, c_ei=c_ei, c_er=c_er, c_es=c_es, epsilon=epsilon, - ged_cost=ged_cost, ged_method=ged_method, saveGXL=saveGXL) - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - sod_ks_min_list.append(dhat) - g_best.append(ghat_list) - nb_updated_list.append(nb_updated) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', sod_ks_min_list[idx]) - print('one of the possible corresponding pre-images is') - nx.draw(g_best[idx][0], labels=nx.get_node_attributes(g_best[idx][0], 'atom'), - with_labels=True) - plt.savefig('results/gk_iam/mutag_alpha' + str(item) + '.png', format="PNG") - plt.show() - print(g_best[idx][0].nodes(data=True)) - print(g_best[idx][0].edges(data=True)) - -# for g in g_best[idx]: -# draw_Letter_graph(g, savepath='results/gk_iam/') -## nx.draw_networkx(g) -## plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - # compute the corresponding sod in graph space. - for idx, item in enumerate(alpha_range): - sod_tmp, _ = ged_median(g_best[0], [g1, g2], ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each alpha: ', sod_gs_min_list) - print('\nsmallest sod in kernel space for each alpha: ', sod_ks_min_list) - print('\nnumber of updates for each alpha: ', nb_updated_list) - print('\ntimes:', time_list) - - - -if __name__ == '__main__': -# ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', -# 'extra_params': {}} # node/edge symb -# ds = {'name': 'Letter-high', 'dataset': '../datasets/Letter-high/Letter-high_A.txt', -# 'extra_params': {}} # node nsymb -# ds = {'name': 'Acyclic', 'dataset': '../datasets/monoterpenoides/trainset_9.ds', -# 'extra_params': {}} -# ds = {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', -# 'extra_params': {}} # node symb -# Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:20] - -# import networkx.algorithms.isomorphism as iso -# G1 = nx.MultiDiGraph() -# G2 = nx.MultiDiGraph() -# G1.add_nodes_from([1,2,3], fill='red') -# G2.add_nodes_from([10,20,30,40], fill='red') -# nx.add_path(G1, [1,2,3,4], weight=3, linewidth=2.5) -# nx.add_path(G2, [10,20,30,40], weight=3) -# nm = iso.categorical_node_match('fill', 'red') -# print(nx.is_isomorphic(G1, G2, node_match=nm)) -# -# test_new_IAM_allGraph_deleteNodes(Gn) -# test_will_IAM_give_the_median_graph_we_wanted(Gn) -# test_who_is_the_closest_in_GED_space(Gn) -# test_who_is_the_closest_in_kernel_space(Gn) - -# test_the_simple_two(Gn, 'untilhpathkernel') -# test_remove_bests(Gn, 'untilhpathkernel') -# test_gkiam_letter_h() -# test_iam_letter_h() -# test_random_preimage_letter_h - -############################################################################### -# retests. - retest_the_simple_two() \ No newline at end of file diff --git a/gklearn/preimage/test_preimage_iam.py b/gklearn/preimage/test_preimage_iam.py deleted file mode 100644 index 9b05dd9..0000000 --- a/gklearn/preimage/test_preimage_iam.py +++ /dev/null @@ -1,620 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Sep 5 15:59:00 2019 - -@author: ljia -""" - -import numpy as np -import networkx as nx -import matplotlib.pyplot as plt -import time -import random -#from tqdm import tqdm - -from gklearn.utils.graphfiles import loadDataset -from gklearn.preimage.utils import remove_edges, compute_kernel, get_same_item_indices -from gklearn.preimage.ged import ged_median - -from gklearn.preimage.preimage_iam import preimage_iam - - -############################################################################### -# tests on different values on grid of median-sets and k. - -def test_preimage_iam_grid_k_median_nb(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 5 # iteration limit for pre-image. -# alpha_range = np.linspace(0.5, 0.5, 1) -# k = 5 # k nearest neighbors - epsilon = 1e-6 - InitIAMWithAllDk = True - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - # parameters for IAM function - c_ei=1 - c_er=1 - c_es=1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = True - connected_iam = False - - # number of graphs; we what to compute the median of these graphs. - nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - # number of nearest neighbors. - k_range = [5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 100] - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - nb_updated_k_list = [] - g_best = [] - for idx_nb, nb_median in enumerate(nb_median_range): - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') - km_tmp = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) - for i in range(len(Gn)): - for j in range(i, len(Gn)): - km[i, j] = km_tmp[i, j] - km[j, i] = km[i, j] - for i in range(len(Gn)): - for j, idx in enumerate(idx_rdm): - km[i, len(Gn) + j] = km[i, idx] - km[len(Gn) + j, i] = km[i, idx] - for i, idx1 in enumerate(idx_rdm): - for j, idx2 in enumerate(idx_rdm): - km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - - time_list.append([]) - dis_ks_min_list.append([]) - sod_gs_list.append([]) - sod_gs_min_list.append([]) - nb_updated_list.append([]) - nb_updated_k_list.append([]) - g_best.append([]) - - for k in k_range: - print('\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n') - print('k =', k) - time0 = time.time() - dhat, ghat_list, dis_of_each_itr, nb_updated, nb_updated_k = \ - preimage_iam(Gn, Gn_median, - alpha_range, range(len(Gn), len(Gn) + nb_median), km, k, r_max, - gkernel, epsilon=epsilon, InitIAMWithAllDk=InitIAMWithAllDk, - params_iam={'c_ei': c_ei, 'c_er': c_er, 'c_es': c_es, - 'ite_max': ite_max_iam, 'epsilon': epsilon_iam, - 'removeNodes': removeNodes, 'connected': connected_iam}, - params_ged={'ged_cost': ged_cost, 'ged_method': ged_method, - 'saveGXL': saveGXL}) - - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list[idx_nb].append(time_total) - print('\nsmallest distance in kernel space: ', dhat) - dis_ks_min_list[idx_nb].append(dhat) - g_best[idx_nb].append(ghat_list) - print('\nnumber of updates of the best graph by IAM: ', nb_updated) - nb_updated_list[idx_nb].append(nb_updated) - print('\nnumber of updates of k nearest graphs by IAM: ', nb_updated_k) - nb_updated_k_list[idx_nb].append(nb_updated_k) - - # show the best graph and save it to file. - print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat_list[0], labels=nx.get_node_attributes(ghat_list[0], 'atom'), - with_labels=True) - plt.savefig('results/preimage_iam/mutag_median_nb' + str(nb_median) + - '_k' + str(k) + '.png', format="PNG") - # plt.show() - plt.clf() - # print(ghat_list[0].nodes(data=True)) - # print(ghat_list[0].edges(data=True)) - - # compute the corresponding sod in graph space. - sod_tmp, _ = ged_median([ghat_list[0]], Gn_median, ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list[idx_nb].append(sod_tmp) - sod_gs_min_list[idx_nb].append(np.min(sod_tmp)) - print('\nsmallest sod in graph space: ', np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each set of median graphs and k: ', - sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs and k: ', - dis_ks_min_list) - print('\nnumber of updates of the best graph for each set of median graphs and k by IAM: ', - nb_updated_list) - print('\nnumber of updates of k nearest graphs for each set of median graphs and k by IAM: ', - nb_updated_k_list) - print('\ntimes:', time_list) - - - - - - -############################################################################### -# tests on different numbers of median-sets. - -def test_preimage_iam_median_nb(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 3 # iteration limit for pre-image. -# alpha_range = np.linspace(0.5, 0.5, 1) - k = 5 # k nearest neighbors - epsilon = 1e-6 - InitIAMWithAllDk = True - # parameters for IAM function -# c_vi = 0.037 -# c_vr = 0.038 -# c_vs = 0.075 -# c_ei = 0.001 -# c_er = 0.001 -# c_es = 0.0 - c_vi = 4 - c_vr = 4 - c_vs = 2 - c_ei = 1 - c_er = 1 - c_es = 1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = True - connected_iam = False - # parameters for GED function -# ged_cost='CHEM_1' - ged_cost = 'CONSTANT' - ged_method = 'IPFP' - edit_cost_constant = [c_vi, c_vr, c_vs, c_ei, c_er, c_es] - ged_stabilizer = 'min' - ged_repeat = 50 - params_ged = {'lib': 'gedlibpy', 'cost': ged_cost, 'method': ged_method, - 'edit_cost_constant': edit_cost_constant, - 'stabilizer': ged_stabilizer, 'repeat': ged_repeat} - - # number of graphs; we what to compute the median of these graphs. -# nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - nb_median_range = [2] - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - nb_updated_k_list = [] - g_best = [] - for nb_median in nb_median_range: - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') - km_tmp = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) - for i in range(len(Gn)): - for j in range(i, len(Gn)): - km[i, j] = km_tmp[i, j] - km[j, i] = km[i, j] - for i in range(len(Gn)): - for j, idx in enumerate(idx_rdm): - km[i, len(Gn) + j] = km[i, idx] - km[len(Gn) + j, i] = km[i, idx] - for i, idx1 in enumerate(idx_rdm): - for j, idx2 in enumerate(idx_rdm): - km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - time0 = time.time() - dhat, ghat_list, dis_of_each_itr, nb_updated, nb_updated_k = \ - preimage_iam(Gn, Gn_median, - alpha_range, range(len(Gn), len(Gn) + nb_median), km, k, r_max, - gkernel, epsilon=epsilon, InitIAMWithAllDk=InitIAMWithAllDk, - params_iam={'c_ei': c_ei, 'c_er': c_er, 'c_es': c_es, - 'ite_max': ite_max_iam, 'epsilon': epsilon_iam, - 'removeNodes': removeNodes, 'connected': connected_iam}, - params_ged=params_ged) - - time_total = time.time() - time0 + time_km - print('\ntime: ', time_total) - time_list.append(time_total) - print('\nsmallest distance in kernel space: ', dhat) - dis_ks_min_list.append(dhat) - g_best.append(ghat_list) - print('\nnumber of updates of the best graph: ', nb_updated) - nb_updated_list.append(nb_updated) - print('\nnumber of updates of k nearest graphs: ', nb_updated_k) - nb_updated_k_list.append(nb_updated_k) - - # show the best graph and save it to file. - print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat_list[0], labels=nx.get_node_attributes(ghat_list[0], 'atom'), - with_labels=True) - plt.show() -# plt.savefig('results/preimage_iam/mutag_median_cs.001_nb' + str(nb_median) + -# '.png', format="PNG") - plt.clf() -# print(ghat_list[0].nodes(data=True)) -# print(ghat_list[0].edges(data=True)) - - # compute the corresponding sod in graph space. - sod_tmp, _ = ged_median([ghat_list[0]], Gn_median, params_ged=params_ged) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - print('\nsmallest sod in graph space: ', np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each set of median graphs: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs: ', - dis_ks_min_list) - print('\nnumber of updates of the best graph for each set of median graphs by IAM: ', - nb_updated_list) - print('\nnumber of updates of k nearest graphs for each set of median graphs by IAM: ', - nb_updated_k_list) - print('\ntimes:', time_list) - - - - - - -############################################################################### -# test on the combination of the two randomly chosen graphs. (the same as in the -# random pre-image paper.) - -def test_gkiam_2combination_all_pairs(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 10 # iteration limit for pre-image. - alpha_range = np.linspace(0.5, 0.5, 1) - k = 5 # k nearest neighbors - epsilon = 1e-6 - InitIAMWithAllDk = False - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - # parameters for IAM function - c_ei=1 - c_er=1 - c_es=1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = True - connected_iam = False - - nb_update_mat = np.full((len(Gn), len(Gn)), np.inf) - # test on each pair of graphs. -# for idx1 in range(len(Gn) - 1, -1, -1): -# for idx2 in range(idx1, -1, -1): - for idx1 in range(187, 188): - for idx2 in range(167, 168): - g1 = Gn[idx1].copy() - g2 = Gn[idx2].copy() - # Gn[10] = [] - # Gn[10] = [] - - nx.draw(g1, labels=nx.get_node_attributes(g1, 'atom'), with_labels=True) - plt.savefig("results/gk_iam/all_pairs/mutag187.png", format="PNG") - plt.show() - plt.clf() - nx.draw(g2, labels=nx.get_node_attributes(g2, 'atom'), with_labels=True) - plt.savefig("results/gk_iam/all_pairs/mutag167.png", format="PNG") - plt.show() - plt.clf() - - ################################################################### -# Gn_mix = [g.copy() for g in Gn] -# Gn_mix.append(g1.copy()) -# Gn_mix.append(g2.copy()) -# -# # compute -# time0 = time.time() -# km = compute_kernel(Gn_mix, gkernel, True) -# time_km = time.time() - time0 -# -# # write Gram matrix to file and read it. -# np.savez('results/gram_matrix_uhpath_itr7_pq0.8.gm', gm=km, gmtime=time_km) - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03.gm.npz') - km = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - for i in range(len(Gn)): - km[i, len(Gn)] = km[i, idx1] - km[i, len(Gn) + 1] = km[i, idx2] - km[len(Gn), i] = km[i, idx1] - km[len(Gn) + 1, i] = km[i, idx2] - km[len(Gn), len(Gn)] = km[idx1, idx1] - km[len(Gn), len(Gn) + 1] = km[idx1, idx2] - km[len(Gn) + 1, len(Gn)] = km[idx2, idx1] - km[len(Gn) + 1, len(Gn) + 1] = km[idx2, idx2] - - ################################################################### -# # use only the two graphs in median set as candidates. -# Gn = [g1.copy(), g2.copy()] -# Gn_mix = Gn + [g1.copy(), g2.copy()] -# # compute -# time0 = time.time() -# km = compute_kernel(Gn_mix, gkernel, True) -# time_km = time.time() - time0 - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - nb_updated_k_list = [] - g_best = [] - # for each alpha - for alpha in alpha_range: - print('\n-------------------------------------------------------\n') - print('alpha =', alpha) - time0 = time.time() - dhat, ghat_list, sod_ks, nb_updated, nb_updated_k = \ - preimage_iam(Gn, [g1, g2], - [alpha, 1 - alpha], range(len(Gn), len(Gn) + 2), km, k, r_max, - gkernel, epsilon=epsilon, InitIAMWithAllDk=InitIAMWithAllDk, - params_iam={'c_ei': c_ei, 'c_er': c_er, 'c_es': c_es, - 'ite_max': ite_max_iam, 'epsilon': epsilon_iam, - 'removeNodes': removeNodes, 'connected': connected_iam}, - params_ged={'ged_cost': ged_cost, 'ged_method': ged_method, - 'saveGXL': saveGXL}) - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - dis_ks_min_list.append(dhat) - g_best.append(ghat_list) - nb_updated_list.append(nb_updated) - nb_updated_k_list.append(nb_updated_k) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_ks_min_list[idx]) - print('one of the possible corresponding pre-images is') - nx.draw(g_best[idx][0], labels=nx.get_node_attributes(g_best[idx][0], 'atom'), - with_labels=True) - plt.savefig('results/gk_iam/mutag' + str(idx1) + '_' + str(idx2) - + '_alpha' + str(item) + '.png', format="PNG") -# plt.show() - plt.clf() -# print(g_best[idx][0].nodes(data=True)) -# print(g_best[idx][0].edges(data=True)) - - # for g in g_best[idx]: - # draw_Letter_graph(g, savepath='results/gk_iam/') - ## nx.draw_networkx(g) - ## plt.show() - # print(g.nodes(data=True)) - # print(g.edges(data=True)) - - # compute the corresponding sod in graph space. - for idx, item in enumerate(alpha_range): - sod_tmp, _ = ged_median([g_best[0]], [g1, g2], ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each alpha: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each alpha: ', dis_ks_min_list) - print('\nnumber of updates of the best graph for each alpha: ', - nb_updated_list) - print('\nnumber of updates of the k nearest graphs for each alpha: ', - nb_updated_k_list) - print('\ntimes:', time_list) - nb_update_mat[idx1, idx2] = nb_updated_list[0] - - str_fw = 'graphs %d and %d: %d.\n' % (idx1, idx2, nb_updated_list[0]) - with open('results/gk_iam/all_pairs/nb_updates.txt', 'r+') as file: - content = file.read() - file.seek(0, 0) - file.write(str_fw + content) - - - -def test_gkiam_2combination(): - from gk_iam import gk_iam_nearest_multi - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 10 # iteration limit for pre-image. - alpha_range = np.linspace(0.5, 0.5, 1) - k = 20 # k nearest neighbors - epsilon = 1e-6 - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - c_ei=1 - c_er=1 - c_es=1 - - # randomly select two molecules - np.random.seed(1) - idx_gi = [10, 11] # np.random.randint(0, len(Gn), 2) - g1 = Gn[idx_gi[0]].copy() - g2 = Gn[idx_gi[1]].copy() -# Gn[10] = [] -# Gn[10] = [] - -# nx.draw(g1, labels=nx.get_node_attributes(g1, 'atom'), with_labels=True) -# plt.savefig("results/random_preimage/mutag10.png", format="PNG") -# plt.show() -# nx.draw(g2, labels=nx.get_node_attributes(g2, 'atom'), with_labels=True) -# plt.savefig("results/random_preimage/mutag11.png", format="PNG") -# plt.show() - - Gn_mix = [g.copy() for g in Gn] - Gn_mix.append(g1.copy()) - Gn_mix.append(g2.copy()) - - # compute -# time0 = time.time() -# km = compute_kernel(Gn_mix, gkernel, True) -# time_km = time.time() - time0 - - # write Gram matrix to file and read it. -# np.savez('results/gram_matrix.gm', gm=km, gmtime=time_km) - gmfile = np.load('results/gram_matrix.gm.npz') - km = gmfile['gm'] - time_km = gmfile['gmtime'] - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - g_best = [] - # for each alpha - for alpha in alpha_range: - print('\n-------------------------------------------------------\n') - print('alpha =', alpha) - time0 = time.time() - dhat, ghat_list, sod_ks, nb_updated = gk_iam_nearest_multi(Gn, [g1, g2], - [alpha, 1 - alpha], range(len(Gn), len(Gn) + 2), km, k, r_max, - gkernel, c_ei=c_ei, c_er=c_er, c_es=c_es, epsilon=epsilon, - ged_cost=ged_cost, ged_method=ged_method, saveGXL=saveGXL) - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - dis_ks_min_list.append(dhat) - g_best.append(ghat_list) - nb_updated_list.append(nb_updated) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_ks_min_list[idx]) - print('one of the possible corresponding pre-images is') - nx.draw(g_best[idx][0], labels=nx.get_node_attributes(g_best[idx][0], 'atom'), - with_labels=True) - plt.savefig('results/gk_iam/mutag_alpha' + str(item) + '.png', format="PNG") - plt.show() - print(g_best[idx][0].nodes(data=True)) - print(g_best[idx][0].edges(data=True)) - -# for g in g_best[idx]: -# draw_Letter_graph(g, savepath='results/gk_iam/') -## nx.draw_networkx(g) -## plt.show() -# print(g.nodes(data=True)) -# print(g.edges(data=True)) - - # compute the corresponding sod in graph space. - for idx, item in enumerate(alpha_range): - sod_tmp, _ = ged_median([g_best[0]], [g1, g2], ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each alpha: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each alpha: ', dis_ks_min_list) - print('\nnumber of updates for each alpha: ', nb_updated_list) - print('\ntimes:', time_list) - - -############################################################################### - - -if __name__ == '__main__': -############################################################################### -# test on the combination of the two randomly chosen graphs. (the same as in the -# random pre-image paper.) -# test_gkiam_2combination() -# test_gkiam_2combination_all_pairs() - -############################################################################### -# tests on different numbers of median-sets. - test_preimage_iam_median_nb() - -############################################################################### -# tests on different values on grid of median-sets and k. -# test_preimage_iam_grid_k_median_nb() \ No newline at end of file diff --git a/gklearn/preimage/test_preimage_mix.py b/gklearn/preimage/test_preimage_mix.py deleted file mode 100644 index 888de86..0000000 --- a/gklearn/preimage/test_preimage_mix.py +++ /dev/null @@ -1,539 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Sep 5 15:59:00 2019 - -@author: ljia -""" - -import numpy as np -import networkx as nx -import matplotlib.pyplot as plt -import time -import random -#from tqdm import tqdm - -from gklearn.utils.graphfiles import loadDataset -from gklearn.preimage.ged import ged_median -from gklearn.preimage.utils import compute_kernel, get_same_item_indices, remove_edges -from gklearn.preimage.preimage_iam import preimage_iam_random_mix - -############################################################################### -# tests on different values on grid of median-sets and k. - -def test_preimage_mix_grid_k_median_nb(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 5 # iteration limit for pre-image. - l_max = 500 # update limit for random generation -# alpha_range = np.linspace(0.5, 0.5, 1) -# k = 5 # k nearest neighbors - epsilon = 1e-6 - InitIAMWithAllDk = True - InitRandomWithAllDk = True - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - # parameters for IAM function - c_ei=1 - c_er=1 - c_es=1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = True - connected_iam = False - - # number of graphs; we what to compute the median of these graphs. - nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - # number of nearest neighbors. - k_range = [5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 100] - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list_iam = [] - nb_updated_list_random = [] - nb_updated_k_list_iam = [] - nb_updated_k_list_random = [] - g_best = [] - for idx_nb, nb_median in enumerate(nb_median_range): - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') - km_tmp = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) - for i in range(len(Gn)): - for j in range(i, len(Gn)): - km[i, j] = km_tmp[i, j] - km[j, i] = km[i, j] - for i in range(len(Gn)): - for j, idx in enumerate(idx_rdm): - km[i, len(Gn) + j] = km[i, idx] - km[len(Gn) + j, i] = km[i, idx] - for i, idx1 in enumerate(idx_rdm): - for j, idx2 in enumerate(idx_rdm): - km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - - time_list.append([]) - dis_ks_min_list.append([]) - sod_gs_list.append([]) - sod_gs_min_list.append([]) - nb_updated_list_iam.append([]) - nb_updated_list_random.append([]) - nb_updated_k_list_iam.append([]) - nb_updated_k_list_random.append([]) - g_best.append([]) - - for k in k_range: - print('\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n') - print('k =', k) - time0 = time.time() - dhat, ghat_list, dis_of_each_itr, nb_updated_iam, nb_updated_random, \ - nb_updated_k_iam, nb_updated_k_random = \ - preimage_iam_random_mix(Gn, Gn_median, - alpha_range, range(len(Gn), len(Gn) + nb_median), km, k, r_max, - l_max, gkernel, epsilon=epsilon, InitIAMWithAllDk=InitIAMWithAllDk, - InitRandomWithAllDk=InitRandomWithAllDk, - params_iam={'c_ei': c_ei, 'c_er': c_er, 'c_es': c_es, - 'ite_max': ite_max_iam, 'epsilon': epsilon_iam, - 'removeNodes': removeNodes, 'connected': connected_iam}, - params_ged={'ged_cost': ged_cost, 'ged_method': ged_method, - 'saveGXL': saveGXL}) - - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list[idx_nb].append(time_total) - print('\nsmallest distance in kernel space: ', dhat) - dis_ks_min_list[idx_nb].append(dhat) - g_best[idx_nb].append(ghat_list) - print('\nnumber of updates of the best graph by IAM: ', nb_updated_iam) - nb_updated_list_iam[idx_nb].append(nb_updated_iam) - print('\nnumber of updates of the best graph by random generation: ', - nb_updated_random) - nb_updated_list_random[idx_nb].append(nb_updated_random) - print('\nnumber of updates of k nearest graphs by IAM: ', nb_updated_k_iam) - nb_updated_k_list_iam[idx_nb].append(nb_updated_k_iam) - print('\nnumber of updates of k nearest graphs by random generation: ', - nb_updated_k_random) - nb_updated_k_list_random[idx_nb].append(nb_updated_k_random) - - # show the best graph and save it to file. - print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat_list[0], labels=nx.get_node_attributes(ghat_list[0], 'atom'), - with_labels=True) - plt.savefig('results/preimage_mix/mutag_median_nb' + str(nb_median) + - '_k' + str(k) + '.png', format="PNG") - # plt.show() - plt.clf() - # print(ghat_list[0].nodes(data=True)) - # print(ghat_list[0].edges(data=True)) - - # compute the corresponding sod in graph space. - sod_tmp, _ = ged_median([ghat_list[0]], Gn_median, ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list[idx_nb].append(sod_tmp) - sod_gs_min_list[idx_nb].append(np.min(sod_tmp)) - print('\nsmallest sod in graph space: ', np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each set of median graphs and k: ', - sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs and k: ', - dis_ks_min_list) - print('\nnumber of updates of the best graph for each set of median graphs and k by IAM: ', - nb_updated_list_iam) - print('\nnumber of updates of the best graph for each set of median graphs and k by random generation: ', - nb_updated_list_random) - print('\nnumber of updates of k nearest graphs for each set of median graphs and k by IAM: ', - nb_updated_k_list_iam) - print('\nnumber of updates of k nearest graphs for each set of median graphs and k by random generation: ', - nb_updated_k_list_random) - print('\ntimes:', time_list) - - - - -############################################################################### -# tests on different numbers of median-sets. - -def test_preimage_mix_median_nb(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 5 # iteration limit for pre-image. - l_max = 500 # update limit for random generation -# alpha_range = np.linspace(0.5, 0.5, 1) - k = 5 # k nearest neighbors - epsilon = 1e-6 - InitIAMWithAllDk = True - InitRandomWithAllDk = True - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - # parameters for IAM function - c_ei=1 - c_er=1 - c_es=1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = True - connected_iam = False - - # number of graphs; we what to compute the median of these graphs. - nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list_iam = [] - nb_updated_list_random = [] - nb_updated_k_list_iam = [] - nb_updated_k_list_random = [] - g_best = [] - for nb_median in nb_median_range: - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') - km_tmp = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) - for i in range(len(Gn)): - for j in range(i, len(Gn)): - km[i, j] = km_tmp[i, j] - km[j, i] = km[i, j] - for i in range(len(Gn)): - for j, idx in enumerate(idx_rdm): - km[i, len(Gn) + j] = km[i, idx] - km[len(Gn) + j, i] = km[i, idx] - for i, idx1 in enumerate(idx_rdm): - for j, idx2 in enumerate(idx_rdm): - km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - time0 = time.time() - dhat, ghat_list, dis_of_each_itr, nb_updated_iam, nb_updated_random, \ - nb_updated_k_iam, nb_updated_k_random = \ - preimage_iam_random_mix(Gn, Gn_median, - alpha_range, range(len(Gn), len(Gn) + nb_median), km, k, r_max, - l_max, gkernel, epsilon=epsilon, InitIAMWithAllDk=InitIAMWithAllDk, - InitRandomWithAllDk=InitRandomWithAllDk, - params_iam={'c_ei': c_ei, 'c_er': c_er, 'c_es': c_es, - 'ite_max': ite_max_iam, 'epsilon': epsilon_iam, - 'removeNodes': removeNodes, 'connected': connected_iam}, - params_ged={'ged_cost': ged_cost, 'ged_method': ged_method, - 'saveGXL': saveGXL}) - - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - print('\nsmallest distance in kernel space: ', dhat) - dis_ks_min_list.append(dhat) - g_best.append(ghat_list) - print('\nnumber of updates of the best graph by IAM: ', nb_updated_iam) - nb_updated_list_iam.append(nb_updated_iam) - print('\nnumber of updates of the best graph by random generation: ', - nb_updated_random) - nb_updated_list_random.append(nb_updated_random) - print('\nnumber of updates of k nearest graphs by IAM: ', nb_updated_k_iam) - nb_updated_k_list_iam.append(nb_updated_k_iam) - print('\nnumber of updates of k nearest graphs by random generation: ', - nb_updated_k_random) - nb_updated_k_list_random.append(nb_updated_k_random) - - # show the best graph and save it to file. - print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat_list[0], labels=nx.get_node_attributes(ghat_list[0], 'atom'), - with_labels=True) - plt.savefig('results/preimage_mix/mutag_median_nb' + str(nb_median) + - '.png', format="PNG") -# plt.show() - plt.clf() -# print(ghat_list[0].nodes(data=True)) -# print(ghat_list[0].edges(data=True)) - - # compute the corresponding sod in graph space. - sod_tmp, _ = ged_median([ghat_list[0]], Gn_median, ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - print('\nsmallest sod in graph space: ', np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each set of median graphs: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs: ', - dis_ks_min_list) - print('\nnumber of updates of the best graph for each set of median graphs by IAM: ', - nb_updated_list_iam) - print('\nnumber of updates of the best graph for each set of median graphs by random generation: ', - nb_updated_list_random) - print('\nnumber of updates of k nearest graphs for each set of median graphs by IAM: ', - nb_updated_k_list_iam) - print('\nnumber of updates of k nearest graphs for each set of median graphs by random generation: ', - nb_updated_k_list_random) - print('\ntimes:', time_list) - - - -############################################################################### -# test on the combination of the two randomly chosen graphs. (the same as in the -# random pre-image paper.) - -def test_preimage_mix_2combination_all_pairs(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 10 # iteration limit for pre-image. - l_max = 500 # update limit for random generation - alpha_range = np.linspace(0.5, 0.5, 1) - k = 5 # k nearest neighbors - epsilon = 1e-6 - InitIAMWithAllDk = True - InitRandomWithAllDk = True - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - # parameters for IAM function - c_ei=1 - c_er=1 - c_es=1 - ite_max_iam = 50 - epsilon_iam = 0.001 - removeNodes = True - connected_iam = False - - nb_update_mat_iam = np.full((len(Gn), len(Gn)), np.inf) - nb_update_mat_random = np.full((len(Gn), len(Gn)), np.inf) - # test on each pair of graphs. -# for idx1 in range(len(Gn) - 1, -1, -1): -# for idx2 in range(idx1, -1, -1): - for idx1 in range(187, 188): - for idx2 in range(167, 168): - g1 = Gn[idx1].copy() - g2 = Gn[idx2].copy() - # Gn[10] = [] - # Gn[10] = [] - - nx.draw(g1, labels=nx.get_node_attributes(g1, 'atom'), with_labels=True) - plt.savefig("results/preimage_mix/mutag187.png", format="PNG") - plt.show() - plt.clf() - nx.draw(g2, labels=nx.get_node_attributes(g2, 'atom'), with_labels=True) - plt.savefig("results/preimage_mix/mutag167.png", format="PNG") - plt.show() - plt.clf() - - ################################################################### -# Gn_mix = [g.copy() for g in Gn] -# Gn_mix.append(g1.copy()) -# Gn_mix.append(g2.copy()) -# -# # compute -# time0 = time.time() -# km = compute_kernel(Gn_mix, gkernel, True) -# time_km = time.time() - time0 -# -# # write Gram matrix to file and read it. -# np.savez('results/gram_matrix_uhpath_itr7_pq0.8.gm', gm=km, gmtime=time_km) - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03.gm.npz') - km = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - for i in range(len(Gn)): - km[i, len(Gn)] = km[i, idx1] - km[i, len(Gn) + 1] = km[i, idx2] - km[len(Gn), i] = km[i, idx1] - km[len(Gn) + 1, i] = km[i, idx2] - km[len(Gn), len(Gn)] = km[idx1, idx1] - km[len(Gn), len(Gn) + 1] = km[idx1, idx2] - km[len(Gn) + 1, len(Gn)] = km[idx2, idx1] - km[len(Gn) + 1, len(Gn) + 1] = km[idx2, idx2] - - ################################################################### -# # use only the two graphs in median set as candidates. -# Gn = [g1.copy(), g2.copy()] -# Gn_mix = Gn + [g1.copy(), g2.copy()] -# # compute -# time0 = time.time() -# km = compute_kernel(Gn_mix, gkernel, True) -# time_km = time.time() - time0 - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list_iam = [] - nb_updated_list_random = [] - nb_updated_k_list_iam = [] - nb_updated_k_list_random = [] - g_best = [] - # for each alpha - for alpha in alpha_range: - print('\n-------------------------------------------------------\n') - print('alpha =', alpha) - time0 = time.time() - dhat, ghat_list, dis_of_each_itr, nb_updated_iam, nb_updated_random, \ - nb_updated_k_iam, nb_updated_k_random = \ - preimage_iam_random_mix(Gn, [g1, g2], - [alpha, 1 - alpha], range(len(Gn), len(Gn) + 2), km, k, r_max, - l_max, gkernel, epsilon=epsilon, InitIAMWithAllDk=InitIAMWithAllDk, - InitRandomWithAllDk=InitRandomWithAllDk, - params_iam={'c_ei': c_ei, 'c_er': c_er, 'c_es': c_es, - 'ite_max': ite_max_iam, 'epsilon': epsilon_iam, - 'removeNodes': removeNodes, 'connected': connected_iam}, - params_ged={'ged_cost': ged_cost, 'ged_method': ged_method, - 'saveGXL': saveGXL}) - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - dis_ks_min_list.append(dhat) - g_best.append(ghat_list) - nb_updated_list_iam.append(nb_updated_iam) - nb_updated_list_random.append(nb_updated_random) - nb_updated_k_list_iam.append(nb_updated_k_iam) - nb_updated_k_list_random.append(nb_updated_k_random) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_ks_min_list[idx]) - print('one of the possible corresponding pre-images is') - nx.draw(g_best[idx][0], labels=nx.get_node_attributes(g_best[idx][0], 'atom'), - with_labels=True) - plt.savefig('results/preimage_mix/mutag' + str(idx1) + '_' + str(idx2) - + '_alpha' + str(item) + '.png', format="PNG") -# plt.show() - plt.clf() -# print(g_best[idx][0].nodes(data=True)) -# print(g_best[idx][0].edges(data=True)) - - # for g in g_best[idx]: - # draw_Letter_graph(g, savepath='results/gk_iam/') - ## nx.draw_networkx(g) - ## plt.show() - # print(g.nodes(data=True)) - # print(g.edges(data=True)) - - # compute the corresponding sod in graph space. - for idx, item in enumerate(alpha_range): - sod_tmp, _ = ged_median([g_best[0]], [g1, g2], ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each alpha: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each alpha: ', dis_ks_min_list) - print('\nnumber of updates of the best graph for each alpha by IAM: ', nb_updated_list_iam) - print('\nnumber of updates of the best graph for each alpha by random generation: ', - nb_updated_list_random) - print('\nnumber of updates of k nearest graphs for each alpha by IAM: ', - nb_updated_k_list_iam) - print('\nnumber of updates of k nearest graphs for each alpha by random generation: ', - nb_updated_k_list_random) - print('\ntimes:', time_list) - nb_update_mat_iam[idx1, idx2] = nb_updated_list_iam[0] - nb_update_mat_random[idx1, idx2] = nb_updated_list_random[0] - - str_fw = 'graphs %d and %d: %d times by IAM, %d times by random generation.\n' \ - % (idx1, idx2, nb_updated_list_iam[0], nb_updated_list_random[0]) - with open('results/preimage_mix/nb_updates.txt', 'r+') as file: - content = file.read() - file.seek(0, 0) - file.write(str_fw + content) - -############################################################################### - - -if __name__ == '__main__': -############################################################################### -# test on the combination of the two randomly chosen graphs. (the same as in the -# random pre-image paper.) -# test_preimage_mix_2combination_all_pairs() - -############################################################################### -# tests on different numbers of median-sets. -# test_preimage_mix_median_nb() - -############################################################################### -# tests on different values on grid of median-sets and k. - test_preimage_mix_grid_k_median_nb() \ No newline at end of file diff --git a/gklearn/preimage/test_preimage_random.py b/gklearn/preimage/test_preimage_random.py deleted file mode 100644 index bb77d2f..0000000 --- a/gklearn/preimage/test_preimage_random.py +++ /dev/null @@ -1,398 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Sep 5 15:59:00 2019 - -@author: ljia -""" - -import numpy as np -import networkx as nx -import matplotlib.pyplot as plt -import time -import random -#from tqdm import tqdm - -from gklearn.utils.graphfiles import loadDataset -from gklearn.preimage.preimage_random import preimage_random -from gklearn.preimage.ged import ged_median -from gklearn.preimage.utils import compute_kernel, get_same_item_indices, remove_edges - - -############################################################################### -# tests on different values on grid of median-sets and k. - -def test_preimage_random_grid_k_median_nb(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 5 # iteration limit for pre-image. - l = 500 # update limit for random generation -# alpha_range = np.linspace(0.5, 0.5, 1) -# k = 5 # k nearest neighbors - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - - # number of graphs; we what to compute the median of these graphs. - nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - # number of nearest neighbors. - k_range = [5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 100] - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - g_best = [] - for idx_nb, nb_median in enumerate(nb_median_range): - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') - km_tmp = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) - for i in range(len(Gn)): - for j in range(i, len(Gn)): - km[i, j] = km_tmp[i, j] - km[j, i] = km[i, j] - for i in range(len(Gn)): - for j, idx in enumerate(idx_rdm): - km[i, len(Gn) + j] = km[i, idx] - km[len(Gn) + j, i] = km[i, idx] - for i, idx1 in enumerate(idx_rdm): - for j, idx2 in enumerate(idx_rdm): - km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - - time_list.append([]) - dis_ks_min_list.append([]) - sod_gs_list.append([]) - sod_gs_min_list.append([]) - nb_updated_list.append([]) - g_best.append([]) - - for k in k_range: - print('\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n') - print('k =', k) - time0 = time.time() - dhat, ghat, nb_updated = preimage_random(Gn, Gn_median, alpha_range, - range(len(Gn), len(Gn) + nb_median), km, k, r_max, l, gkernel) - - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list[idx_nb].append(time_total) - print('\nsmallest distance in kernel space: ', dhat) - dis_ks_min_list[idx_nb].append(dhat) - g_best[idx_nb].append(ghat) - print('\nnumber of updates of the best graph: ', nb_updated) - nb_updated_list[idx_nb].append(nb_updated) - - # show the best graph and save it to file. - print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat, labels=nx.get_node_attributes(ghat, 'atom'), - with_labels=True) - plt.savefig('results/preimage_random/mutag_median_nb' + str(nb_median) + - '_k' + str(k) + '.png', format="PNG") - # plt.show() - plt.clf() - # print(ghat_list[0].nodes(data=True)) - # print(ghat_list[0].edges(data=True)) - - # compute the corresponding sod in graph space. - sod_tmp, _ = ged_median([ghat], Gn_median, ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list[idx_nb].append(sod_tmp) - sod_gs_min_list[idx_nb].append(np.min(sod_tmp)) - print('\nsmallest sod in graph space: ', np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each set of median graphs and k: ', - sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs and k: ', - dis_ks_min_list) - print('\nnumber of updates of the best graph for each set of median graphs and k by IAM: ', - nb_updated_list) - print('\ntimes:', time_list) - - - - -############################################################################### -# tests on different numbers of median-sets. - -def test_preimage_random_median_nb(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:50] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - - lmbda = 0.03 # termination probalility - r_max = 5 # iteration limit for pre-image. - l = 500 # update limit for random generation -# alpha_range = np.linspace(0.5, 0.5, 1) - k = 5 # k nearest neighbors - # parameters for GED function - ged_cost='CHEM_1' - ged_method='IPFP' - saveGXL='gedlib' - - # number of graphs; we what to compute the median of these graphs. - nb_median_range = [2, 3, 4, 5, 10, 20, 30, 40, 50, 100] - - # find out all the graphs classified to positive group 1. - idx_dict = get_same_item_indices(y_all) - Gn = [Gn[i] for i in idx_dict[1]] - -# # compute Gram matrix. -# time0 = time.time() -# km = compute_kernel(Gn, gkernel, True) -# time_km = time.time() - time0 -# # write Gram matrix to file. -# np.savez('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm', gm=km, gmtime=time_km) - - - time_list = [] - dis_ks_min_list = [] - sod_gs_list = [] - sod_gs_min_list = [] - nb_updated_list = [] - g_best = [] - for nb_median in nb_median_range: - print('\n-------------------------------------------------------') - print('number of median graphs =', nb_median) - random.seed(1) - idx_rdm = random.sample(range(len(Gn)), nb_median) - print('graphs chosen:', idx_rdm) - Gn_median = [Gn[idx].copy() for idx in idx_rdm] - -# for g in Gn_median: -# nx.draw(g, labels=nx.get_node_attributes(g, 'atom'), with_labels=True) -## plt.savefig("results/preimage_mix/mutag.png", format="PNG") -# plt.show() -# plt.clf() - - ################################################################### - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03_mutag_positive.gm.npz') - km_tmp = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - km = np.zeros((len(Gn) + nb_median, len(Gn) + nb_median)) - for i in range(len(Gn)): - for j in range(i, len(Gn)): - km[i, j] = km_tmp[i, j] - km[j, i] = km[i, j] - for i in range(len(Gn)): - for j, idx in enumerate(idx_rdm): - km[i, len(Gn) + j] = km[i, idx] - km[len(Gn) + j, i] = km[i, idx] - for i, idx1 in enumerate(idx_rdm): - for j, idx2 in enumerate(idx_rdm): - km[len(Gn) + i, len(Gn) + j] = km[idx1, idx2] - - ################################################################### - alpha_range = [1 / nb_median] * nb_median - time0 = time.time() - dhat, ghat, nb_updated = preimage_random(Gn, Gn_median, alpha_range, - range(len(Gn), len(Gn) + nb_median), km, k, r_max, l, gkernel) - - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - print('\nsmallest distance in kernel space: ', dhat) - dis_ks_min_list.append(dhat) - g_best.append(ghat) - print('\nnumber of updates of the best graph: ', nb_updated) - nb_updated_list.append(nb_updated) - - # show the best graph and save it to file. - print('the shortest distance is', dhat) - print('one of the possible corresponding pre-images is') - nx.draw(ghat, labels=nx.get_node_attributes(ghat, 'atom'), - with_labels=True) - plt.savefig('results/preimage_random/mutag_median_nb' + str(nb_median) + - '.png', format="PNG") -# plt.show() - plt.clf() -# print(ghat_list[0].nodes(data=True)) -# print(ghat_list[0].edges(data=True)) - - # compute the corresponding sod in graph space. - sod_tmp, _ = ged_median([ghat], Gn_median, ged_cost=ged_cost, - ged_method=ged_method, saveGXL=saveGXL) - sod_gs_list.append(sod_tmp) - sod_gs_min_list.append(np.min(sod_tmp)) - print('\nsmallest sod in graph space: ', np.min(sod_tmp)) - - print('\nsods in graph space: ', sod_gs_list) - print('\nsmallest sod in graph space for each set of median graphs: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each set of median graphs: ', - dis_ks_min_list) - print('\nnumber of updates of the best graph for each set of median graphs: ', - nb_updated_list) - print('\ntimes:', time_list) - - - -############################################################################### -# test on the combination of the two randomly chosen graphs. (the same as in the -# random pre-image paper.) - -def test_random_preimage_2combination(): - ds = {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG_A.txt', - 'extra_params': {}} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['extra_params']) -# Gn = Gn[0:12] - remove_edges(Gn) - gkernel = 'marginalizedkernel' - -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, gkernel=gkernel) -# print(dis_max, dis_min, dis_mean) - - lmbda = 0.03 # termination probalility - r_max = 10 # iteration limit for pre-image. - l = 500 - alpha_range = np.linspace(0, 1, 11) - k = 5 # k nearest neighbors - - # randomly select two molecules - np.random.seed(1) - idx_gi = [187, 167] # np.random.randint(0, len(Gn), 2) - g1 = Gn[idx_gi[0]].copy() - g2 = Gn[idx_gi[1]].copy() - -# nx.draw(g1, labels=nx.get_node_attributes(g1, 'atom'), with_labels=True) -# plt.savefig("results/random_preimage/mutag10.png", format="PNG") -# plt.show() -# nx.draw(g2, labels=nx.get_node_attributes(g2, 'atom'), with_labels=True) -# plt.savefig("results/random_preimage/mutag11.png", format="PNG") -# plt.show() - - ###################################################################### -# Gn_mix = [g.copy() for g in Gn] -# Gn_mix.append(g1.copy()) -# Gn_mix.append(g2.copy()) -# -## g_tmp = iam([g1, g2]) -## nx.draw_networkx(g_tmp) -## plt.show() -# -# # compute -# time0 = time.time() -# km = compute_kernel(Gn_mix, gkernel, True) -# time_km = time.time() - time0 - - ################################################################### - idx1 = idx_gi[0] - idx2 = idx_gi[1] - gmfile = np.load('results/gram_matrix_marg_itr10_pq0.03.gm.npz') - km = gmfile['gm'] - time_km = gmfile['gmtime'] - # modify mixed gram matrix. - for i in range(len(Gn)): - km[i, len(Gn)] = km[i, idx1] - km[i, len(Gn) + 1] = km[i, idx2] - km[len(Gn), i] = km[i, idx1] - km[len(Gn) + 1, i] = km[i, idx2] - km[len(Gn), len(Gn)] = km[idx1, idx1] - km[len(Gn), len(Gn) + 1] = km[idx1, idx2] - km[len(Gn) + 1, len(Gn)] = km[idx2, idx1] - km[len(Gn) + 1, len(Gn) + 1] = km[idx2, idx2] - - ################################################################### - - time_list = [] - nb_updated_list = [] - g_best = [] - dis_ks_min_list = [] - # for each alpha - for alpha in alpha_range: - print('\n-------------------------------------------------------\n') - print('alpha =', alpha) - time0 = time.time() - dhat, ghat, nb_updated = preimage_random(Gn, [g1, g2], [alpha, 1 - alpha], - range(len(Gn), len(Gn) + 2), km, - k, r_max, l, gkernel) - time_total = time.time() - time0 + time_km - print('time: ', time_total) - time_list.append(time_total) - dis_ks_min_list.append(dhat) - g_best.append(ghat) - nb_updated_list.append(nb_updated) - - # show best graphs and save them to file. - for idx, item in enumerate(alpha_range): - print('when alpha is', item, 'the shortest distance is', dis_ks_min_list[idx]) - print('one of the possible corresponding pre-images is') - nx.draw(g_best[idx], labels=nx.get_node_attributes(g_best[idx], 'atom'), - with_labels=True) - plt.show() - plt.savefig('results/random_preimage/mutag_alpha' + str(item) + '.png', format="PNG") - plt.clf() - print(g_best[idx].nodes(data=True)) - print(g_best[idx].edges(data=True)) - -# # compute the corresponding sod in graph space. (alpha range not considered.) -# sod_tmp, _ = median_distance(g_best[0], Gn_let) -# sod_gs_list.append(sod_tmp) -# sod_gs_min_list.append(np.min(sod_tmp)) -# sod_ks_min_list.append(sod_ks) -# nb_updated_list.append(nb_updated) - -# print('\nsmallest sod in graph space for each alpha: ', sod_gs_min_list) - print('\nsmallest distance in kernel space for each alpha: ', dis_ks_min_list) - print('\nnumber of updates for each alpha: ', nb_updated_list) - print('\ntimes:', time_list) - -############################################################################### - - -if __name__ == '__main__': -############################################################################### -# test on the combination of the two randomly chosen graphs. (the same as in the -# random pre-image paper.) -# test_random_preimage_2combination() - -############################################################################### -# tests all algorithms on different numbers of median-sets. - test_preimage_random_median_nb() - -############################################################################### -# tests all algorithms on different values on grid of median-sets and k. -# test_preimage_random_grid_k_median_nb() \ No newline at end of file diff --git a/gklearn/preimage/xp_fit_method.py b/gklearn/preimage/xp_fit_method.py deleted file mode 100644 index ead2786..0000000 --- a/gklearn/preimage/xp_fit_method.py +++ /dev/null @@ -1,935 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Tue Jan 14 15:39:29 2020 - -@author: ljia -""" -import numpy as np -import random -import csv -from shutil import copyfile -import networkx as nx -import matplotlib.pyplot as plt -import os -import time - -from gklearn.utils.graphfiles import loadDataset, loadGXL, saveGXL -from gklearn.preimage.test_k_closest_graphs import median_on_k_closest_graphs, reform_attributes -from gklearn.preimage.utils import get_same_item_indices, kernel_distance_matrix, compute_kernel -from gklearn.preimage.find_best_k import getRelations - - -def get_dataset(ds_name): - if ds_name == 'Letter-high': # node non-symb - dataset = 'cpp_ext/data/collections/Letter.xml' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/HIGH/' - Gn, y_all = loadDataset(dataset, extra_params=graph_dir) - for G in Gn: - reform_attributes(G, na_names=['x', 'y']) - G.graph['node_labels'] = [] - G.graph['edge_labels'] = [] - G.graph['node_attrs'] = ['x', 'y'] - G.graph['edge_attrs'] = [] - elif ds_name == 'Letter-med': # node non-symb - dataset = 'cpp_ext/data/collections/Letter.xml' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/MED/' - Gn, y_all = loadDataset(dataset, extra_params=graph_dir) - for G in Gn: - reform_attributes(G, na_names=['x', 'y']) - G.graph['node_labels'] = [] - G.graph['edge_labels'] = [] - G.graph['node_attrs'] = ['x', 'y'] - G.graph['edge_attrs'] = [] - elif ds_name == 'Letter-low': # node non-symb - dataset = 'cpp_ext/data/collections/Letter.xml' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/LOW/' - Gn, y_all = loadDataset(dataset, extra_params=graph_dir) - for G in Gn: - reform_attributes(G, na_names=['x', 'y']) - G.graph['node_labels'] = [] - G.graph['edge_labels'] = [] - G.graph['node_attrs'] = ['x', 'y'] - G.graph['edge_attrs'] = [] - elif ds_name == 'Fingerprint': -# dataset = 'cpp_ext/data/collections/Fingerprint.xml' -# graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/Fingerprint/node_attrs/' -# Gn, y_all = loadDataset(dataset, extra_params=graph_dir) -# for G in Gn: -# reform_attributes(G) - dataset = '../../datasets/Fingerprint/Fingerprint_A.txt' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/Fingerprint/node_attrs/' - Gn, y_all = loadDataset(dataset) - elif ds_name == 'SYNTHETIC': - pass - elif ds_name == 'SYNTHETICnew': - dataset = '../../datasets/SYNTHETICnew/SYNTHETICnew_A.txt' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/SYNTHETICnew' -# dataset = '../../datasets/Letter-high/Letter-high_A.txt' -# graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/HIGH/' - Gn, y_all = loadDataset(dataset) - elif ds_name == 'Synthie': - pass - elif ds_name == 'COIL-DEL': - dataset = '../../datasets/COIL-DEL/COIL-DEL_A.txt' - graph_dir = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/generated_datsets/COIL-DEL/' - Gn, y_all = loadDataset(dataset) - elif ds_name == 'COIL-RAG': - pass - elif ds_name == 'COLORS-3': - pass - elif ds_name == 'FRANKENSTEIN': - pass - - return Gn, y_all, graph_dir - - -def init_output_file(ds_name, gkernel, fit_method, dir_output): -# fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.csv' - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow(['dataset', 'graph kernel', 'edit cost', - 'GED method', 'attr distance', 'fit method', 'k', - 'target', 'repeat', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', 'fitting time', 'generating time', 'total time', - 'median set']) - f_detail.close() - -# fn_output_summary = 'results_summary.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - fn_output_summary = 'results_summary.' + ds_name + '.' + gkernel + '.csv' - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow(['dataset', 'graph kernel', 'edit cost', - 'GED method', 'attr distance', 'fit method', 'k', - 'target', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', 'fitting time', 'generating time', 'total time', - '# SOD SM -> GM', '# dis_k SM -> GM', - '# dis_k gi -> SM', '# dis_k gi -> GM', 'repeats better SOD SM -> GM', - 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', - 'repeats better dis_k gi -> GM']) - f_summary.close() - - return fn_output_detail, fn_output_summary - - -def xp_fit_method_for_non_symbolic(parameters, save_results=True, initial_solutions=1, - Gn_data=None, k_dis_data=None, Kmatrix=None, - is_separate=False): - - # 1. set parameters. - print('1. setting parameters...') - ds_name = parameters['ds_name'] - gkernel = parameters['gkernel'] - edit_cost_name = parameters['edit_cost_name'] - ged_method = parameters['ged_method'] - attr_distance = parameters['attr_distance'] - fit_method = parameters['fit_method'] - init_ecc = parameters['init_ecc'] - - node_label = None - edge_label = None - dir_output = 'results/xp_fit_method/' - - - # 2. get dataset. - print('2. getting dataset...') - if Gn_data is None: - Gn, y_all, graph_dir = get_dataset(ds_name) - else: - Gn = Gn_data[0] - y_all = Gn_data[1] - graph_dir = Gn_data[2] - - - # 3. compute kernel distance matrix. - print('3. computing kernel distance matrix...') - if k_dis_data is None: - dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, - None, Kmatrix=Kmatrix, gkernel=gkernel) - else: -# dis_mat = k_dis_data[0] -# dis_max = k_dis_data[1] -# dis_min = k_dis_data[2] -# dis_mean = k_dis_data[3] -# print('pair distances - dis_max, dis_min, dis_mean:', dis_max, dis_min, dis_mean) - pass - - - if save_results: - # create result files. - print('creating output files...') - fn_output_detail, fn_output_summary = init_output_file(ds_name, gkernel, - fit_method, dir_output) - - - # start repeats. - repeats = 1 -# k_list = range(2, 11) - k_list = [0] - # get indices by classes. - y_idx = get_same_item_indices(y_all) - random.seed(1) - rdn_seed_list = random.sample(range(0, repeats * 100), repeats) - - for k in k_list: -# print('\n--------- k =', k, '----------') - - sod_sm_mean_list = [] - sod_gm_mean_list = [] - dis_k_sm_mean_list = [] - dis_k_gm_mean_list = [] - dis_k_gi_min_mean_list = [] - time_fitting_mean_list = [] - time_generating_mean_list = [] - time_total_mean_list = [] - - # 3. start generating and computing over targets. - print('4. starting generating and computing over targets......') - for i, (y, values) in enumerate(y_idx.items()): -# y = 'I' -# values = y_idx[y] -# values = values[0:10] - print('\ny =', y) -# if y.strip() == 'A': -# continue - - k = len(values) - print('\n--------- k =', k, '----------') - - if k < 2: - print('\nk = ', k, ', skip.\n') - continue - - sod_sm_list = [] - sod_gm_list = [] - dis_k_sm_list = [] - dis_k_gm_list = [] - dis_k_gi_min_list = [] - time_fitting_list = [] - time_generating_list = [] - time_total_list = [] - nb_sod_sm2gm = [0, 0, 0] - nb_dis_k_sm2gm = [0, 0, 0] - nb_dis_k_gi2sm = [0, 0, 0] - nb_dis_k_gi2gm = [0, 0, 0] - repeats_better_sod_sm2gm = [] - repeats_better_dis_k_sm2gm = [] - repeats_better_dis_k_gi2sm = [] - repeats_better_dis_k_gi2gm = [] - - # get Gram matrix for this part of data. - if Kmatrix is not None: - if is_separate: - Kmatrix_sub = Kmatrix[i].copy() - else: - Kmatrix_sub = Kmatrix[values,:] - Kmatrix_sub = Kmatrix_sub[:,values] - else: - Kmatrix_sub = None - - for repeat in range(repeats): - print('\nrepeat =', repeat) - random.seed(rdn_seed_list[repeat]) - median_set_idx_idx = random.sample(range(0, len(values)), k) - median_set_idx = [values[idx] for idx in median_set_idx_idx] - print('median set: ', median_set_idx) - Gn_median = [Gn[g] for g in values] -# from notebooks.utils.plot_all_graphs import draw_Fingerprint_graph -# for Gn in Gn_median: -# draw_Fingerprint_graph(Gn, save=None) - - # GENERATING & COMPUTING!! - res_sods, res_dis_ks, res_times = median_on_k_closest_graphs(Gn_median, - node_label, edge_label, - gkernel, k, fit_method=fit_method, graph_dir=graph_dir, - edit_cost_constants=None, group_min=median_set_idx_idx, - dataset=ds_name, initial_solutions=initial_solutions, - edit_cost_name=edit_cost_name, init_ecc=init_ecc, - Kmatrix=Kmatrix_sub, parallel=False) - sod_sm = res_sods[0] - sod_gm = res_sods[1] - dis_k_sm = res_dis_ks[0] - dis_k_gm = res_dis_ks[1] - dis_k_gi = res_dis_ks[2] - dis_k_gi_min = res_dis_ks[3] - idx_dis_k_gi_min = res_dis_ks[4] - time_fitting = res_times[0] - time_generating = res_times[1] - - # write result detail. - sod_sm2gm = getRelations(np.sign(sod_gm - sod_sm)) - dis_k_sm2gm = getRelations(np.sign(dis_k_gm - dis_k_sm)) - dis_k_gi2sm = getRelations(np.sign(dis_k_sm - dis_k_gi_min)) - dis_k_gi2gm = getRelations(np.sign(dis_k_gm - dis_k_gi_min)) - if save_results: - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow([ds_name, gkernel, - edit_cost_name, ged_method, attr_distance, - fit_method, k, y, repeat, - sod_sm, sod_gm, dis_k_sm, dis_k_gm, - dis_k_gi_min, sod_sm2gm, dis_k_sm2gm, dis_k_gi2sm, - dis_k_gi2gm, time_fitting, time_generating, - time_fitting + time_generating, median_set_idx]) - f_detail.close() - - # compute result summary. - sod_sm_list.append(sod_sm) - sod_gm_list.append(sod_gm) - dis_k_sm_list.append(dis_k_sm) - dis_k_gm_list.append(dis_k_gm) - dis_k_gi_min_list.append(dis_k_gi_min) - time_fitting_list.append(time_fitting) - time_generating_list.append(time_generating) - time_total_list.append(time_fitting + time_generating) - # # SOD SM -> GM - if sod_sm > sod_gm: - nb_sod_sm2gm[0] += 1 - repeats_better_sod_sm2gm.append(repeat) - elif sod_sm == sod_gm: - nb_sod_sm2gm[1] += 1 - elif sod_sm < sod_gm: - nb_sod_sm2gm[2] += 1 - # # dis_k SM -> GM - if dis_k_sm > dis_k_gm: - nb_dis_k_sm2gm[0] += 1 - repeats_better_dis_k_sm2gm.append(repeat) - elif dis_k_sm == dis_k_gm: - nb_dis_k_sm2gm[1] += 1 - elif dis_k_sm < dis_k_gm: - nb_dis_k_sm2gm[2] += 1 - # # dis_k gi -> SM - if dis_k_gi_min > dis_k_sm: - nb_dis_k_gi2sm[0] += 1 - repeats_better_dis_k_gi2sm.append(repeat) - elif dis_k_gi_min == dis_k_sm: - nb_dis_k_gi2sm[1] += 1 - elif dis_k_gi_min < dis_k_sm: - nb_dis_k_gi2sm[2] += 1 - # # dis_k gi -> GM - if dis_k_gi_min > dis_k_gm: - nb_dis_k_gi2gm[0] += 1 - repeats_better_dis_k_gi2gm.append(repeat) - elif dis_k_gi_min == dis_k_gm: - nb_dis_k_gi2gm[1] += 1 - elif dis_k_gi_min < dis_k_gm: - nb_dis_k_gi2gm[2] += 1 - - # save median graphs. - fname_sm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/set_median.gxl' - fn_pre_sm_new = dir_output + 'medians/set_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + str(y) + '.repeat' + str(repeat) - copyfile(fname_sm, fn_pre_sm_new + '.gxl') - fname_gm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/gen_median.gxl' - fn_pre_gm_new = dir_output + 'medians/gen_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + str(y) + '.repeat' + str(repeat) - copyfile(fname_gm, fn_pre_gm_new + '.gxl') - G_best_kernel = Gn_median[idx_dis_k_gi_min].copy() -# reform_attributes(G_best_kernel) - fn_pre_g_best_kernel = dir_output + 'medians/g_best_kernel.' + fit_method \ - + '.k' + str(int(k)) + '.y' + str(y) + '.repeat' + str(repeat) - saveGXL(G_best_kernel, fn_pre_g_best_kernel + '.gxl', method='default') - - # plot median graphs. - if ds_name == 'Letter-high' or ds_name == 'Letter-med' or ds_name == 'Letter-low': - set_median = loadGXL(fn_pre_sm_new + '.gxl') - gen_median = loadGXL(fn_pre_gm_new + '.gxl') - draw_Letter_graph(set_median, fn_pre_sm_new) - draw_Letter_graph(gen_median, fn_pre_gm_new) - draw_Letter_graph(G_best_kernel, fn_pre_g_best_kernel) - - # write result summary for each letter. - sod_sm_mean_list.append(np.mean(sod_sm_list)) - sod_gm_mean_list.append(np.mean(sod_gm_list)) - dis_k_sm_mean_list.append(np.mean(dis_k_sm_list)) - dis_k_gm_mean_list.append(np.mean(dis_k_gm_list)) - dis_k_gi_min_mean_list.append(np.mean(dis_k_gi_min_list)) - time_fitting_mean_list.append(np.mean(time_fitting_list)) - time_generating_mean_list.append(np.mean(time_generating_list)) - time_total_mean_list.append(np.mean(time_total_list)) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean_list[-1] - sod_sm_mean_list[-1])) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_sm_mean_list[-1])) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - if save_results: - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, - edit_cost_name, ged_method, attr_distance, - fit_method, k, y, - sod_sm_mean_list[-1], sod_gm_mean_list[-1], - dis_k_sm_mean_list[-1], dis_k_gm_mean_list[-1], - dis_k_gi_min_mean_list[-1], sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean, - time_fitting_mean_list[-1], time_generating_mean_list[-1], - time_total_mean_list[-1], nb_sod_sm2gm, - nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm, - repeats_better_sod_sm2gm, repeats_better_dis_k_sm2gm, - repeats_better_dis_k_gi2sm, repeats_better_dis_k_gi2gm]) - f_summary.close() - - - # write result summary for each letter. - sod_sm_mean = np.mean(sod_sm_mean_list) - sod_gm_mean = np.mean(sod_gm_mean_list) - dis_k_sm_mean = np.mean(dis_k_sm_mean_list) - dis_k_gm_mean = np.mean(dis_k_gm_mean_list) - dis_k_gi_min_mean = np.mean(dis_k_gi_min_list) - time_fitting_mean = np.mean(time_fitting_list) - time_generating_mean = np.mean(time_generating_list) - time_total_mean = np.mean(time_total_list) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean - sod_sm_mean)) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_sm_mean)) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean - dis_k_gi_min_mean)) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_gi_min_mean)) - if save_results: - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, - edit_cost_name, ged_method, attr_distance, - fit_method, k, 'all', - sod_sm_mean, sod_gm_mean, dis_k_sm_mean, dis_k_gm_mean, - dis_k_gi_min_mean, sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean, - time_fitting_mean, time_generating_mean, time_total_mean]) - f_summary.close() - - print('\ncomplete.') - - -#Dessin median courrant -def draw_Letter_graph(graph, file_prefix): - plt.figure() - pos = {} - for n in graph.nodes: - pos[n] = np.array([float(graph.node[n]['x']),float(graph.node[n]['y'])]) - nx.draw_networkx(graph, pos) - plt.savefig(file_prefix + '.eps', format='eps', dpi=300) -# plt.show() - plt.clf() - - -def compute_gm_for_each_class(Gn, y_all, gkernel, parallel='imap_unordered', is_separate=True): - - if is_separate: - print('the Gram matrix is computed for each class.') - y_idx = get_same_item_indices(y_all) - Kmatrix = [] - run_time = [] - k_dis_data = [] - for i, (y, values) in enumerate(y_idx.items()): - print('The ', str(i), ' class:') - Gn_i = [Gn[val] for val in values] - time0 = time.time() - Kmatrix.append(compute_kernel(Gn_i, gkernel, None, None, True, parallel=parallel)) - run_time.append(time.time() - time0) - k_dis_data.append(kernel_distance_matrix(Gn_i, None, None, - Kmatrix=Kmatrix[i], gkernel=gkernel, verbose=True)) - np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', - Kmatrix=Kmatrix, run_time=run_time, is_separate=is_separate) - dis_max = np.max([item[1] for item in k_dis_data]) - dis_min = np.min([item[2] for item in k_dis_data]) - dis_mean = np.mean([item[3] for item in k_dis_data]) - print('pair distances - dis_max, dis_min, dis_mean:', dis_max, dis_min, - dis_mean) - - else: - time0 = time.time() - Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel=parallel) - run_time = time.time() - time0 - np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', - Kmatrix=Kmatrix, run_time=run_time, is_separate=is_separate) - k_dis_data = kernel_distance_matrix(Gn, None, None, - Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) - print('the Gram matrix is computed for the whole dataset.') - print('pair distances - dis_max, dis_min, dis_mean:', k_dis_data[1], - k_dis_data[2], k_dis_data[3]) - - print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean] - return Kmatrix, run_time, k_dis_data - - -if __name__ == "__main__": -# #### xp 1: Letter-high, spkernel. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Letter-high' -# gkernel = 'spkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -# # remove graphs without edges. -# Gn = [(idx, G) for idx, G in enumerate(Gn) if nx.number_of_edges(G) != 0] -# idx = [G[0] for G in Gn] -# Gn = [G[1] for G in Gn] -# y_all = [y_all[i] for i in idx] -## Gn = Gn[0:50] -## y_all = y_all[0:50] -# # compute pair distances. -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=None, gkernel=gkernel, verbose=True) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# # fitting and computing. -# fit_methods = ['random', 'expert', 'k-graphs'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method} -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean]) - - -# #### xp 2: Letter-high, sspkernel. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Letter-high' -# gkernel = 'structuralspkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -## Gn = Gn[0:50] -## y_all = y_all[0:50] -# # compute pair distances. -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=None, gkernel=gkernel, verbose=True) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# # fitting and computing. -# fit_methods = ['random', 'expert', 'k-graphs'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method} -# print('parameters: ', parameters) -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean]) - - -# #### xp 3: SYNTHETICnew, sspkernel, using NON_SYMBOLIC. -# gmfile = np.load('results/xp_fit_method/Kmatrix.SYNTHETICnew.structuralspkernel.gm.npz') -# Kmatrix = gmfile['Kmatrix'] -# run_time = gmfile['run_time'] -# # normalization -# Kmatrix_diag = Kmatrix.diagonal().copy() -# for i in range(len(Kmatrix)): -# for j in range(i, len(Kmatrix)): -# Kmatrix[i][j] /= np.sqrt(Kmatrix_diag[i] * Kmatrix_diag[j]) -# Kmatrix[j][i] = Kmatrix[i][j] -## np.savez('results/xp_fit_method/Kmatrix.SYNTHETICnew.spkernel.gm', -## Kmatrix=Kmatrix, run_time=run_time) -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'SYNTHETICnew' -# gkernel = 'structuralspkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -# # remove graphs without nodes and edges. -# Gn = [(idx, G) for idx, G in enumerate(Gn) if (nx.number_of_nodes(G) != 0 -# and nx.number_of_edges(G) != 0)] -# idx = [G[0] for G in Gn] -# Gn = [G[1] for G in Gn] -# y_all = [y_all[i] for i in idx] -## Gn = Gn[0:10] -## y_all = y_all[0:10] -# for G in Gn: -# G.graph['filename'] = 'graph' + str(G.graph['name']) + '.gxl' -# # compute pair distances. -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# # fitting and computing. -# fit_methods = ['k-graphs', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'NON_SYMBOLIC', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method} -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=1, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - -# ### xp 4: SYNTHETICnew, spkernel, using NON_SYMBOLIC. -# gmfile = np.load('results/xp_fit_method/Kmatrix.SYNTHETICnew.spkernel.gm.npz') -# Kmatrix = gmfile['Kmatrix'] -# # normalization -# Kmatrix_diag = Kmatrix.diagonal().copy() -# for i in range(len(Kmatrix)): -# for j in range(i, len(Kmatrix)): -# Kmatrix[i][j] /= np.sqrt(Kmatrix_diag[i] * Kmatrix_diag[j]) -# Kmatrix[j][i] = Kmatrix[i][j] -# run_time = 21821.35 -# np.savez('results/xp_fit_method/Kmatrix.SYNTHETICnew.spkernel.gm', -# Kmatrix=Kmatrix, run_time=run_time) -# -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'SYNTHETICnew' -# gkernel = 'spkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -## # remove graphs without nodes and edges. -## Gn = [(idx, G) for idx, G in enumerate(Gn) if (nx.number_of_node(G) != 0 -## and nx.number_of_edges(G) != 0)] -## idx = [G[0] for G in Gn] -## Gn = [G[1] for G in Gn] -## y_all = [y_all[i] for i in idx] -## Gn = Gn[0:5] -## y_all = y_all[0:5] -# for G in Gn: -# G.graph['filename'] = 'graph' + str(G.graph['name']) + '.gxl' -# -# # compute/read Gram matrix and pair distances. -## Kmatrix = compute_kernel(Gn, gkernel, None, None, True) -## np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -## Kmatrix=Kmatrix) -# gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -# Kmatrix = gmfile['Kmatrix'] -# run_time = gmfile['run_time'] -## Kmatrix = Kmatrix[[0,1,2,3,4],:] -## Kmatrix = Kmatrix[:,[0,1,2,3,4]] -# print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## Kmatrix = np.zeros((len(Gn), len(Gn))) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# -# # fitting and computing. -# fit_methods = ['k-graphs', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'NON_SYMBOLIC', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method} -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=1, -# Gn_data=[Gn, y_all, graph_dir], -# k_dis_data=[dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - -# #### xp 5: Fingerprint, sspkernel, using LETTER2, only node attrs. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Fingerprint' -# gkernel = 'structuralspkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -# # remove graphs without nodes and edges. -# Gn = [(idx, G) for idx, G in enumerate(Gn) if nx.number_of_nodes(G) != 0] -## and nx.number_of_edges(G) != 0)] -# idx = [G[0] for G in Gn] -# Gn = [G[1] for G in Gn] -# y_all = [y_all[i] for i in idx] -# y_idx = get_same_item_indices(y_all) -# # remove unused labels. -# for G in Gn: -# G.graph['edge_attrs'] = [] -# for edge in G.edges: -# del G.edges[edge]['attributes'] -# del G.edges[edge]['orient'] -# del G.edges[edge]['angle'] -## Gn = Gn[805:815] -## y_all = y_all[805:815] -# for G in Gn: -# G.graph['filename'] = 'graph' + str(G.graph['name']) + '.gxl' -# -# # compute/read Gram matrix and pair distances. -## Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel='imap_unordered') -## np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -## Kmatrix=Kmatrix) -# gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -# Kmatrix = gmfile['Kmatrix'] -## run_time = gmfile['run_time'] -## Kmatrix = Kmatrix[[0,1,2,3,4],:] -## Kmatrix = Kmatrix[:,[0,1,2,3,4]] -## print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## Kmatrix = np.zeros((len(Gn), len(Gn))) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# -# # fitting and computing. -# fit_methods = ['k-graphs', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method, -# 'init_ecc': [1,1,1,1,1]} # [0.525, 0.525, 0.001, 0.125, 0.125]} -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - -# #### xp 6: Letter-med, sspkernel. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Letter-med' -# gkernel = 'structuralspkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -## Gn = Gn[0:50] -## y_all = y_all[0:50] -# -# # compute/read Gram matrix and pair distances. -# Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel='imap_unordered') -# np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -# Kmatrix=Kmatrix) -## gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -## Kmatrix = gmfile['Kmatrix'] -## run_time = gmfile['run_time'] -## Kmatrix = Kmatrix[[0,1,2,3,4],:] -## Kmatrix = Kmatrix[:,[0,1,2,3,4]] -## print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## Kmatrix = np.zeros((len(Gn), len(Gn))) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# -# # fitting and computing. -# fit_methods = ['k-graphs', 'expert', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method, -# 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475]} -# print('parameters: ', parameters) -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - -# #### xp 7: Letter-low, sspkernel. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Letter-low' -# gkernel = 'structuralspkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -## Gn = Gn[0:50] -## y_all = y_all[0:50] -# -# # compute/read Gram matrix and pair distances. -# Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel='imap_unordered') -# np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -# Kmatrix=Kmatrix) -## gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -## Kmatrix = gmfile['Kmatrix'] -## run_time = gmfile['run_time'] -## Kmatrix = Kmatrix[[0,1,2,3,4],:] -## Kmatrix = Kmatrix[:,[0,1,2,3,4]] -## print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## Kmatrix = np.zeros((len(Gn), len(Gn))) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# -# # fitting and computing. -# fit_methods = ['k-graphs', 'expert', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method, -# 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075]} -# print('parameters: ', parameters) -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - -# #### xp 8: Letter-med, spkernel. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Letter-med' -# gkernel = 'spkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -# # remove graphs without nodes and edges. -# Gn = [(idx, G) for idx, G in enumerate(Gn) if (nx.number_of_nodes(G) != 0 -# and nx.number_of_edges(G) != 0)] -# idx = [G[0] for G in Gn] -# Gn = [G[1] for G in Gn] -# y_all = [y_all[i] for i in idx] -## Gn = Gn[0:50] -## y_all = y_all[0:50] -# -# # compute/read Gram matrix and pair distances. -# Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel='imap_unordered') -# np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -# Kmatrix=Kmatrix) -## gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -## Kmatrix = gmfile['Kmatrix'] -## run_time = gmfile['run_time'] -## Kmatrix = Kmatrix[[0,1,2,3,4],:] -## Kmatrix = Kmatrix[:,[0,1,2,3,4]] -## print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## Kmatrix = np.zeros((len(Gn), len(Gn))) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# -# # fitting and computing. -# fit_methods = ['k-graphs', 'expert', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method, -# 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475]} -# print('parameters: ', parameters) -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - -# #### xp 9: Letter-low, spkernel. -# # load dataset. -# print('getting dataset and computing kernel distance matrix first...') -# ds_name = 'Letter-low' -# gkernel = 'spkernel' -# Gn, y_all, graph_dir = get_dataset(ds_name) -# # remove graphs without nodes and edges. -# Gn = [(idx, G) for idx, G in enumerate(Gn) if (nx.number_of_nodes(G) != 0 -# and nx.number_of_edges(G) != 0)] -# idx = [G[0] for G in Gn] -# Gn = [G[1] for G in Gn] -# y_all = [y_all[i] for i in idx] -## Gn = Gn[0:50] -## y_all = y_all[0:50] -# -# # compute/read Gram matrix and pair distances. -# Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel='imap_unordered') -# np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -# Kmatrix=Kmatrix) -## gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -## Kmatrix = gmfile['Kmatrix'] -## run_time = gmfile['run_time'] -## Kmatrix = Kmatrix[[0,1,2,3,4],:] -## Kmatrix = Kmatrix[:,[0,1,2,3,4]] -## print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -## Kmatrix = np.zeros((len(Gn), len(Gn))) -## dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 -# -# # fitting and computing. -# fit_methods = ['k-graphs', 'expert', 'random', 'random', 'random'] -# for fit_method in fit_methods: -# print('\n-------------------------------------') -# print('fit method:', fit_method) -# parameters = {'ds_name': ds_name, -# 'gkernel': gkernel, -# 'edit_cost_name': 'LETTER2', -# 'ged_method': 'mIPFP', -# 'attr_distance': 'euclidean', -# 'fit_method': fit_method, -# 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075]} -# print('parameters: ', parameters) -# xp_fit_method_for_non_symbolic(parameters, save_results=True, -# initial_solutions=40, -# Gn_data = [Gn, y_all, graph_dir], -# k_dis_data = [dis_mat, dis_max, dis_min, dis_mean], -# Kmatrix=Kmatrix) - - - #### xp 5: COIL-DEL, sspkernel, using LETTER2, only node attrs. - # load dataset. - print('getting dataset and computing kernel distance matrix first...') - ds_name = 'COIL-DEL' - gkernel = 'structuralspkernel' - Gn, y_all, graph_dir = get_dataset(ds_name) - # remove graphs without nodes and edges. - Gn = [(idx, G) for idx, G in enumerate(Gn) if nx.number_of_nodes(G) != 0] -# and nx.number_of_edges(G) != 0)] - idx = [G[0] for G in Gn] - Gn = [G[1] for G in Gn] - y_all = [y_all[i] for i in idx] - # remove unused labels. - for G in Gn: - G.graph['edge_labels'] = [] - for edge in G.edges: - del G.edges[edge]['bond_type'] - del G.edges[edge]['valence'] -# Gn = Gn[805:815] -# y_all = y_all[805:815] - for G in Gn: - G.graph['filename'] = 'graph' + str(G.graph['name']) + '.gxl' - - # compute/read Gram matrix and pair distances. - is_separate = True - Kmatrix, run_time, k_dis_data = compute_gm_for_each_class(Gn, - y_all, - gkernel, - parallel='imap_unordered', - is_separate=is_separate) -# Kmatrix = compute_kernel(Gn, gkernel, None, None, True, parallel='imap_unordered') -# np.savez('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm', -# Kmatrix=Kmatrix) -# gmfile = np.load('results/xp_fit_method/Kmatrix.' + ds_name + '.' + gkernel + '.gm.npz') -# Kmatrix = gmfile['Kmatrix'] -# run_time = gmfile['run_time'] -# Kmatrix = Kmatrix[[0,1,2,3,4],:] -# Kmatrix = Kmatrix[:,[0,1,2,3,4]] -# print('\nTime to compute Gram matrix for the whole dataset: ', run_time) -# dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, -# Kmatrix=Kmatrix, gkernel=gkernel, verbose=True) -# Kmatrix = np.zeros((len(Gn), len(Gn))) -# dis_mat, dis_max, dis_min, dis_mean = 0, 0, 0, 0 - - # fitting and computing. - fit_methods = ['k-graphs', 'random', 'random', 'random'] - for fit_method in fit_methods: - print('\n-------------------------------------') - print('fit method:', fit_method) - parameters = {'ds_name': ds_name, - 'gkernel': gkernel, - 'edit_cost_name': 'LETTER2', - 'ged_method': 'mIPFP', - 'attr_distance': 'euclidean', - 'fit_method': fit_method, - 'init_ecc': [3,3,1,3,3]} # [0.525, 0.525, 0.001, 0.125, 0.125]} - xp_fit_method_for_non_symbolic(parameters, save_results=True, - initial_solutions=40, - Gn_data=[Gn, y_all, graph_dir], - k_dis_data=k_dis_data, - Kmatrix=Kmatrix, - is_separate=is_separate) \ No newline at end of file diff --git a/gklearn/preimage/xp_letter_h.py b/gklearn/preimage/xp_letter_h.py deleted file mode 100644 index 1e16fcf..0000000 --- a/gklearn/preimage/xp_letter_h.py +++ /dev/null @@ -1,476 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Tue Jan 14 15:39:29 2020 - -@author: ljia -""" -import numpy as np -import random -import csv -from shutil import copyfile -import networkx as nx -import matplotlib.pyplot as plt - -from gklearn.utils.graphfiles import loadDataset, loadGXL, saveGXL -from gklearn.preimage.test_k_closest_graphs import median_on_k_closest_graphs, reform_attributes -from gklearn.preimage.utils import get_same_item_indices, kernel_distance_matrix -from gklearn.preimage.find_best_k import getRelations - - -def xp_letter_h_LETTER2_cost(): - ds = {'dataset': 'cpp_ext/data/collections/Letter.xml', - 'graph_dir': os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/HIGH/'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['graph_dir']) - - dis_mat, dis_max, dis_min, dis_mean = kernel_distance_matrix(Gn, None, None, Kmatrix=None, gkernel='structuralspkernel') - for G in Gn: - reform_attributes(G) -# ds = {'name': 'Letter-high', -# 'dataset': '../datasets/Letter-high/Letter-high_A.txt'} # node/edge symb -# Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] - gkernel = 'structuralspkernel' - node_label = None - edge_label = None - ds_name = 'letter-h' - dir_output = 'results/xp_letter_h/' - save_results = True - cost = 'LETTER2' - - repeats = 1 -# k_list = range(2, 11) - k_list = [150] - fit_method = 'k-graphs' - # get indices by classes. - y_idx = get_same_item_indices(y_all) - - if save_results: - # create result files. - fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'target', 'repeat', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', 'median set']) - f_detail.close() - fn_output_summary = 'results_summary.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'target', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', '# SOD SM -> GM', '# dis_k SM -> GM', - '# dis_k gi -> SM', '# dis_k gi -> GM', 'repeats better SOD SM -> GM', - 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', - 'repeats better dis_k gi -> GM']) - f_summary.close() - - random.seed(1) - rdn_seed_list = random.sample(range(0, repeats * 100), repeats) - - for k in k_list: - print('\n--------- k =', k, '----------') - - sod_sm_mean_list = [] - sod_gm_mean_list = [] - dis_k_sm_mean_list = [] - dis_k_gm_mean_list = [] - dis_k_gi_min_mean_list = [] -# nb_sod_sm2gm = [0, 0, 0] -# nb_dis_k_sm2gm = [0, 0, 0] -# nb_dis_k_gi2sm = [0, 0, 0] -# nb_dis_k_gi2gm = [0, 0, 0] -# repeats_better_sod_sm2gm = [] -# repeats_better_dis_k_sm2gm = [] -# repeats_better_dis_k_gi2sm = [] -# repeats_better_dis_k_gi2gm = [] - - for i, (y, values) in enumerate(y_idx.items()): - print('\ny =', y) -# y = 'F' -# values = y_idx[y] -# values = values[0:10] - - k = len(values) - - sod_sm_list = [] - sod_gm_list = [] - dis_k_sm_list = [] - dis_k_gm_list = [] - dis_k_gi_min_list = [] - nb_sod_sm2gm = [0, 0, 0] - nb_dis_k_sm2gm = [0, 0, 0] - nb_dis_k_gi2sm = [0, 0, 0] - nb_dis_k_gi2gm = [0, 0, 0] - repeats_better_sod_sm2gm = [] - repeats_better_dis_k_sm2gm = [] - repeats_better_dis_k_gi2sm = [] - repeats_better_dis_k_gi2gm = [] - - for repeat in range(repeats): - print('\nrepeat =', repeat) - random.seed(rdn_seed_list[repeat]) - median_set_idx_idx = random.sample(range(0, len(values)), k) - median_set_idx = [values[idx] for idx in median_set_idx_idx] - print('median set: ', median_set_idx) - Gn_median = [Gn[g] for g in values] - - sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min, idx_dis_k_gi_min \ - = median_on_k_closest_graphs(Gn_median, node_label, edge_label, - gkernel, k, fit_method=fit_method, graph_dir=ds['graph_dir'], - edit_costs=None, group_min=median_set_idx_idx, - dataset='Letter', cost=cost, parallel=False) - - # write result detail. - sod_sm2gm = getRelations(np.sign(sod_gm - sod_sm)) - dis_k_sm2gm = getRelations(np.sign(dis_k_gm - dis_k_sm)) - dis_k_gi2sm = getRelations(np.sign(dis_k_sm - dis_k_gi_min)) - dis_k_gi2gm = getRelations(np.sign(dis_k_gm - dis_k_gi_min)) - if save_results: - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow([ds_name, gkernel, fit_method, k, - y, repeat, - sod_sm, sod_gm, dis_k_sm, dis_k_gm, - dis_k_gi_min, sod_sm2gm, dis_k_sm2gm, dis_k_gi2sm, - dis_k_gi2gm, median_set_idx]) - f_detail.close() - - # compute result summary. - sod_sm_list.append(sod_sm) - sod_gm_list.append(sod_gm) - dis_k_sm_list.append(dis_k_sm) - dis_k_gm_list.append(dis_k_gm) - dis_k_gi_min_list.append(dis_k_gi_min) - # # SOD SM -> GM - if sod_sm > sod_gm: - nb_sod_sm2gm[0] += 1 - repeats_better_sod_sm2gm.append(repeat) - elif sod_sm == sod_gm: - nb_sod_sm2gm[1] += 1 - elif sod_sm < sod_gm: - nb_sod_sm2gm[2] += 1 - # # dis_k SM -> GM - if dis_k_sm > dis_k_gm: - nb_dis_k_sm2gm[0] += 1 - repeats_better_dis_k_sm2gm.append(repeat) - elif dis_k_sm == dis_k_gm: - nb_dis_k_sm2gm[1] += 1 - elif dis_k_sm < dis_k_gm: - nb_dis_k_sm2gm[2] += 1 - # # dis_k gi -> SM - if dis_k_gi_min > dis_k_sm: - nb_dis_k_gi2sm[0] += 1 - repeats_better_dis_k_gi2sm.append(repeat) - elif dis_k_gi_min == dis_k_sm: - nb_dis_k_gi2sm[1] += 1 - elif dis_k_gi_min < dis_k_sm: - nb_dis_k_gi2sm[2] += 1 - # # dis_k gi -> GM - if dis_k_gi_min > dis_k_gm: - nb_dis_k_gi2gm[0] += 1 - repeats_better_dis_k_gi2gm.append(repeat) - elif dis_k_gi_min == dis_k_gm: - nb_dis_k_gi2gm[1] += 1 - elif dis_k_gi_min < dis_k_gm: - nb_dis_k_gi2gm[2] += 1 - - # save median graphs. - fname_sm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/set_median.gxl' - fn_pre_sm_new = dir_output + 'medians/set_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + y + '.repeat' + str(repeat) - copyfile(fname_sm, fn_pre_sm_new + '.gxl') - fname_gm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/gen_median.gxl' - fn_pre_gm_new = dir_output + 'medians/gen_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + y + '.repeat' + str(repeat) - copyfile(fname_gm, fn_pre_gm_new + '.gxl') - G_best_kernel = Gn_median[idx_dis_k_gi_min].copy() - reform_attributes(G_best_kernel) - fn_pre_g_best_kernel = dir_output + 'medians/g_best_kernel.' + fit_method \ - + '.k' + str(int(k)) + '.y' + y + '.repeat' + str(repeat) - saveGXL(G_best_kernel, fn_pre_g_best_kernel + '.gxl', method='gedlib-letter') - - # plot median graphs. - set_median = loadGXL(fn_pre_sm_new + '.gxl') - gen_median = loadGXL(fn_pre_gm_new + '.gxl') - draw_Letter_graph(set_median, fn_pre_sm_new) - draw_Letter_graph(gen_median, fn_pre_gm_new) - draw_Letter_graph(G_best_kernel, fn_pre_g_best_kernel) - - # write result summary for each letter. - sod_sm_mean_list.append(np.mean(sod_sm_list)) - sod_gm_mean_list.append(np.mean(sod_gm_list)) - dis_k_sm_mean_list.append(np.mean(dis_k_sm_list)) - dis_k_gm_mean_list.append(np.mean(dis_k_gm_list)) - dis_k_gi_min_mean_list.append(np.mean(dis_k_gi_min_list)) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean_list[-1] - sod_sm_mean_list[-1])) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_sm_mean_list[-1])) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - if save_results: - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, y, - sod_sm_mean_list[-1], sod_gm_mean_list[-1], - dis_k_sm_mean_list[-1], dis_k_gm_mean_list[-1], - dis_k_gi_min_mean_list[-1], sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean, nb_sod_sm2gm, - nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm, - repeats_better_sod_sm2gm, repeats_better_dis_k_sm2gm, - repeats_better_dis_k_gi2sm, repeats_better_dis_k_gi2gm]) - f_summary.close() - - - # write result summary for each letter. - sod_sm_mean = np.mean(sod_sm_mean_list) - sod_gm_mean = np.mean(sod_gm_mean_list) - dis_k_sm_mean = np.mean(dis_k_sm_mean_list) - dis_k_gm_mean = np.mean(dis_k_gm_mean_list) - dis_k_gi_min_mean = np.mean(dis_k_gi_min_list) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean - sod_sm_mean)) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_sm_mean)) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean - dis_k_gi_min_mean)) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_gi_min_mean)) - if save_results: - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, 'all', - sod_sm_mean, sod_gm_mean, dis_k_sm_mean, dis_k_gm_mean, - dis_k_gi_min_mean, sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean]) - f_summary.close() - - print('\ncomplete.') - - -def xp_letter_h(): - ds = {'dataset': 'cpp_ext/data/collections/Letter.xml', - 'graph_dir': os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/data/datasets/Letter/HIGH/'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset'], extra_params=ds['graph_dir']) - for G in Gn: - reform_attributes(G) -# ds = {'name': 'Letter-high', -# 'dataset': '../datasets/Letter-high/Letter-high_A.txt'} # node/edge symb -# Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] - gkernel = 'structuralspkernel' - node_label = None - edge_label = None - ds_name = 'letter-h' - dir_output = 'results/xp_letter_h/' - save_results = False - - repeats = 1 -# k_list = range(2, 11) - k_list = [150] - fit_method = 'k-graphs' - # get indices by classes. - y_idx = get_same_item_indices(y_all) - - if save_results: - # create result files. - fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'target', 'repeat', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', 'median set']) - f_detail.close() - fn_output_summary = 'results_summary.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'target', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', '# SOD SM -> GM', '# dis_k SM -> GM', - '# dis_k gi -> SM', '# dis_k gi -> GM', 'repeats better SOD SM -> GM', - 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', - 'repeats better dis_k gi -> GM']) - f_summary.close() - - random.seed(1) - rdn_seed_list = random.sample(range(0, repeats * 100), repeats) - - for k in k_list: - print('\n--------- k =', k, '----------') - - sod_sm_mean_list = [] - sod_gm_mean_list = [] - dis_k_sm_mean_list = [] - dis_k_gm_mean_list = [] - dis_k_gi_min_mean_list = [] -# nb_sod_sm2gm = [0, 0, 0] -# nb_dis_k_sm2gm = [0, 0, 0] -# nb_dis_k_gi2sm = [0, 0, 0] -# nb_dis_k_gi2gm = [0, 0, 0] -# repeats_better_sod_sm2gm = [] -# repeats_better_dis_k_sm2gm = [] -# repeats_better_dis_k_gi2sm = [] -# repeats_better_dis_k_gi2gm = [] - - for i, (y, values) in enumerate(y_idx.items()): - print('\ny =', y) -# y = 'N' -# values = y_idx[y] -# values = values[0:10] - - k = len(values) - - sod_sm_list = [] - sod_gm_list = [] - dis_k_sm_list = [] - dis_k_gm_list = [] - dis_k_gi_min_list = [] - nb_sod_sm2gm = [0, 0, 0] - nb_dis_k_sm2gm = [0, 0, 0] - nb_dis_k_gi2sm = [0, 0, 0] - nb_dis_k_gi2gm = [0, 0, 0] - repeats_better_sod_sm2gm = [] - repeats_better_dis_k_sm2gm = [] - repeats_better_dis_k_gi2sm = [] - repeats_better_dis_k_gi2gm = [] - - for repeat in range(repeats): - print('\nrepeat =', repeat) - random.seed(rdn_seed_list[repeat]) - median_set_idx_idx = random.sample(range(0, len(values)), k) - median_set_idx = [values[idx] for idx in median_set_idx_idx] - print('median set: ', median_set_idx) - Gn_median = [Gn[g] for g in values] - - sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min, idx_dis_k_gi_min \ - = median_on_k_closest_graphs(Gn_median, node_label, edge_label, - gkernel, k, fit_method=fit_method, graph_dir=ds['graph_dir'], - edit_costs=None, group_min=median_set_idx_idx, - dataset='Letter', parallel=False) - - # write result detail. - sod_sm2gm = getRelations(np.sign(sod_gm - sod_sm)) - dis_k_sm2gm = getRelations(np.sign(dis_k_gm - dis_k_sm)) - dis_k_gi2sm = getRelations(np.sign(dis_k_sm - dis_k_gi_min)) - dis_k_gi2gm = getRelations(np.sign(dis_k_gm - dis_k_gi_min)) - if save_results: - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow([ds_name, gkernel, fit_method, k, - y, repeat, - sod_sm, sod_gm, dis_k_sm, dis_k_gm, - dis_k_gi_min, sod_sm2gm, dis_k_sm2gm, dis_k_gi2sm, - dis_k_gi2gm, median_set_idx]) - f_detail.close() - - # compute result summary. - sod_sm_list.append(sod_sm) - sod_gm_list.append(sod_gm) - dis_k_sm_list.append(dis_k_sm) - dis_k_gm_list.append(dis_k_gm) - dis_k_gi_min_list.append(dis_k_gi_min) - # # SOD SM -> GM - if sod_sm > sod_gm: - nb_sod_sm2gm[0] += 1 - repeats_better_sod_sm2gm.append(repeat) - elif sod_sm == sod_gm: - nb_sod_sm2gm[1] += 1 - elif sod_sm < sod_gm: - nb_sod_sm2gm[2] += 1 - # # dis_k SM -> GM - if dis_k_sm > dis_k_gm: - nb_dis_k_sm2gm[0] += 1 - repeats_better_dis_k_sm2gm.append(repeat) - elif dis_k_sm == dis_k_gm: - nb_dis_k_sm2gm[1] += 1 - elif dis_k_sm < dis_k_gm: - nb_dis_k_sm2gm[2] += 1 - # # dis_k gi -> SM - if dis_k_gi_min > dis_k_sm: - nb_dis_k_gi2sm[0] += 1 - repeats_better_dis_k_gi2sm.append(repeat) - elif dis_k_gi_min == dis_k_sm: - nb_dis_k_gi2sm[1] += 1 - elif dis_k_gi_min < dis_k_sm: - nb_dis_k_gi2sm[2] += 1 - # # dis_k gi -> GM - if dis_k_gi_min > dis_k_gm: - nb_dis_k_gi2gm[0] += 1 - repeats_better_dis_k_gi2gm.append(repeat) - elif dis_k_gi_min == dis_k_gm: - nb_dis_k_gi2gm[1] += 1 - elif dis_k_gi_min < dis_k_gm: - nb_dis_k_gi2gm[2] += 1 - - # save median graphs. - fname_sm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/set_median.gxl' - fn_pre_sm_new = dir_output + 'medians/set_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + y + '.repeat' + str(repeat) - copyfile(fname_sm, fn_pre_sm_new + '.gxl') - fname_gm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/gen_median.gxl' - fn_pre_gm_new = dir_output + 'medians/gen_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + y + '.repeat' + str(repeat) - copyfile(fname_gm, fn_pre_gm_new + '.gxl') - G_best_kernel = Gn_median[idx_dis_k_gi_min].copy() - reform_attributes(G_best_kernel) - fn_pre_g_best_kernel = dir_output + 'medians/g_best_kernel.' + fit_method \ - + '.k' + str(int(k)) + '.y' + y + '.repeat' + str(repeat) - saveGXL(G_best_kernel, fn_pre_g_best_kernel + '.gxl', method='gedlib-letter') - - # plot median graphs. - set_median = loadGXL(fn_pre_sm_new + '.gxl') - gen_median = loadGXL(fn_pre_gm_new + '.gxl') - draw_Letter_graph(set_median, fn_pre_sm_new) - draw_Letter_graph(gen_median, fn_pre_gm_new) - draw_Letter_graph(G_best_kernel, fn_pre_g_best_kernel) - - # write result summary for each letter. - sod_sm_mean_list.append(np.mean(sod_sm_list)) - sod_gm_mean_list.append(np.mean(sod_gm_list)) - dis_k_sm_mean_list.append(np.mean(dis_k_sm_list)) - dis_k_gm_mean_list.append(np.mean(dis_k_gm_list)) - dis_k_gi_min_mean_list.append(np.mean(dis_k_gi_min_list)) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean_list[-1] - sod_sm_mean_list[-1])) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_sm_mean_list[-1])) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - if save_results: - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, y, - sod_sm_mean_list[-1], sod_gm_mean_list[-1], - dis_k_sm_mean_list[-1], dis_k_gm_mean_list[-1], - dis_k_gi_min_mean_list[-1], sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean, nb_sod_sm2gm, - nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm, - repeats_better_sod_sm2gm, repeats_better_dis_k_sm2gm, - repeats_better_dis_k_gi2sm, repeats_better_dis_k_gi2gm]) - f_summary.close() - - - # write result summary for each letter. - sod_sm_mean = np.mean(sod_sm_mean_list) - sod_gm_mean = np.mean(sod_gm_mean_list) - dis_k_sm_mean = np.mean(dis_k_sm_mean_list) - dis_k_gm_mean = np.mean(dis_k_gm_mean_list) - dis_k_gi_min_mean = np.mean(dis_k_gi_min_list) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean - sod_sm_mean)) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_sm_mean)) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean - dis_k_gi_min_mean)) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_gi_min_mean)) - if save_results: - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, 'all', - sod_sm_mean, sod_gm_mean, dis_k_sm_mean, dis_k_gm_mean, - dis_k_gi_min_mean, sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean]) - f_summary.close() - - print('\ncomplete.') - - -#Dessin median courrant -def draw_Letter_graph(graph, file_prefix): - plt.figure() - pos = {} - for n in graph.nodes: - pos[n] = np.array([float(graph.node[n]['x']),float(graph.node[n]['y'])]) - nx.draw_networkx(graph, pos) - plt.savefig(file_prefix + '.eps', format='eps', dpi=300) -# plt.show() - plt.clf() - - -if __name__ == "__main__": -# xp_letter_h() - xp_letter_h_LETTER2_cost() \ No newline at end of file diff --git a/gklearn/preimage/xp_monoterpenoides.py b/gklearn/preimage/xp_monoterpenoides.py deleted file mode 100644 index 2270471..0000000 --- a/gklearn/preimage/xp_monoterpenoides.py +++ /dev/null @@ -1,249 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Jan 16 11:03:11 2020 - -@author: ljia -""" - -import numpy as np -import random -import csv -from shutil import copyfile -import networkx as nx -import matplotlib.pyplot as plt - -from gklearn.utils.graphfiles import loadDataset, loadGXL, saveGXL -from gklearn.preimage.test_k_closest_graphs import median_on_k_closest_graphs, reform_attributes -from gklearn.preimage.utils import get_same_item_indices -from gklearn.preimage.find_best_k import getRelations - -def xp_monoterpenoides(): - import os - - ds = {'dataset': '../../datasets/monoterpenoides/dataset_10+.ds', - 'graph_dir': os.path.dirname(os.path.realpath(__file__)) + '../../datasets/monoterpenoides/'} # node/edge symb - Gn, y_all = loadDataset(ds['dataset']) -# ds = {'name': 'Letter-high', -# 'dataset': '../datasets/Letter-high/Letter-high_A.txt'} # node/edge symb -# Gn, y_all = loadDataset(ds['dataset']) -# Gn = Gn[0:50] - gkernel = 'treeletkernel' - node_label = 'atom' - edge_label = 'bond_type' - ds_name = 'monoterpenoides' - dir_output = 'results/xp_monoterpenoides/' - - repeats = 1 -# k_list = range(2, 11) - k_list = [0] - fit_method = 'k-graphs' - # get indices by classes. - y_idx = get_same_item_indices(y_all) - - # create result files. - fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'target', 'repeat', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', 'median set']) - f_detail.close() - fn_output_summary = 'results_summary.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow(['dataset', 'graph kernel', 'fit method', 'k', - 'target', 'SOD SM', 'SOD GM', 'dis_k SM', 'dis_k GM', - 'min dis_k gi', 'SOD SM -> GM', 'dis_k SM -> GM', 'dis_k gi -> SM', - 'dis_k gi -> GM', '# SOD SM -> GM', '# dis_k SM -> GM', - '# dis_k gi -> SM', '# dis_k gi -> GM', 'repeats better SOD SM -> GM', - 'repeats better dis_k SM -> GM', 'repeats better dis_k gi -> SM', - 'repeats better dis_k gi -> GM']) - f_summary.close() - - random.seed(1) - rdn_seed_list = random.sample(range(0, repeats * 100), repeats) - - for k in k_list: - print('\n--------- k =', k, '----------') - - sod_sm_mean_list = [] - sod_gm_mean_list = [] - dis_k_sm_mean_list = [] - dis_k_gm_mean_list = [] - dis_k_gi_min_mean_list = [] -# nb_sod_sm2gm = [0, 0, 0] -# nb_dis_k_sm2gm = [0, 0, 0] -# nb_dis_k_gi2sm = [0, 0, 0] -# nb_dis_k_gi2gm = [0, 0, 0] -# repeats_better_sod_sm2gm = [] -# repeats_better_dis_k_sm2gm = [] -# repeats_better_dis_k_gi2sm = [] -# repeats_better_dis_k_gi2gm = [] - - for i, (y, values) in enumerate(y_idx.items()): - print('\ny =', y) -# y = 'I' -# values = y_idx[y] - - k = len(values) -# k = kkk - - sod_sm_list = [] - sod_gm_list = [] - dis_k_sm_list = [] - dis_k_gm_list = [] - dis_k_gi_min_list = [] - nb_sod_sm2gm = [0, 0, 0] - nb_dis_k_sm2gm = [0, 0, 0] - nb_dis_k_gi2sm = [0, 0, 0] - nb_dis_k_gi2gm = [0, 0, 0] - repeats_better_sod_sm2gm = [] - repeats_better_dis_k_sm2gm = [] - repeats_better_dis_k_gi2sm = [] - repeats_better_dis_k_gi2gm = [] - - for repeat in range(repeats): - print('\nrepeat =', repeat) - random.seed(rdn_seed_list[repeat]) - median_set_idx_idx = random.sample(range(0, len(values)), k) - median_set_idx = [values[idx] for idx in median_set_idx_idx] - print('median set: ', median_set_idx) - Gn_median = [Gn[g] for g in values] - - sod_sm, sod_gm, dis_k_sm, dis_k_gm, dis_k_gi, dis_k_gi_min, idx_dis_k_gi_min \ - = median_on_k_closest_graphs(Gn_median, node_label, edge_label, - gkernel, k, fit_method=fit_method, graph_dir=ds['graph_dir'], - edit_costs=None, group_min=median_set_idx_idx, - dataset=ds_name, parallel=False) - - # write result detail. - sod_sm2gm = getRelations(np.sign(sod_gm - sod_sm)) - dis_k_sm2gm = getRelations(np.sign(dis_k_gm - dis_k_sm)) - dis_k_gi2sm = getRelations(np.sign(dis_k_sm - dis_k_gi_min)) - dis_k_gi2gm = getRelations(np.sign(dis_k_gm - dis_k_gi_min)) - f_detail = open(dir_output + fn_output_detail, 'a') - csv.writer(f_detail).writerow([ds_name, gkernel, fit_method, k, - y, repeat, - sod_sm, sod_gm, dis_k_sm, dis_k_gm, - dis_k_gi_min, sod_sm2gm, dis_k_sm2gm, dis_k_gi2sm, - dis_k_gi2gm, median_set_idx]) - f_detail.close() - - # compute result summary. - sod_sm_list.append(sod_sm) - sod_gm_list.append(sod_gm) - dis_k_sm_list.append(dis_k_sm) - dis_k_gm_list.append(dis_k_gm) - dis_k_gi_min_list.append(dis_k_gi_min) - # # SOD SM -> GM - if sod_sm > sod_gm: - nb_sod_sm2gm[0] += 1 - repeats_better_sod_sm2gm.append(repeat) - elif sod_sm == sod_gm: - nb_sod_sm2gm[1] += 1 - elif sod_sm < sod_gm: - nb_sod_sm2gm[2] += 1 - # # dis_k SM -> GM - if dis_k_sm > dis_k_gm: - nb_dis_k_sm2gm[0] += 1 - repeats_better_dis_k_sm2gm.append(repeat) - elif dis_k_sm == dis_k_gm: - nb_dis_k_sm2gm[1] += 1 - elif dis_k_sm < dis_k_gm: - nb_dis_k_sm2gm[2] += 1 - # # dis_k gi -> SM - if dis_k_gi_min > dis_k_sm: - nb_dis_k_gi2sm[0] += 1 - repeats_better_dis_k_gi2sm.append(repeat) - elif dis_k_gi_min == dis_k_sm: - nb_dis_k_gi2sm[1] += 1 - elif dis_k_gi_min < dis_k_sm: - nb_dis_k_gi2sm[2] += 1 - # # dis_k gi -> GM - if dis_k_gi_min > dis_k_gm: - nb_dis_k_gi2gm[0] += 1 - repeats_better_dis_k_gi2gm.append(repeat) - elif dis_k_gi_min == dis_k_gm: - nb_dis_k_gi2gm[1] += 1 - elif dis_k_gi_min < dis_k_gm: - nb_dis_k_gi2gm[2] += 1 - - # save median graphs. - fname_sm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/set_median.gxl' - fn_pre_sm_new = dir_output + 'medians/set_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + str(int(y)) + '.repeat' + str(repeat) - copyfile(fname_sm, fn_pre_sm_new + '.gxl') - fname_gm = os.path.dirname(os.path.realpath(__file__)) + '/cpp_ext/output/tmp_ged/gen_median.gxl' - fn_pre_gm_new = dir_output + 'medians/gen_median.' + fit_method \ - + '.k' + str(int(k)) + '.y' + str(int(y)) + '.repeat' + str(repeat) - copyfile(fname_gm, fn_pre_gm_new + '.gxl') - G_best_kernel = Gn_median[idx_dis_k_gi_min].copy() -# reform_attributes(G_best_kernel) - fn_pre_g_best_kernel = dir_output + 'medians/g_best_kernel.' + fit_method \ - + '.k' + str(int(k)) + '.y' + str(int(y)) + '.repeat' + str(repeat) - saveGXL(G_best_kernel, fn_pre_g_best_kernel + '.gxl', method='gedlib') - -# # plot median graphs. -# set_median = loadGXL(fn_pre_sm_new + '.gxl') -# gen_median = loadGXL(fn_pre_gm_new + '.gxl') -# draw_Letter_graph(set_median, fn_pre_sm_new) -# draw_Letter_graph(gen_median, fn_pre_gm_new) -# draw_Letter_graph(G_best_kernel, fn_pre_g_best_kernel) - - # write result summary for each letter. - sod_sm_mean_list.append(np.mean(sod_sm_list)) - sod_gm_mean_list.append(np.mean(sod_gm_list)) - dis_k_sm_mean_list.append(np.mean(dis_k_sm_list)) - dis_k_gm_mean_list.append(np.mean(dis_k_gm_list)) - dis_k_gi_min_mean_list.append(np.mean(dis_k_gi_min_list)) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean_list[-1] - sod_sm_mean_list[-1])) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_sm_mean_list[-1])) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean_list[-1] - dis_k_gi_min_mean_list[-1])) - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, y, - sod_sm_mean_list[-1], sod_gm_mean_list[-1], - dis_k_sm_mean_list[-1], dis_k_gm_mean_list[-1], - dis_k_gi_min_mean_list[-1], sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean, nb_sod_sm2gm, - nb_dis_k_sm2gm, nb_dis_k_gi2sm, nb_dis_k_gi2gm, - repeats_better_sod_sm2gm, repeats_better_dis_k_sm2gm, - repeats_better_dis_k_gi2sm, repeats_better_dis_k_gi2gm]) - f_summary.close() - - - # write result summary for each letter. - sod_sm_mean = np.mean(sod_sm_mean_list) - sod_gm_mean = np.mean(sod_gm_mean_list) - dis_k_sm_mean = np.mean(dis_k_sm_mean_list) - dis_k_gm_mean = np.mean(dis_k_gm_mean_list) - dis_k_gi_min_mean = np.mean(dis_k_gi_min_list) - sod_sm2gm_mean = getRelations(np.sign(sod_gm_mean - sod_sm_mean)) - dis_k_sm2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_sm_mean)) - dis_k_gi2sm_mean = getRelations(np.sign(dis_k_sm_mean - dis_k_gi_min_mean)) - dis_k_gi2gm_mean = getRelations(np.sign(dis_k_gm_mean - dis_k_gi_min_mean)) - f_summary = open(dir_output + fn_output_summary, 'a') - csv.writer(f_summary).writerow([ds_name, gkernel, fit_method, k, 'all', - sod_sm_mean, sod_gm_mean, dis_k_sm_mean, dis_k_gm_mean, - dis_k_gi_min_mean, sod_sm2gm_mean, dis_k_sm2gm_mean, - dis_k_gi2sm_mean, dis_k_gi2gm_mean]) - f_summary.close() - - - print('\ncomplete.') - - -#Dessin median courrant -def draw_Letter_graph(graph, file_prefix): - plt.figure() - pos = {} - for n in graph.nodes: - pos[n] = np.array([float(graph.node[n]['x']),float(graph.node[n]['y'])]) - nx.draw_networkx(graph, pos) - plt.savefig(file_prefix + '.eps', format='eps', dpi=300) -# plt.show() - plt.clf() - - -if __name__ == "__main__": - xp_monoterpenoides() \ No newline at end of file From 2248a1308e9af23426d73f44099e6955fcf7eb5d Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Mon, 13 Apr 2020 18:01:41 +0200 Subject: [PATCH 4/9] Update tests. --- gklearn/ged/__init__.py | 0 gklearn/preimage/experiments/xp_median_preimage.py | 4 ++-- gklearn/tests/test_graph_kernels.py | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 gklearn/ged/__init__.py diff --git a/gklearn/ged/__init__.py b/gklearn/ged/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gklearn/preimage/experiments/xp_median_preimage.py b/gklearn/preimage/experiments/xp_median_preimage.py index 4fd12d2..2b920e7 100644 --- a/gklearn/preimage/experiments/xp_median_preimage.py +++ b/gklearn/preimage/experiments/xp_median_preimage.py @@ -92,7 +92,7 @@ def xp_median_preimage_9_2(): 'epsilon_ec': 0.1, 'verbose': 2} kernel_options = {'name': 'PathUpToH', - 'depth': 2, # + 'depth': 9, # 'k_func': 'MinMax', # 'compute_method': 'trie', 'parallel': 'imap_unordered', @@ -217,7 +217,7 @@ def xp_median_preimage_8_2(): 'epsilon_ec': 0.1, 'verbose': 2} kernel_options = {'name': 'PathUpToH', - 'depth': 2, # + 'depth': 7, # 'k_func': 'MinMax', # 'compute_method': 'trie', 'parallel': 'imap_unordered', diff --git a/gklearn/tests/test_graph_kernels.py b/gklearn/tests/test_graph_kernels.py index fbad15f..5ee9997 100644 --- a/gklearn/tests/test_graph_kernels.py +++ b/gklearn/tests/test_graph_kernels.py @@ -162,6 +162,11 @@ def test_ShortestPath(ds_name, parallel): node_kernels=sub_kernels) gram_matrix, run_time = graph_kernel.compute(dataset.graphs, parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel_list, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1:], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: assert False, exception @@ -190,6 +195,11 @@ def test_StructuralSP(ds_name, parallel): edge_kernels=sub_kernels) gram_matrix, run_time = graph_kernel.compute(dataset.graphs, parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel_list, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1:], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: assert False, exception @@ -213,6 +223,10 @@ def test_PathUpToH(ds_name, parallel, k_func, compute_method): depth=2, k_func=k_func, compute_method=compute_method) gram_matrix, run_time = graph_kernel.compute(dataset.graphs, parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel_list, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1:], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) except Exception as exception: assert False, exception From b7d5ce3efbea4bd720cb5ed33e8d0c162c1322f0 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Mon, 13 Apr 2020 18:20:49 +0200 Subject: [PATCH 5/9] Fix bugs in class PathUpToH. --- gklearn/kernels/path_up_to_h.py | 4 +- gklearn/kernels/treeletKernel.py | 898 +++++++++++++++++++-------------------- 2 files changed, 451 insertions(+), 451 deletions(-) diff --git a/gklearn/kernels/path_up_to_h.py b/gklearn/kernels/path_up_to_h.py index 26639cf..d031021 100644 --- a/gklearn/kernels/path_up_to_h.py +++ b/gklearn/kernels/path_up_to_h.py @@ -131,13 +131,13 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func == None if self.__compute_method == 'trie': paths_g1 = self.__find_all_path_as_trie(g1) - paths_g_list = [self.__find_all_path_as_trie(self._graphs[i]) for i in iterator_ps] + paths_g_list = [self.__find_all_path_as_trie(g) for g in iterator_ps] for i in iterator_kernel: kernel = self.__kernel_do_trie(paths_g1, paths_g_list[i]) kernel_list[i] = kernel else: paths_g1 = self.__find_all_paths_until_length(g1) - paths_g_list = [self.__find_all_paths_until_length(self._graphs[i]) for i in iterator_ps] + paths_g_list = [self.__find_all_paths_until_length(g) for g in iterator_ps] for i in iterator_kernel: kernel = self.__kernel_do_naive(paths_g1, paths_g_list[i]) kernel_list[i] = kernel diff --git a/gklearn/kernels/treeletKernel.py b/gklearn/kernels/treeletKernel.py index 946f20f..d4447b1 100644 --- a/gklearn/kernels/treeletKernel.py +++ b/gklearn/kernels/treeletKernel.py @@ -3,8 +3,8 @@ @references: - [1] Gaüzère B, Brun L, Villemin D. Two new graphs kernels in - chemoinformatics. Pattern Recognition Letters. 2012 Nov 1;33(15):2038-47. + [1] Gaüzère B, Brun L, Villemin D. Two new graphs kernels in + chemoinformatics. Pattern Recognition Letters. 2012 Nov 1;33(15):2038-47. """ import sys @@ -22,467 +22,467 @@ from gklearn.utils.graphdataset import get_dataset_attributes from gklearn.utils.parallel import parallel_gm def treeletkernel(*args, - sub_kernel, - node_label='atom', - edge_label='bond_type', - parallel='imap_unordered', - n_jobs=None, - verbose=True): - """Calculate treelet graph kernels between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - - G1, G2 : NetworkX graphs - Two graphs between which the kernel is calculated. - - sub_kernel : function - The sub-kernel between 2 real number vectors. Each vector counts the - numbers of isomorphic treelets in a graph. - - node_label : string - Node attribute used as label. The default node label is atom. - - edge_label : string - Edge attribute used as label. The default edge label is bond_type. - - parallel : string/None - Which paralleliztion method is applied to compute the kernel. The - Following choices are available: - - 'imap_unordered': use Python's multiprocessing.Pool.imap_unordered - method. - - None: no parallelization is applied. - - n_jobs : int - Number of jobs for parallelization. The default is to use all - computational cores. This argument is only valid when one of the - parallelization method is applied. - - Return - ------ - Kmatrix : Numpy matrix - Kernel matrix, each element of which is the treelet kernel between 2 praphs. - """ - # pre-process - Gn = args[0] if len(args) == 1 else [args[0], args[1]] - Gn = [g.copy() for g in Gn] - Kmatrix = np.zeros((len(Gn), len(Gn))) - ds_attrs = get_dataset_attributes(Gn, - attr_names=['node_labeled', 'edge_labeled', 'is_directed'], - node_label=node_label, edge_label=edge_label) - labeled = False - if ds_attrs['node_labeled'] or ds_attrs['edge_labeled']: - labeled = True - if not ds_attrs['node_labeled']: - for G in Gn: - nx.set_node_attributes(G, '0', 'atom') - if not ds_attrs['edge_labeled']: - for G in Gn: - nx.set_edge_attributes(G, '0', 'bond_type') - - start_time = time.time() - - # ---- use pool.imap_unordered to parallel and track progress. ---- - if parallel == 'imap_unordered': - # get all canonical keys of all graphs before calculating kernels to save - # time, but this may cost a lot of memory for large dataset. - pool = Pool(n_jobs) - itr = zip(Gn, range(0, len(Gn))) - if len(Gn) < 100 * n_jobs: - chunksize = int(len(Gn) / n_jobs) + 1 - else: - chunksize = 100 - canonkeys = [[] for _ in range(len(Gn))] - get_partial = partial(wrapper_get_canonkeys, node_label, edge_label, - labeled, ds_attrs['is_directed']) - if verbose: - iterator = tqdm(pool.imap_unordered(get_partial, itr, chunksize), - desc='getting canonkeys', file=sys.stdout) - else: - iterator = pool.imap_unordered(get_partial, itr, chunksize) - for i, ck in iterator: - canonkeys[i] = ck - pool.close() - pool.join() - - # compute kernels. - def init_worker(canonkeys_toshare): - global G_canonkeys - G_canonkeys = canonkeys_toshare - do_partial = partial(wrapper_treeletkernel_do, sub_kernel) - parallel_gm(do_partial, Kmatrix, Gn, init_worker=init_worker, - glbv=(canonkeys,), n_jobs=n_jobs, verbose=verbose) - - # ---- do not use parallelization. ---- - elif parallel == None: - # get all canonical keys of all graphs before calculating kernels to save - # time, but this may cost a lot of memory for large dataset. - canonkeys = [] - for g in (tqdm(Gn, desc='getting canonkeys', file=sys.stdout) if verbose else Gn): - canonkeys.append(get_canonkeys(g, node_label, edge_label, labeled, - ds_attrs['is_directed'])) - - # compute kernels. - from itertools import combinations_with_replacement - itr = combinations_with_replacement(range(0, len(Gn)), 2) - for i, j in (tqdm(itr, desc='getting canonkeys', file=sys.stdout) if verbose else itr): - Kmatrix[i][j] = _treeletkernel_do(canonkeys[i], canonkeys[j], sub_kernel) - Kmatrix[j][i] = Kmatrix[i][j] # @todo: no directed graph considered? - - else: - raise Exception('No proper parallelization method designated.') - - - run_time = time.time() - start_time - if verbose: - print("\n --- treelet kernel matrix of size %d built in %s seconds ---" - % (len(Gn), run_time)) - - return Kmatrix, run_time + sub_kernel, + node_label='atom', + edge_label='bond_type', + parallel='imap_unordered', + n_jobs=None, + verbose=True): + """Calculate treelet graph kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + + G1, G2 : NetworkX graphs + Two graphs between which the kernel is calculated. + + sub_kernel : function + The sub-kernel between 2 real number vectors. Each vector counts the + numbers of isomorphic treelets in a graph. + + node_label : string + Node attribute used as label. The default node label is atom. + + edge_label : string + Edge attribute used as label. The default edge label is bond_type. + + parallel : string/None + Which paralleliztion method is applied to compute the kernel. The + Following choices are available: + + 'imap_unordered': use Python's multiprocessing.Pool.imap_unordered + method. + + None: no parallelization is applied. + + n_jobs : int + Number of jobs for parallelization. The default is to use all + computational cores. This argument is only valid when one of the + parallelization method is applied. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the treelet kernel between 2 praphs. + """ + # pre-process + Gn = args[0] if len(args) == 1 else [args[0], args[1]] + Gn = [g.copy() for g in Gn] + Kmatrix = np.zeros((len(Gn), len(Gn))) + ds_attrs = get_dataset_attributes(Gn, + attr_names=['node_labeled', 'edge_labeled', 'is_directed'], + node_label=node_label, edge_label=edge_label) + labeled = False + if ds_attrs['node_labeled'] or ds_attrs['edge_labeled']: + labeled = True + if not ds_attrs['node_labeled']: + for G in Gn: + nx.set_node_attributes(G, '0', 'atom') + if not ds_attrs['edge_labeled']: + for G in Gn: + nx.set_edge_attributes(G, '0', 'bond_type') + + start_time = time.time() + + # ---- use pool.imap_unordered to parallel and track progress. ---- + if parallel == 'imap_unordered': + # get all canonical keys of all graphs before calculating kernels to save + # time, but this may cost a lot of memory for large dataset. + pool = Pool(n_jobs) + itr = zip(Gn, range(0, len(Gn))) + if len(Gn) < 100 * n_jobs: + chunksize = int(len(Gn) / n_jobs) + 1 + else: + chunksize = 100 + canonkeys = [[] for _ in range(len(Gn))] + get_partial = partial(wrapper_get_canonkeys, node_label, edge_label, + labeled, ds_attrs['is_directed']) + if verbose: + iterator = tqdm(pool.imap_unordered(get_partial, itr, chunksize), + desc='getting canonkeys', file=sys.stdout) + else: + iterator = pool.imap_unordered(get_partial, itr, chunksize) + for i, ck in iterator: + canonkeys[i] = ck + pool.close() + pool.join() + + # compute kernels. + def init_worker(canonkeys_toshare): + global G_canonkeys + G_canonkeys = canonkeys_toshare + do_partial = partial(wrapper_treeletkernel_do, sub_kernel) + parallel_gm(do_partial, Kmatrix, Gn, init_worker=init_worker, + glbv=(canonkeys,), n_jobs=n_jobs, verbose=verbose) + + # ---- do not use parallelization. ---- + elif parallel == None: + # get all canonical keys of all graphs before calculating kernels to save + # time, but this may cost a lot of memory for large dataset. + canonkeys = [] + for g in (tqdm(Gn, desc='getting canonkeys', file=sys.stdout) if verbose else Gn): + canonkeys.append(get_canonkeys(g, node_label, edge_label, labeled, + ds_attrs['is_directed'])) + + # compute kernels. + from itertools import combinations_with_replacement + itr = combinations_with_replacement(range(0, len(Gn)), 2) + for i, j in (tqdm(itr, desc='getting canonkeys', file=sys.stdout) if verbose else itr): + Kmatrix[i][j] = _treeletkernel_do(canonkeys[i], canonkeys[j], sub_kernel) + Kmatrix[j][i] = Kmatrix[i][j] # @todo: no directed graph considered? + + else: + raise Exception('No proper parallelization method designated.') + + + run_time = time.time() - start_time + if verbose: + print("\n --- treelet kernel matrix of size %d built in %s seconds ---" + % (len(Gn), run_time)) + + return Kmatrix, run_time def _treeletkernel_do(canonkey1, canonkey2, sub_kernel): - """Calculate treelet graph kernel between 2 graphs. - - Parameters - ---------- - canonkey1, canonkey2 : list - List of canonical keys in 2 graphs, where each key is represented by a string. - - Return - ------ - kernel : float - Treelet Kernel between 2 graphs. - """ - keys = set(canonkey1.keys()) & set(canonkey2.keys()) # find same canonical keys in both graphs - vector1 = np.array([(canonkey1[key] if (key in canonkey1.keys()) else 0) for key in keys]) - vector2 = np.array([(canonkey2[key] if (key in canonkey2.keys()) else 0) for key in keys]) - kernel = sub_kernel(vector1, vector2) - return kernel + """Calculate treelet graph kernel between 2 graphs. + + Parameters + ---------- + canonkey1, canonkey2 : list + List of canonical keys in 2 graphs, where each key is represented by a string. + + Return + ------ + kernel : float + Treelet Kernel between 2 graphs. + """ + keys = set(canonkey1.keys()) & set(canonkey2.keys()) # find same canonical keys in both graphs + vector1 = np.array([(canonkey1[key] if (key in canonkey1.keys()) else 0) for key in keys]) + vector2 = np.array([(canonkey2[key] if (key in canonkey2.keys()) else 0) for key in keys]) + kernel = sub_kernel(vector1, vector2) + return kernel def wrapper_treeletkernel_do(sub_kernel, itr): - i = itr[0] - j = itr[1] - return i, j, _treeletkernel_do(G_canonkeys[i], G_canonkeys[j], sub_kernel) + i = itr[0] + j = itr[1] + return i, j, _treeletkernel_do(G_canonkeys[i], G_canonkeys[j], sub_kernel) def get_canonkeys(G, node_label, edge_label, labeled, is_directed): - """Generate canonical keys of all treelets in a graph. - - Parameters - ---------- - G : NetworkX graphs - The graph in which keys are generated. - node_label : string - node attribute used as label. The default node label is atom. - edge_label : string - edge attribute used as label. The default edge label is bond_type. - labeled : boolean - Whether the graphs are labeled. The default is True. - - Return - ------ - canonkey/canonkey_l : dict - For unlabeled graphs, canonkey is a dictionary which records amount of - every tree pattern. For labeled graphs, canonkey_l is one which keeps - track of amount of every treelet. - """ - patterns = {} # a dictionary which consists of lists of patterns for all graphlet. - canonkey = {} # canonical key, a dictionary which records amount of every tree pattern. - - ### structural analysis ### - ### In this section, a list of patterns is generated for each graphlet, - ### where every pattern is represented by nodes ordered by Morgan's - ### extended labeling. - # linear patterns - patterns['0'] = G.nodes() - canonkey['0'] = nx.number_of_nodes(G) - for i in range(1, 6): # for i in range(1, 6): - patterns[str(i)] = find_all_paths(G, i, is_directed) - canonkey[str(i)] = len(patterns[str(i)]) - - # n-star patterns - patterns['3star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 3] - patterns['4star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 4] - patterns['5star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 5] - # n-star patterns - canonkey['6'] = len(patterns['3star']) - canonkey['8'] = len(patterns['4star']) - canonkey['d'] = len(patterns['5star']) - - # pattern 7 - patterns['7'] = [] # the 1st line of Table 1 in Ref [1] - for pattern in patterns['3star']: - for i in range(1, len(pattern)): # for each neighbor of node 0 - if G.degree(pattern[i]) >= 2: - pattern_t = pattern[:] - # set the node with degree >= 2 as the 4th node - pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] - for neighborx in G[pattern[i]]: - if neighborx != pattern[0]: - new_pattern = pattern_t + [neighborx] - patterns['7'].append(new_pattern) - canonkey['7'] = len(patterns['7']) - - # pattern 11 - patterns['11'] = [] # the 4th line of Table 1 in Ref [1] - for pattern in patterns['4star']: - for i in range(1, len(pattern)): - if G.degree(pattern[i]) >= 2: - pattern_t = pattern[:] - pattern_t[i], pattern_t[4] = pattern_t[4], pattern_t[i] - for neighborx in G[pattern[i]]: - if neighborx != pattern[0]: - new_pattern = pattern_t + [ neighborx ] - patterns['11'].append(new_pattern) - canonkey['b'] = len(patterns['11']) - - # pattern 12 - patterns['12'] = [] # the 5th line of Table 1 in Ref [1] - rootlist = [] # a list of root nodes, whose extended labels are 3 - for pattern in patterns['3star']: - if pattern[0] not in rootlist: # prevent to count the same pattern twice from each of the two root nodes - rootlist.append(pattern[0]) - for i in range(1, len(pattern)): - if G.degree(pattern[i]) >= 3: - rootlist.append(pattern[i]) - pattern_t = pattern[:] - pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] - for neighborx1 in G[pattern[i]]: - if neighborx1 != pattern[0]: - for neighborx2 in G[pattern[i]]: - if neighborx1 > neighborx2 and neighborx2 != pattern[0]: - new_pattern = pattern_t + [neighborx1] + [neighborx2] -# new_patterns = [ pattern + [neighborx1] + [neighborx2] for neighborx1 in G[pattern[i]] if neighborx1 != pattern[0] for neighborx2 in G[pattern[i]] if (neighborx1 > neighborx2 and neighborx2 != pattern[0]) ] - patterns['12'].append(new_pattern) - canonkey['c'] = int(len(patterns['12']) / 2) - - # pattern 9 - patterns['9'] = [] # the 2nd line of Table 1 in Ref [1] - for pattern in patterns['3star']: - for pairs in [ [neighbor1, neighbor2] for neighbor1 in G[pattern[0]] if G.degree(neighbor1) >= 2 \ - for neighbor2 in G[pattern[0]] if G.degree(neighbor2) >= 2 if neighbor1 > neighbor2 ]: - pattern_t = pattern[:] - # move nodes with extended labels 4 to specific position to correspond to their children - pattern_t[pattern_t.index(pairs[0])], pattern_t[2] = pattern_t[2], pattern_t[pattern_t.index(pairs[0])] - pattern_t[pattern_t.index(pairs[1])], pattern_t[3] = pattern_t[3], pattern_t[pattern_t.index(pairs[1])] - for neighborx1 in G[pairs[0]]: - if neighborx1 != pattern[0]: - for neighborx2 in G[pairs[1]]: - if neighborx2 != pattern[0]: - new_pattern = pattern_t + [neighborx1] + [neighborx2] - patterns['9'].append(new_pattern) - canonkey['9'] = len(patterns['9']) - - # pattern 10 - patterns['10'] = [] # the 3rd line of Table 1 in Ref [1] - for pattern in patterns['3star']: - for i in range(1, len(pattern)): - if G.degree(pattern[i]) >= 2: - for neighborx in G[pattern[i]]: - if neighborx != pattern[0] and G.degree(neighborx) >= 2: - pattern_t = pattern[:] - pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] - new_patterns = [ pattern_t + [neighborx] + [neighborxx] for neighborxx in G[neighborx] if neighborxx != pattern[i] ] - patterns['10'].extend(new_patterns) - canonkey['a'] = len(patterns['10']) - - ### labeling information ### - ### In this section, a list of canonical keys is generated for every - ### pattern obtained in the structural analysis section above, which is a - ### string corresponding to a unique treelet. A dictionary is built to keep - ### track of the amount of every treelet. - if labeled == True: - canonkey_l = {} # canonical key, a dictionary which keeps track of amount of every treelet. - - # linear patterns - canonkey_t = Counter(list(nx.get_node_attributes(G, node_label).values())) - for key in canonkey_t: - canonkey_l[('0', key)] = canonkey_t[key] - - for i in range(1, 6): # for i in range(1, 6): - treelet = [] - for pattern in patterns[str(i)]: - canonlist = list(chain.from_iterable((G.nodes[node][node_label], \ - G[node][pattern[idx+1]][edge_label]) for idx, node in enumerate(pattern[:-1]))) - canonlist.append(G.nodes[pattern[-1]][node_label]) - canonkey_t = canonlist if canonlist < canonlist[::-1] else canonlist[::-1] - treelet.append(tuple([str(i)] + canonkey_t)) - canonkey_l.update(Counter(treelet)) - - # n-star patterns - for i in range(3, 6): - treelet = [] - for pattern in patterns[str(i) + 'star']: - canonlist = [tuple((G.nodes[leaf][node_label], - G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:]] - canonlist.sort() - canonlist = list(chain.from_iterable(canonlist)) - canonkey_t = tuple(['d' if i == 5 else str(i * 2)] + - [G.nodes[pattern[0]][node_label]] + canonlist) - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 7 - treelet = [] - for pattern in patterns['7']: - canonlist = [tuple((G.nodes[leaf][node_label], - G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:3]] - canonlist.sort() - canonlist = list(chain.from_iterable(canonlist)) - canonkey_t = tuple(['7'] + [G.nodes[pattern[0]][node_label]] + canonlist - + [G.nodes[pattern[3]][node_label]] - + [G[pattern[3]][pattern[0]][edge_label]] - + [G.nodes[pattern[4]][node_label]] - + [G[pattern[4]][pattern[3]][edge_label]]) - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 11 - treelet = [] - for pattern in patterns['11']: - canonlist = [tuple((G.nodes[leaf][node_label], - G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:4]] - canonlist.sort() - canonlist = list(chain.from_iterable(canonlist)) - canonkey_t = tuple(['b'] + [G.nodes[pattern[0]][node_label]] + canonlist - + [G.nodes[pattern[4]][node_label]] - + [G[pattern[4]][pattern[0]][edge_label]] - + [G.nodes[pattern[5]][node_label]] - + [G[pattern[5]][pattern[4]][edge_label]]) - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 10 - treelet = [] - for pattern in patterns['10']: - canonkey4 = [G.nodes[pattern[5]][node_label], G[pattern[5]][pattern[4]][edge_label]] - canonlist = [tuple((G.nodes[leaf][node_label], - G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:3]] - canonlist.sort() - canonkey0 = list(chain.from_iterable(canonlist)) - canonkey_t = tuple(['a'] + [G.nodes[pattern[3]][node_label]] - + [G.nodes[pattern[4]][node_label]] - + [G[pattern[4]][pattern[3]][edge_label]] - + [G.nodes[pattern[0]][node_label]] - + [G[pattern[0]][pattern[3]][edge_label]] - + canonkey4 + canonkey0) - treelet.append(canonkey_t) - canonkey_l.update(Counter(treelet)) - - # pattern 12 - treelet = [] - for pattern in patterns['12']: - canonlist0 = [tuple((G.nodes[leaf][node_label], - G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:3]] - canonlist0.sort() - canonlist0 = list(chain.from_iterable(canonlist0)) - canonlist3 = [tuple((G.nodes[leaf][node_label], - G[leaf][pattern[3]][edge_label])) for leaf in pattern[4:6]] - canonlist3.sort() - canonlist3 = list(chain.from_iterable(canonlist3)) - - # 2 possible key can be generated from 2 nodes with extended label 3, - # select the one with lower lexicographic order. - canonkey_t1 = tuple(['c'] + [G.nodes[pattern[0]][node_label]] + canonlist0 - + [G.nodes[pattern[3]][node_label]] - + [G[pattern[3]][pattern[0]][edge_label]] - + canonlist3) - canonkey_t2 = tuple(['c'] + [G.nodes[pattern[3]][node_label]] + canonlist3 - + [G.nodes[pattern[0]][node_label]] - + [G[pattern[0]][pattern[3]][edge_label]] - + canonlist0) - treelet.append(canonkey_t1 if canonkey_t1 < canonkey_t2 else canonkey_t2) - canonkey_l.update(Counter(treelet)) - - # pattern 9 - treelet = [] - for pattern in patterns['9']: - canonkey2 = [G.nodes[pattern[4]][node_label], G[pattern[4]][pattern[2]][edge_label]] - canonkey3 = [G.nodes[pattern[5]][node_label], G[pattern[5]][pattern[3]][edge_label]] - prekey2 = [G.nodes[pattern[2]][node_label], G[pattern[2]][pattern[0]][edge_label]] - prekey3 = [G.nodes[pattern[3]][node_label], G[pattern[3]][pattern[0]][edge_label]] - if prekey2 + canonkey2 < prekey3 + canonkey3: - canonkey_t = [G.nodes[pattern[1]][node_label]] \ - + [G[pattern[1]][pattern[0]][edge_label]] \ - + prekey2 + prekey3 + canonkey2 + canonkey3 - else: - canonkey_t = [G.nodes[pattern[1]][node_label]] \ - + [G[pattern[1]][pattern[0]][edge_label]] \ - + prekey3 + prekey2 + canonkey3 + canonkey2 - treelet.append(tuple(['9'] + [G.nodes[pattern[0]][node_label]] + canonkey_t)) - canonkey_l.update(Counter(treelet)) - - return canonkey_l - - return canonkey + """Generate canonical keys of all treelets in a graph. + + Parameters + ---------- + G : NetworkX graphs + The graph in which keys are generated. + node_label : string + node attribute used as label. The default node label is atom. + edge_label : string + edge attribute used as label. The default edge label is bond_type. + labeled : boolean + Whether the graphs are labeled. The default is True. + + Return + ------ + canonkey/canonkey_l : dict + For unlabeled graphs, canonkey is a dictionary which records amount of + every tree pattern. For labeled graphs, canonkey_l is one which keeps + track of amount of every treelet. + """ + patterns = {} # a dictionary which consists of lists of patterns for all graphlet. + canonkey = {} # canonical key, a dictionary which records amount of every tree pattern. + + ### structural analysis ### + ### In this section, a list of patterns is generated for each graphlet, + ### where every pattern is represented by nodes ordered by Morgan's + ### extended labeling. + # linear patterns + patterns['0'] = G.nodes() + canonkey['0'] = nx.number_of_nodes(G) + for i in range(1, 6): # for i in range(1, 6): + patterns[str(i)] = find_all_paths(G, i, is_directed) + canonkey[str(i)] = len(patterns[str(i)]) + + # n-star patterns + patterns['3star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 3] + patterns['4star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 4] + patterns['5star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 5] + # n-star patterns + canonkey['6'] = len(patterns['3star']) + canonkey['8'] = len(patterns['4star']) + canonkey['d'] = len(patterns['5star']) + + # pattern 7 + patterns['7'] = [] # the 1st line of Table 1 in Ref [1] + for pattern in patterns['3star']: + for i in range(1, len(pattern)): # for each neighbor of node 0 + if G.degree(pattern[i]) >= 2: + pattern_t = pattern[:] + # set the node with degree >= 2 as the 4th node + pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] + for neighborx in G[pattern[i]]: + if neighborx != pattern[0]: + new_pattern = pattern_t + [neighborx] + patterns['7'].append(new_pattern) + canonkey['7'] = len(patterns['7']) + + # pattern 11 + patterns['11'] = [] # the 4th line of Table 1 in Ref [1] + for pattern in patterns['4star']: + for i in range(1, len(pattern)): + if G.degree(pattern[i]) >= 2: + pattern_t = pattern[:] + pattern_t[i], pattern_t[4] = pattern_t[4], pattern_t[i] + for neighborx in G[pattern[i]]: + if neighborx != pattern[0]: + new_pattern = pattern_t + [ neighborx ] + patterns['11'].append(new_pattern) + canonkey['b'] = len(patterns['11']) + + # pattern 12 + patterns['12'] = [] # the 5th line of Table 1 in Ref [1] + rootlist = [] # a list of root nodes, whose extended labels are 3 + for pattern in patterns['3star']: + if pattern[0] not in rootlist: # prevent to count the same pattern twice from each of the two root nodes + rootlist.append(pattern[0]) + for i in range(1, len(pattern)): + if G.degree(pattern[i]) >= 3: + rootlist.append(pattern[i]) + pattern_t = pattern[:] + pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] + for neighborx1 in G[pattern[i]]: + if neighborx1 != pattern[0]: + for neighborx2 in G[pattern[i]]: + if neighborx1 > neighborx2 and neighborx2 != pattern[0]: + new_pattern = pattern_t + [neighborx1] + [neighborx2] +# new_patterns = [ pattern + [neighborx1] + [neighborx2] for neighborx1 in G[pattern[i]] if neighborx1 != pattern[0] for neighborx2 in G[pattern[i]] if (neighborx1 > neighborx2 and neighborx2 != pattern[0]) ] + patterns['12'].append(new_pattern) + canonkey['c'] = int(len(patterns['12']) / 2) + + # pattern 9 + patterns['9'] = [] # the 2nd line of Table 1 in Ref [1] + for pattern in patterns['3star']: + for pairs in [ [neighbor1, neighbor2] for neighbor1 in G[pattern[0]] if G.degree(neighbor1) >= 2 \ + for neighbor2 in G[pattern[0]] if G.degree(neighbor2) >= 2 if neighbor1 > neighbor2 ]: + pattern_t = pattern[:] + # move nodes with extended labels 4 to specific position to correspond to their children + pattern_t[pattern_t.index(pairs[0])], pattern_t[2] = pattern_t[2], pattern_t[pattern_t.index(pairs[0])] + pattern_t[pattern_t.index(pairs[1])], pattern_t[3] = pattern_t[3], pattern_t[pattern_t.index(pairs[1])] + for neighborx1 in G[pairs[0]]: + if neighborx1 != pattern[0]: + for neighborx2 in G[pairs[1]]: + if neighborx2 != pattern[0]: + new_pattern = pattern_t + [neighborx1] + [neighborx2] + patterns['9'].append(new_pattern) + canonkey['9'] = len(patterns['9']) + + # pattern 10 + patterns['10'] = [] # the 3rd line of Table 1 in Ref [1] + for pattern in patterns['3star']: + for i in range(1, len(pattern)): + if G.degree(pattern[i]) >= 2: + for neighborx in G[pattern[i]]: + if neighborx != pattern[0] and G.degree(neighborx) >= 2: + pattern_t = pattern[:] + pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] + new_patterns = [ pattern_t + [neighborx] + [neighborxx] for neighborxx in G[neighborx] if neighborxx != pattern[i] ] + patterns['10'].extend(new_patterns) + canonkey['a'] = len(patterns['10']) + + ### labeling information ### + ### In this section, a list of canonical keys is generated for every + ### pattern obtained in the structural analysis section above, which is a + ### string corresponding to a unique treelet. A dictionary is built to keep + ### track of the amount of every treelet. + if labeled == True: + canonkey_l = {} # canonical key, a dictionary which keeps track of amount of every treelet. + + # linear patterns + canonkey_t = Counter(list(nx.get_node_attributes(G, node_label).values())) + for key in canonkey_t: + canonkey_l[('0', key)] = canonkey_t[key] + + for i in range(1, 6): # for i in range(1, 6): + treelet = [] + for pattern in patterns[str(i)]: + canonlist = list(chain.from_iterable((G.nodes[node][node_label], \ + G[node][pattern[idx+1]][edge_label]) for idx, node in enumerate(pattern[:-1]))) + canonlist.append(G.nodes[pattern[-1]][node_label]) + canonkey_t = canonlist if canonlist < canonlist[::-1] else canonlist[::-1] + treelet.append(tuple([str(i)] + canonkey_t)) + canonkey_l.update(Counter(treelet)) + + # n-star patterns + for i in range(3, 6): + treelet = [] + for pattern in patterns[str(i) + 'star']: + canonlist = [tuple((G.nodes[leaf][node_label], + G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:]] + canonlist.sort() + canonlist = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['d' if i == 5 else str(i * 2)] + + [G.nodes[pattern[0]][node_label]] + canonlist) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 7 + treelet = [] + for pattern in patterns['7']: + canonlist = [tuple((G.nodes[leaf][node_label], + G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:3]] + canonlist.sort() + canonlist = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['7'] + [G.nodes[pattern[0]][node_label]] + canonlist + + [G.nodes[pattern[3]][node_label]] + + [G[pattern[3]][pattern[0]][edge_label]] + + [G.nodes[pattern[4]][node_label]] + + [G[pattern[4]][pattern[3]][edge_label]]) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 11 + treelet = [] + for pattern in patterns['11']: + canonlist = [tuple((G.nodes[leaf][node_label], + G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:4]] + canonlist.sort() + canonlist = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['b'] + [G.nodes[pattern[0]][node_label]] + canonlist + + [G.nodes[pattern[4]][node_label]] + + [G[pattern[4]][pattern[0]][edge_label]] + + [G.nodes[pattern[5]][node_label]] + + [G[pattern[5]][pattern[4]][edge_label]]) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 10 + treelet = [] + for pattern in patterns['10']: + canonkey4 = [G.nodes[pattern[5]][node_label], G[pattern[5]][pattern[4]][edge_label]] + canonlist = [tuple((G.nodes[leaf][node_label], + G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:3]] + canonlist.sort() + canonkey0 = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['a'] + [G.nodes[pattern[3]][node_label]] + + [G.nodes[pattern[4]][node_label]] + + [G[pattern[4]][pattern[3]][edge_label]] + + [G.nodes[pattern[0]][node_label]] + + [G[pattern[0]][pattern[3]][edge_label]] + + canonkey4 + canonkey0) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 12 + treelet = [] + for pattern in patterns['12']: + canonlist0 = [tuple((G.nodes[leaf][node_label], + G[leaf][pattern[0]][edge_label])) for leaf in pattern[1:3]] + canonlist0.sort() + canonlist0 = list(chain.from_iterable(canonlist0)) + canonlist3 = [tuple((G.nodes[leaf][node_label], + G[leaf][pattern[3]][edge_label])) for leaf in pattern[4:6]] + canonlist3.sort() + canonlist3 = list(chain.from_iterable(canonlist3)) + + # 2 possible key can be generated from 2 nodes with extended label 3, + # select the one with lower lexicographic order. + canonkey_t1 = tuple(['c'] + [G.nodes[pattern[0]][node_label]] + canonlist0 + + [G.nodes[pattern[3]][node_label]] + + [G[pattern[3]][pattern[0]][edge_label]] + + canonlist3) + canonkey_t2 = tuple(['c'] + [G.nodes[pattern[3]][node_label]] + canonlist3 + + [G.nodes[pattern[0]][node_label]] + + [G[pattern[0]][pattern[3]][edge_label]] + + canonlist0) + treelet.append(canonkey_t1 if canonkey_t1 < canonkey_t2 else canonkey_t2) + canonkey_l.update(Counter(treelet)) + + # pattern 9 + treelet = [] + for pattern in patterns['9']: + canonkey2 = [G.nodes[pattern[4]][node_label], G[pattern[4]][pattern[2]][edge_label]] + canonkey3 = [G.nodes[pattern[5]][node_label], G[pattern[5]][pattern[3]][edge_label]] + prekey2 = [G.nodes[pattern[2]][node_label], G[pattern[2]][pattern[0]][edge_label]] + prekey3 = [G.nodes[pattern[3]][node_label], G[pattern[3]][pattern[0]][edge_label]] + if prekey2 + canonkey2 < prekey3 + canonkey3: + canonkey_t = [G.nodes[pattern[1]][node_label]] \ + + [G[pattern[1]][pattern[0]][edge_label]] \ + + prekey2 + prekey3 + canonkey2 + canonkey3 + else: + canonkey_t = [G.nodes[pattern[1]][node_label]] \ + + [G[pattern[1]][pattern[0]][edge_label]] \ + + prekey3 + prekey2 + canonkey3 + canonkey2 + treelet.append(tuple(['9'] + [G.nodes[pattern[0]][node_label]] + canonkey_t)) + canonkey_l.update(Counter(treelet)) + + return canonkey_l + + return canonkey def wrapper_get_canonkeys(node_label, edge_label, labeled, is_directed, itr_item): - g = itr_item[0] - i = itr_item[1] - return i, get_canonkeys(g, node_label, edge_label, labeled, is_directed) - + g = itr_item[0] + i = itr_item[1] + return i, get_canonkeys(g, node_label, edge_label, labeled, is_directed) + def find_paths(G, source_node, length): - """Find all paths with a certain length those start from a source node. - A recursive depth first search is applied. - - Parameters - ---------- - G : NetworkX graphs - The graph in which paths are searched. - source_node : integer - The number of the node from where all paths start. - length : integer - The length of paths. - - Return - ------ - path : list of list - List of paths retrieved, where each path is represented by a list of nodes. - """ - if length == 0: - return [[source_node]] - path = [[source_node] + path for neighbor in G[source_node] \ - for path in find_paths(G, neighbor, length - 1) if source_node not in path] - return path + """Find all paths with a certain length those start from a source node. + A recursive depth first search is applied. + + Parameters + ---------- + G : NetworkX graphs + The graph in which paths are searched. + source_node : integer + The number of the node from where all paths start. + length : integer + The length of paths. + + Return + ------ + path : list of list + List of paths retrieved, where each path is represented by a list of nodes. + """ + if length == 0: + return [[source_node]] + path = [[source_node] + path for neighbor in G[source_node] \ + for path in find_paths(G, neighbor, length - 1) if source_node not in path] + return path def find_all_paths(G, length, is_directed): - """Find all paths with a certain length in a graph. A recursive depth first - search is applied. - - Parameters - ---------- - G : NetworkX graphs - The graph in which paths are searched. - length : integer - The length of paths. - - Return - ------ - path : list of list - List of paths retrieved, where each path is represented by a list of nodes. - """ - all_paths = [] - for node in G: - all_paths.extend(find_paths(G, node, length)) - - if not is_directed: - # For each path, two presentations are retrieved from its two extremities. - # Remove one of them. - all_paths_r = [path[::-1] for path in all_paths] - for idx, path in enumerate(all_paths[:-1]): - for path2 in all_paths_r[idx+1::]: - if path == path2: - all_paths[idx] = [] - break - all_paths = list(filter(lambda a: a != [], all_paths)) - - return all_paths + """Find all paths with a certain length in a graph. A recursive depth first + search is applied. + + Parameters + ---------- + G : NetworkX graphs + The graph in which paths are searched. + length : integer + The length of paths. + + Return + ------ + path : list of list + List of paths retrieved, where each path is represented by a list of nodes. + """ + all_paths = [] + for node in G: + all_paths.extend(find_paths(G, node, length)) + + if not is_directed: + # For each path, two presentations are retrieved from its two extremities. + # Remove one of them. + all_paths_r = [path[::-1] for path in all_paths] + for idx, path in enumerate(all_paths[:-1]): + for path2 in all_paths_r[idx+1::]: + if path == path2: + all_paths[idx] = [] + break + all_paths = list(filter(lambda a: a != [], all_paths)) + + return all_paths From 92c24ffeca11bafb60b593c2718141622b5b1f35 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 14 Apr 2020 15:14:06 +0200 Subject: [PATCH 6/9] Add class Treelet. --- gklearn/kernels/__init__.py | 1 + gklearn/kernels/path_up_to_h.py | 2 +- gklearn/kernels/treelet.py | 505 +++++++++++++++++++++ gklearn/preimage/experiments/xp_median_preimage.py | 277 +++++++++-- gklearn/preimage/median_preimage_generator.py | 8 +- gklearn/preimage/utils.py | 5 + gklearn/tests/test_graph_kernels.py | 43 +- gklearn/utils/utils.py | 75 ++- 8 files changed, 852 insertions(+), 64 deletions(-) create mode 100644 gklearn/kernels/treelet.py diff --git a/gklearn/kernels/__init__.py b/gklearn/kernels/__init__.py index 60fea24..4afcc67 100644 --- a/gklearn/kernels/__init__.py +++ b/gklearn/kernels/__init__.py @@ -11,3 +11,4 @@ from gklearn.kernels.graph_kernel import GraphKernel from gklearn.kernels.structural_sp import StructuralSP from gklearn.kernels.shortest_path import ShortestPath from gklearn.kernels.path_up_to_h import PathUpToH +from gklearn.kernels.treelet import Treelet diff --git a/gklearn/kernels/path_up_to_h.py b/gklearn/kernels/path_up_to_h.py index d031021..b23687c 100644 --- a/gklearn/kernels/path_up_to_h.py +++ b/gklearn/kernels/path_up_to_h.py @@ -176,7 +176,7 @@ class PathUpToH(GraphKernel): # @todo: add function for k_func == None pool.close() pool.join() - # compute Gram matrix. + # compute kernel list. kernel_list = [None] * len(g_list) def init_worker(p1_toshare, plist_toshare): diff --git a/gklearn/kernels/treelet.py b/gklearn/kernels/treelet.py new file mode 100644 index 0000000..134c683 --- /dev/null +++ b/gklearn/kernels/treelet.py @@ -0,0 +1,505 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Apr 13 18:02:46 2020 + +@author: ljia + +@references: + + [1] Gaüzère B, Brun L, Villemin D. Two new graphs kernels in + chemoinformatics. Pattern Recognition Letters. 2012 Nov 1;33(15):2038-47. +""" + +import sys +from multiprocessing import Pool +from tqdm import tqdm +import numpy as np +import networkx as nx +from collections import Counter +from itertools import chain +from gklearn.utils.parallel import parallel_gm, parallel_me +from gklearn.utils.utils import find_all_paths, get_mlti_dim_node_attrs +from gklearn.kernels import GraphKernel + + +class Treelet(GraphKernel): + + def __init__(self, **kwargs): + GraphKernel.__init__(self) + self.__node_labels = kwargs.get('node_labels', []) + self.__edge_labels = kwargs.get('edge_labels', []) + self.__sub_kernel = kwargs.get('sub_kernel', None) + self.__ds_infos = kwargs.get('ds_infos', {}) + if self.__sub_kernel is None: + raise Exception('Sub kernel not set.') + + + def _compute_gm_series(self): + self.__add_dummy_labels(self._graphs) + + # get all canonical keys of all graphs before calculating kernels to save + # time, but this may cost a lot of memory for large dataset. + canonkeys = [] + if self._verbose >= 2: + iterator = tqdm(self._graphs, desc='getting canonkeys', file=sys.stdout) + else: + iterator = self._graphs + for g in iterator: + canonkeys.append(self.__get_canonkeys(g)) + + # compute Gram matrix. + gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) + + from itertools import combinations_with_replacement + itr = combinations_with_replacement(range(0, len(self._graphs)), 2) + if self._verbose >= 2: + iterator = tqdm(itr, desc='calculating kernels', file=sys.stdout) + else: + iterator = itr + for i, j in iterator: + kernel = self.__kernel_do(canonkeys[i], canonkeys[j]) + gram_matrix[i][j] = kernel + gram_matrix[j][i] = kernel # @todo: no directed graph considered? + + return gram_matrix + + + def _compute_gm_imap_unordered(self): + self.__add_dummy_labels(self._graphs) + + # get all canonical keys of all graphs before calculating kernels to save + # time, but this may cost a lot of memory for large dataset. + pool = Pool(self._n_jobs) + itr = zip(self._graphs, range(0, len(self._graphs))) + if len(self._graphs) < 100 * self._n_jobs: + chunksize = int(len(self._graphs) / self._n_jobs) + 1 + else: + chunksize = 100 + canonkeys = [[] for _ in range(len(self._graphs))] + get_fun = self._wrapper_get_canonkeys + if self._verbose >= 2: + iterator = tqdm(pool.imap_unordered(get_fun, itr, chunksize), + desc='getting canonkeys', file=sys.stdout) + else: + iterator = pool.imap_unordered(get_fun, itr, chunksize) + for i, ck in iterator: + canonkeys[i] = ck + pool.close() + pool.join() + + # compute Gram matrix. + gram_matrix = np.zeros((len(self._graphs), len(self._graphs))) + + def init_worker(canonkeys_toshare): + global G_canonkeys + G_canonkeys = canonkeys_toshare + do_fun = self._wrapper_kernel_do + parallel_gm(do_fun, gram_matrix, self._graphs, init_worker=init_worker, + glbv=(canonkeys,), n_jobs=self._n_jobs, verbose=self._verbose) + + return gram_matrix + + + def _compute_kernel_list_series(self, g1, g_list): + self.__add_dummy_labels(g_list + [g1]) + + # get all canonical keys of all graphs before calculating kernels to save + # time, but this may cost a lot of memory for large dataset. + canonkeys_1 = self.__get_canonkeys(g1) + canonkeys_list = [] + if self._verbose >= 2: + iterator = tqdm(g_list, desc='getting canonkeys', file=sys.stdout) + else: + iterator = g_list + for g in iterator: + canonkeys_list.append(self.__get_canonkeys(g)) + + # compute kernel list. + kernel_list = [None] * len(g_list) + if self._verbose >= 2: + iterator = tqdm(range(len(g_list)), desc='calculating kernels', file=sys.stdout) + else: + iterator = range(len(g_list)) + for i in iterator: + kernel = self.__kernel_do(canonkeys_1, canonkeys_list[i]) + kernel_list[i] = kernel + + return kernel_list + + + def _compute_kernel_list_imap_unordered(self, g1, g_list): + self.__add_dummy_labels(g_list + [g1]) + + # get all canonical keys of all graphs before calculating kernels to save + # time, but this may cost a lot of memory for large dataset. + canonkeys_1 = self.__get_canonkeys(g1) + canonkeys_list = [[] for _ in range(len(g_list))] + pool = Pool(self._n_jobs) + itr = zip(g_list, range(0, len(g_list))) + if len(g_list) < 100 * self._n_jobs: + chunksize = int(len(g_list) / self._n_jobs) + 1 + else: + chunksize = 100 + get_fun = self._wrapper_get_canonkeys + if self._verbose >= 2: + iterator = tqdm(pool.imap_unordered(get_fun, itr, chunksize), + desc='getting canonkeys', file=sys.stdout) + else: + iterator = pool.imap_unordered(get_fun, itr, chunksize) + for i, ck in iterator: + canonkeys_list[i] = ck + pool.close() + pool.join() + + # compute kernel list. + kernel_list = [None] * len(g_list) + + def init_worker(ck_1_toshare, ck_list_toshare): + global G_ck_1, G_ck_list + G_ck_1 = ck_1_toshare + G_ck_list = ck_list_toshare + do_fun = self._wrapper_kernel_list_do + def func_assign(result, var_to_assign): + var_to_assign[result[0]] = result[1] + itr = range(len(g_list)) + len_itr = len(g_list) + parallel_me(do_fun, func_assign, kernel_list, itr, len_itr=len_itr, + init_worker=init_worker, glbv=(canonkeys_1, canonkeys_list), method='imap_unordered', + n_jobs=self._n_jobs, itr_desc='calculating kernels', verbose=self._verbose) + + return kernel_list + + + def _wrapper_kernel_list_do(self, itr): + return itr, self.__kernel_do(G_ck_1, G_ck_list[itr]) + + + def _compute_single_kernel_series(self, g1, g2): + self.__add_dummy_labels([g1] + [g2]) + canonkeys_1 = self.__get_canonkeys(g1) + canonkeys_2 = self.__get_canonkeys(g2) + kernel = self.__kernel_do(canonkeys_1, canonkeys_2) + return kernel + + + def __kernel_do(self, canonkey1, canonkey2): + """Calculate treelet graph kernel between 2 graphs. + + Parameters + ---------- + canonkey1, canonkey2 : list + List of canonical keys in 2 graphs, where each key is represented by a string. + + Return + ------ + kernel : float + Treelet Kernel between 2 graphs. + """ + keys = set(canonkey1.keys()) & set(canonkey2.keys()) # find same canonical keys in both graphs + vector1 = np.array([(canonkey1[key] if (key in canonkey1.keys()) else 0) for key in keys]) + vector2 = np.array([(canonkey2[key] if (key in canonkey2.keys()) else 0) for key in keys]) + kernel = self.__sub_kernel(vector1, vector2) + return kernel + + + def _wrapper_kernel_do(self, itr): + i = itr[0] + j = itr[1] + return i, j, self.__kernel_do(G_canonkeys[i], G_canonkeys[j]) + + + def __get_canonkeys(self, G): + """Generate canonical keys of all treelets in a graph. + + Parameters + ---------- + G : NetworkX graphs + The graph in which keys are generated. + + Return + ------ + canonkey/canonkey_l : dict + For unlabeled graphs, canonkey is a dictionary which records amount of + every tree pattern. For labeled graphs, canonkey_l is one which keeps + track of amount of every treelet. + """ + patterns = {} # a dictionary which consists of lists of patterns for all graphlet. + canonkey = {} # canonical key, a dictionary which records amount of every tree pattern. + + ### structural analysis ### + ### In this section, a list of patterns is generated for each graphlet, + ### where every pattern is represented by nodes ordered by Morgan's + ### extended labeling. + # linear patterns + patterns['0'] = list(G.nodes()) + canonkey['0'] = nx.number_of_nodes(G) + for i in range(1, 6): # for i in range(1, 6): + patterns[str(i)] = find_all_paths(G, i, self.__ds_infos['directed']) + canonkey[str(i)] = len(patterns[str(i)]) + + # n-star patterns + patterns['3star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 3] + patterns['4star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 4] + patterns['5star'] = [[node] + [neighbor for neighbor in G[node]] for node in G.nodes() if G.degree(node) == 5] + # n-star patterns + canonkey['6'] = len(patterns['3star']) + canonkey['8'] = len(patterns['4star']) + canonkey['d'] = len(patterns['5star']) + + # pattern 7 + patterns['7'] = [] # the 1st line of Table 1 in Ref [1] + for pattern in patterns['3star']: + for i in range(1, len(pattern)): # for each neighbor of node 0 + if G.degree(pattern[i]) >= 2: + pattern_t = pattern[:] + # set the node with degree >= 2 as the 4th node + pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] + for neighborx in G[pattern[i]]: + if neighborx != pattern[0]: + new_pattern = pattern_t + [neighborx] + patterns['7'].append(new_pattern) + canonkey['7'] = len(patterns['7']) + + # pattern 11 + patterns['11'] = [] # the 4th line of Table 1 in Ref [1] + for pattern in patterns['4star']: + for i in range(1, len(pattern)): + if G.degree(pattern[i]) >= 2: + pattern_t = pattern[:] + pattern_t[i], pattern_t[4] = pattern_t[4], pattern_t[i] + for neighborx in G[pattern[i]]: + if neighborx != pattern[0]: + new_pattern = pattern_t + [neighborx] + patterns['11'].append(new_pattern) + canonkey['b'] = len(patterns['11']) + + # pattern 12 + patterns['12'] = [] # the 5th line of Table 1 in Ref [1] + rootlist = [] # a list of root nodes, whose extended labels are 3 + for pattern in patterns['3star']: + if pattern[0] not in rootlist: # prevent to count the same pattern twice from each of the two root nodes + rootlist.append(pattern[0]) + for i in range(1, len(pattern)): + if G.degree(pattern[i]) >= 3: + rootlist.append(pattern[i]) + pattern_t = pattern[:] + pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] + for neighborx1 in G[pattern[i]]: + if neighborx1 != pattern[0]: + for neighborx2 in G[pattern[i]]: + if neighborx1 > neighborx2 and neighborx2 != pattern[0]: + new_pattern = pattern_t + [neighborx1] + [neighborx2] + # new_patterns = [ pattern + [neighborx1] + [neighborx2] for neighborx1 in G[pattern[i]] if neighborx1 != pattern[0] for neighborx2 in G[pattern[i]] if (neighborx1 > neighborx2 and neighborx2 != pattern[0]) ] + patterns['12'].append(new_pattern) + canonkey['c'] = int(len(patterns['12']) / 2) + + # pattern 9 + patterns['9'] = [] # the 2nd line of Table 1 in Ref [1] + for pattern in patterns['3star']: + for pairs in [ [neighbor1, neighbor2] for neighbor1 in G[pattern[0]] if G.degree(neighbor1) >= 2 \ + for neighbor2 in G[pattern[0]] if G.degree(neighbor2) >= 2 if neighbor1 > neighbor2]: + pattern_t = pattern[:] + # move nodes with extended labels 4 to specific position to correspond to their children + pattern_t[pattern_t.index(pairs[0])], pattern_t[2] = pattern_t[2], pattern_t[pattern_t.index(pairs[0])] + pattern_t[pattern_t.index(pairs[1])], pattern_t[3] = pattern_t[3], pattern_t[pattern_t.index(pairs[1])] + for neighborx1 in G[pairs[0]]: + if neighborx1 != pattern[0]: + for neighborx2 in G[pairs[1]]: + if neighborx2 != pattern[0]: + new_pattern = pattern_t + [neighborx1] + [neighborx2] + patterns['9'].append(new_pattern) + canonkey['9'] = len(patterns['9']) + + # pattern 10 + patterns['10'] = [] # the 3rd line of Table 1 in Ref [1] + for pattern in patterns['3star']: + for i in range(1, len(pattern)): + if G.degree(pattern[i]) >= 2: + for neighborx in G[pattern[i]]: + if neighborx != pattern[0] and G.degree(neighborx) >= 2: + pattern_t = pattern[:] + pattern_t[i], pattern_t[3] = pattern_t[3], pattern_t[i] + new_patterns = [ pattern_t + [neighborx] + [neighborxx] for neighborxx in G[neighborx] if neighborxx != pattern[i] ] + patterns['10'].extend(new_patterns) + canonkey['a'] = len(patterns['10']) + + ### labeling information ### + ### In this section, a list of canonical keys is generated for every + ### pattern obtained in the structural analysis section above, which is a + ### string corresponding to a unique treelet. A dictionary is built to keep + ### track of the amount of every treelet. + if len(self.__node_labels) > 0 or len(self.__edge_labels) > 0: + canonkey_l = {} # canonical key, a dictionary which keeps track of amount of every treelet. + + # linear patterns + canonkey_t = Counter(get_mlti_dim_node_attrs(G, self.__node_labels)) + for key in canonkey_t: + canonkey_l[('0', key)] = canonkey_t[key] + + for i in range(1, 6): # for i in range(1, 6): + treelet = [] + for pattern in patterns[str(i)]: + canonlist = [] + for idx, node in enumerate(pattern[:-1]): + canonlist.append(tuple(G.nodes[node][nl] for nl in self.__node_labels)) + canonlist.append(tuple(G[node][pattern[idx+1]][el] for el in self.__edge_labels)) + canonlist.append(tuple(G.nodes[pattern[-1]][nl] for nl in self.__node_labels)) + canonkey_t = canonlist if canonlist < canonlist[::-1] else canonlist[::-1] + treelet.append(tuple([str(i)] + canonkey_t)) + canonkey_l.update(Counter(treelet)) + + # n-star patterns + for i in range(3, 6): + treelet = [] + for pattern in patterns[str(i) + 'star']: + canonlist = [] + for leaf in pattern[1:]: + nlabels = tuple(G.nodes[leaf][nl] for nl in self.__node_labels) + elabels = tuple(G[leaf][pattern[0]][el] for el in self.__edge_labels) + canonlist.append(tuple((nlabels, elabels))) + canonlist.sort() + canonlist = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['d' if i == 5 else str(i * 2)] + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + + canonlist) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 7 + treelet = [] + for pattern in patterns['7']: + canonlist = [] + for leaf in pattern[1:3]: + nlabels = tuple(G.nodes[leaf][nl] for nl in self.__node_labels) + elabels = tuple(G[leaf][pattern[0]][el] for el in self.__edge_labels) + canonlist.append(tuple((nlabels, elabels))) + canonlist.sort() + canonlist = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['7'] + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + canonlist + + [tuple(G.nodes[pattern[3]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[3]][pattern[0]][el] for el in self.__edge_labels)] + + [tuple(G.nodes[pattern[4]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[4]][pattern[3]][el] for el in self.__edge_labels)]) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 11 + treelet = [] + for pattern in patterns['11']: + canonlist = [] + for leaf in pattern[1:4]: + nlabels = tuple(G.nodes[leaf][nl] for nl in self.__node_labels) + elabels = tuple(G[leaf][pattern[0]][el] for el in self.__edge_labels) + canonlist.append(tuple((nlabels, elabels))) + canonlist.sort() + canonlist = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['b'] + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + canonlist + + [tuple(G.nodes[pattern[4]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[4]][pattern[0]][el] for el in self.__edge_labels)] + + [tuple(G.nodes[pattern[5]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[5]][pattern[4]][el] for el in self.__edge_labels)]) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 10 + treelet = [] + for pattern in patterns['10']: + canonkey4 = [tuple(G.nodes[pattern[5]][nl] for nl in self.__node_labels), + tuple(G[pattern[5]][pattern[4]][el] for el in self.__edge_labels)] + canonlist = [] + for leaf in pattern[1:3]: + nlabels = tuple(G.nodes[leaf][nl] for nl in self.__node_labels) + elabels = tuple(G[leaf][pattern[0]][el] for el in self.__edge_labels) + canonlist.append(tuple((nlabels, elabels))) + canonlist.sort() + canonkey0 = list(chain.from_iterable(canonlist)) + canonkey_t = tuple(['a'] + + [tuple(G.nodes[pattern[3]][nl] for nl in self.__node_labels)] + + [tuple(G.nodes[pattern[4]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[4]][pattern[3]][el] for el in self.__edge_labels)] + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[0]][pattern[3]][el] for el in self.__edge_labels)] + + canonkey4 + canonkey0) + treelet.append(canonkey_t) + canonkey_l.update(Counter(treelet)) + + # pattern 12 + treelet = [] + for pattern in patterns['12']: + canonlist0 = [] + for leaf in pattern[1:3]: + nlabels = tuple(G.nodes[leaf][nl] for nl in self.__node_labels) + elabels = tuple(G[leaf][pattern[0]][el] for el in self.__edge_labels) + canonlist0.append(tuple((nlabels, elabels))) + canonlist0.sort() + canonlist0 = list(chain.from_iterable(canonlist0)) + canonlist3 = [] + for leaf in pattern[4:6]: + nlabels = tuple(G.nodes[leaf][nl] for nl in self.__node_labels) + elabels = tuple(G[leaf][pattern[3]][el] for el in self.__edge_labels) + canonlist3.append(tuple((nlabels, elabels))) + canonlist3.sort() + canonlist3 = list(chain.from_iterable(canonlist3)) + + # 2 possible key can be generated from 2 nodes with extended label 3, + # select the one with lower lexicographic order. + canonkey_t1 = tuple(['c'] + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + canonlist0 + + [tuple(G.nodes[pattern[3]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[3]][pattern[0]][el] for el in self.__edge_labels)] + + canonlist3) + canonkey_t2 = tuple(['c'] + + [tuple(G.nodes[pattern[3]][nl] for nl in self.__node_labels)] + canonlist3 + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + + [tuple(G[pattern[0]][pattern[3]][el] for el in self.__edge_labels)] + + canonlist0) + treelet.append(canonkey_t1 if canonkey_t1 < canonkey_t2 else canonkey_t2) + canonkey_l.update(Counter(treelet)) + + # pattern 9 + treelet = [] + for pattern in patterns['9']: + canonkey2 = [tuple(G.nodes[pattern[4]][nl] for nl in self.__node_labels), + tuple(G[pattern[4]][pattern[2]][el] for el in self.__edge_labels)] + canonkey3 = [tuple(G.nodes[pattern[5]][nl] for nl in self.__node_labels), + tuple(G[pattern[5]][pattern[3]][el] for el in self.__edge_labels)] + prekey2 = [tuple(G.nodes[pattern[2]][nl] for nl in self.__node_labels), + tuple(G[pattern[2]][pattern[0]][el] for el in self.__edge_labels)] + prekey3 = [tuple(G.nodes[pattern[3]][nl] for nl in self.__node_labels), + tuple(G[pattern[3]][pattern[0]][el] for el in self.__edge_labels)] + if prekey2 + canonkey2 < prekey3 + canonkey3: + canonkey_t = [tuple(G.nodes[pattern[1]][nl] for nl in self.__node_labels)] \ + + [tuple(G[pattern[1]][pattern[0]][el] for el in self.__edge_labels)] \ + + prekey2 + prekey3 + canonkey2 + canonkey3 + else: + canonkey_t = [tuple(G.nodes[pattern[1]][nl] for nl in self.__node_labels)] \ + + [tuple(G[pattern[1]][pattern[0]][el] for el in self.__edge_labels)] \ + + prekey3 + prekey2 + canonkey3 + canonkey2 + treelet.append(tuple(['9'] + + [tuple(G.nodes[pattern[0]][nl] for nl in self.__node_labels)] + + canonkey_t)) + canonkey_l.update(Counter(treelet)) + + return canonkey_l + + return canonkey + + + def _wrapper_get_canonkeys(self, itr_item): + g = itr_item[0] + i = itr_item[1] + return i, self.__get_canonkeys(g) + + + def __add_dummy_labels(self, Gn): + if len(self.__node_labels) == 0: + for G in Gn: + nx.set_node_attributes(G, '0', 'dummy') + self.__node_labels.append('dummy') + if len(self.__edge_labels) == 0: + for G in Gn: + nx.set_edge_attributes(G, '0', 'dummy') + self.__edge_labels.append('dummy') \ No newline at end of file diff --git a/gklearn/preimage/experiments/xp_median_preimage.py b/gklearn/preimage/experiments/xp_median_preimage.py index 2b920e7..f3206bc 100644 --- a/gklearn/preimage/experiments/xp_median_preimage.py +++ b/gklearn/preimage/experiments/xp_median_preimage.py @@ -53,7 +53,7 @@ def xp_median_preimage_9_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # edge_required = False # @@ -69,7 +69,7 @@ def xp_median_preimage_9_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -114,7 +114,7 @@ def xp_median_preimage_9_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = {'node_attrs': ['x', 'y', 'z'], 'edge_labels': ['bond_stereo']} # edge_required = False # @@ -130,7 +130,68 @@ def xp_median_preimage_9_2(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_9_3(): + """xp 9_3: MAO, Treelet, using CONSTANT. + """ + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=4, c=1e+7) + kernel_options = {'name': 'Treelet', # + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -178,7 +239,7 @@ def xp_median_preimage_8_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -194,7 +255,7 @@ def xp_median_preimage_8_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -239,7 +300,68 @@ def xp_median_preimage_8_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_8_3(): + """xp 8_3: Monoterpenoides, Treelet, using CONSTANT. + """ + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=2, c=1e+5) + kernel_options = {'name': 'Treelet', + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -255,7 +377,7 @@ def xp_median_preimage_8_2(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -303,7 +425,7 @@ def xp_median_preimage_7_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -319,7 +441,7 @@ def xp_median_preimage_7_1(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -364,7 +486,7 @@ def xp_median_preimage_7_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -380,7 +502,68 @@ def xp_median_preimage_7_2(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_7_3(): + """xp 7_3: MUTAG, Treelet, using CONSTANT. + """ + from gklearn.utils.kernels import polynomialkernel + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + pkernel = functools.partial(polynomialkernel, d=3, c=1e+8) + kernel_options = {'name': 'Treelet', + 'sub_kernel': pkernel, + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -428,7 +611,7 @@ def xp_median_preimage_6_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -444,7 +627,7 @@ def xp_median_preimage_6_1(): print() # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -490,7 +673,7 @@ def xp_median_preimage_6_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = True # @@ -506,7 +689,7 @@ def xp_median_preimage_6_2(): print() # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -554,7 +737,7 @@ def xp_median_preimage_5_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -570,7 +753,7 @@ def xp_median_preimage_5_1(): print() # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -618,7 +801,7 @@ def xp_median_preimage_4_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = False # @@ -634,7 +817,7 @@ def xp_median_preimage_4_1(): print() # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -680,7 +863,7 @@ def xp_median_preimage_3_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # edge_required = True # @@ -696,7 +879,7 @@ def xp_median_preimage_3_2(): print() # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -744,7 +927,7 @@ def xp_median_preimage_3_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # edge_required = False # @@ -760,7 +943,7 @@ def xp_median_preimage_3_1(): print() # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -808,7 +991,7 @@ def xp_median_preimage_2_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = {'edge_labels': ['valence']} # print settings. @@ -827,7 +1010,7 @@ def xp_median_preimage_2_1(): # compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, dir_save=dir_save, irrelevant_labels=irrelevant_labels) # generate preimages. - for fit_method in ['k-graphs'] + ['random'] * 10: + for fit_method in ['k-graphs'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -875,6 +1058,7 @@ def xp_median_preimage_1_1(): 'verbose': 2, 'refine': False} save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' # print settings. print('parameters:') @@ -886,11 +1070,11 @@ def xp_median_preimage_1_1(): print('save_results:', save_results) # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method - generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save) def xp_median_preimage_1_2(): @@ -932,7 +1116,7 @@ def xp_median_preimage_1_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = True # @@ -948,7 +1132,7 @@ def xp_median_preimage_1_2(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -996,6 +1180,7 @@ def xp_median_preimage_10_1(): 'verbose': 2, 'refine': False} save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' # print settings. print('parameters:') @@ -1007,11 +1192,11 @@ def xp_median_preimage_10_1(): print('save_results:', save_results) # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method - generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save) def xp_median_preimage_10_2(): @@ -1053,7 +1238,7 @@ def xp_median_preimage_10_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = True # @@ -1069,7 +1254,7 @@ def xp_median_preimage_10_2(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -1117,6 +1302,7 @@ def xp_median_preimage_11_1(): 'verbose': 2, 'refine': False} save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' # print settings. print('parameters:') @@ -1128,11 +1314,11 @@ def xp_median_preimage_11_1(): print('save_results:', save_results) # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method - generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save='../results/xp_median_preimage/') + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save) def xp_median_preimage_11_2(): @@ -1174,7 +1360,7 @@ def xp_median_preimage_11_2(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' irrelevant_labels = None # edge_required = True # @@ -1190,7 +1376,7 @@ def xp_median_preimage_11_2(): print() # generate preimages. - for fit_method in ['k-graphs', 'expert'] + ['random'] * 10: + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: print('\n-------------------------------------') print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method @@ -1242,16 +1428,25 @@ if __name__ == "__main__": # xp_median_preimage_7_1() #### xp 7_2: MUTAG, PathUpToH, using CONSTANT. - xp_median_preimage_7_2() + # xp_median_preimage_7_2() + + #### xp 7_3: MUTAG, Treelet, using CONSTANT. + # xp_median_preimage_7_3() #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. # xp_median_preimage_8_1() #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. -# xp_median_preimage_8_2() + # xp_median_preimage_8_2() + + #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. +# xp_median_preimage_8_3() #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. # xp_median_preimage_9_1() #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. -# xp_median_preimage_9_2() \ No newline at end of file + # xp_median_preimage_9_2() + + #### xp 9_3: MAO, Treelet, using CONSTANT. + xp_median_preimage_9_3() \ No newline at end of file diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 04efa9d..5f00641 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -745,8 +745,14 @@ class MedianPreimageGenerator(PreimageGenerator): edge_labels=self._dataset.edge_labels, ds_infos=self._dataset.get_dataset_infos(keys=['directed']), **self._kernel_options) + elif self._kernel_options['name'] == 'Treelet': + from gklearn.kernels import Treelet + self._graph_kernel = Treelet(node_labels=self._dataset.node_labels, + edge_labels=self._dataset.edge_labels, + ds_infos=self._dataset.get_dataset_infos(keys=['directed']), + **self._kernel_options) else: - raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH".') + raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH", "Treelet".') # def __clean_graph(self, G, node_labels=[], edge_labels=[], node_attrs=[], edge_attrs=[]): diff --git a/gklearn/preimage/utils.py b/gklearn/preimage/utils.py index 63c8b9e..823ecc5 100644 --- a/gklearn/preimage/utils.py +++ b/gklearn/preimage/utils.py @@ -22,6 +22,7 @@ from gklearn.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel from gklearn.utils import Dataset import csv import networkx as nx +import os def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=True, save_medians=True, plot_medians=True, load_gm='auto', dir_save='', irrelevant_labels=None, edge_required=False): @@ -215,6 +216,8 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged # save median graphs. if save_medians: + if not os.path.exists(dir_save + 'medians/'): + os.makedirs(dir_save + 'medians/') print('Saving median graphs to files...') fn_pre_sm = dir_save + 'medians/set_median.' + mpg_options['fit_method'] + '.nbg' + str(num_graphs) + '.y' + str(target) + '.repeat' + str(1) saveGXL(mpg.set_median, fn_pre_sm + '.gxl', method='default', @@ -286,6 +289,8 @@ def generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged def __init_output_file(ds_name, gkernel, fit_method, dir_output): + if not os.path.exists(dir_output): + os.makedirs(dir_output) # fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.' + fit_method + '.csv' fn_output_detail = 'results_detail.' + ds_name + '.' + gkernel + '.csv' f_detail = open(dir_output + fn_output_detail, 'a') diff --git a/gklearn/tests/test_graph_kernels.py b/gklearn/tests/test_graph_kernels.py index 5ee9997..a92ebe9 100644 --- a/gklearn/tests/test_graph_kernels.py +++ b/gklearn/tests/test_graph_kernels.py @@ -231,28 +231,31 @@ def test_PathUpToH(ds_name, parallel, k_func, compute_method): assert False, exception -# @pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) -# @pytest.mark.parametrize('parallel', ['imap_unordered', None]) -# def test_treeletkernel(ds_name, parallel): -# """Test treelet kernel. -# """ -# from gklearn.kernels.treeletKernel import treeletkernel -# from gklearn.utils.kernels import polynomialkernel -# import functools +@pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) +@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +def test_treeletkernel(ds_name, parallel): + """Test treelet kernel. + """ + from gklearn.kernels import Treelet + from gklearn.utils.kernels import polynomialkernel + import functools -# Gn, y = chooseDataset(ds_name) + dataset = chooseDataset(ds_name) -# pkernel = functools.partial(polynomialkernel, d=2, c=1e5) -# try: -# Kmatrix, run_time = treeletkernel(Gn, -# sub_kernel=pkernel, -# node_label='atom', -# edge_label='bond_type', -# parallel=parallel, -# n_jobs=multiprocessing.cpu_count(), -# verbose=True) -# except Exception as exception: -# assert False, exception + pkernel = functools.partial(polynomialkernel, d=2, c=1e5) + try: + graph_kernel = Treelet(node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + sub_kernel=pkernel) + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel_list, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1:], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: + assert False, exception # @pytest.mark.parametrize('ds_name', ['Acyclic']) diff --git a/gklearn/utils/utils.py b/gklearn/utils/utils.py index 0dca111..17954f5 100644 --- a/gklearn/utils/utils.py +++ b/gklearn/utils/utils.py @@ -351,4 +351,77 @@ def compute_gram_matrices_by_class(ds_name, kernel_options, save_results=True, d if save_results: np.savez(dir_save + 'gram_matrix_unnorm.' + ds_name + '.' + kernel_options['name'] + '.gm', gram_matrix_unnorm_list=gram_matrix_unnorm_list, run_time_list=run_time_list) - print('\ncomplete.') \ No newline at end of file + print('\ncomplete.') + + +def find_paths(G, source_node, length): + """Find all paths with a certain length those start from a source node. + A recursive depth first search is applied. + + Parameters + ---------- + G : NetworkX graphs + The graph in which paths are searched. + source_node : integer + The number of the node from where all paths start. + length : integer + The length of paths. + + Return + ------ + path : list of list + List of paths retrieved, where each path is represented by a list of nodes. + """ + if length == 0: + return [[source_node]] + path = [[source_node] + path for neighbor in G[source_node] \ + for path in find_paths(G, neighbor, length - 1) if source_node not in path] + return path + + +def find_all_paths(G, length, is_directed): + """Find all paths with a certain length in a graph. A recursive depth first + search is applied. + + Parameters + ---------- + G : NetworkX graphs + The graph in which paths are searched. + length : integer + The length of paths. + + Return + ------ + path : list of list + List of paths retrieved, where each path is represented by a list of nodes. + """ + all_paths = [] + for node in G: + all_paths.extend(find_paths(G, node, length)) + + if not is_directed: + # For each path, two presentations are retrieved from its two extremities. + # Remove one of them. + all_paths_r = [path[::-1] for path in all_paths] + for idx, path in enumerate(all_paths[:-1]): + for path2 in all_paths_r[idx+1::]: + if path == path2: + all_paths[idx] = [] + break + all_paths = list(filter(lambda a: a != [], all_paths)) + + return all_paths + + +def get_mlti_dim_node_attrs(G, attr_names): + attributes = [] + for nd, attrs in G.nodes(data=True): + attributes.append(tuple(attrs[aname] for aname in attr_names)) + return attributes + + +def get_mlti_dim_edge_attrs(G, attr_names): + attributes = [] + for ed, attrs in G.edges(data=True): + attributes.append(tuple(attrs[aname] for aname in attr_names)) + return attributes \ No newline at end of file From f337fc3fa917fd18222882bb2ca6978089173812 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 14 Apr 2020 16:50:00 +0200 Subject: [PATCH 7/9] Add class WeisfeilerLehman. --- gklearn/kernels/__init__.py | 1 + gklearn/kernels/weisfeilerLehmanKernel.py | 1026 ++++++++++---------- gklearn/preimage/experiments/xp_median_preimage.py | 191 +++- gklearn/preimage/median_preimage_generator.py | 8 +- gklearn/tests/test_graph_kernels.py | 44 +- 5 files changed, 734 insertions(+), 536 deletions(-) diff --git a/gklearn/kernels/__init__.py b/gklearn/kernels/__init__.py index 4afcc67..52df2b6 100644 --- a/gklearn/kernels/__init__.py +++ b/gklearn/kernels/__init__.py @@ -12,3 +12,4 @@ from gklearn.kernels.structural_sp import StructuralSP from gklearn.kernels.shortest_path import ShortestPath from gklearn.kernels.path_up_to_h import PathUpToH from gklearn.kernels.treelet import Treelet +from gklearn.kernels.weisfeiler_lehman import WeisfeilerLehman diff --git a/gklearn/kernels/weisfeilerLehmanKernel.py b/gklearn/kernels/weisfeilerLehmanKernel.py index cb8c592..ecbcf49 100644 --- a/gklearn/kernels/weisfeilerLehmanKernel.py +++ b/gklearn/kernels/weisfeilerLehmanKernel.py @@ -3,9 +3,9 @@ @references: - [1] Shervashidze N, Schweitzer P, Leeuwen EJ, Mehlhorn K, Borgwardt KM. - Weisfeiler-lehman graph kernels. Journal of Machine Learning Research. - 2011;12(Sep):2539-61. + [1] Shervashidze N, Schweitzer P, Leeuwen EJ, Mehlhorn K, Borgwardt KM. + Weisfeiler-lehman graph kernels. Journal of Machine Learning Research. + 2011;12(Sep):2539-61. """ import sys @@ -24,546 +24,546 @@ from gklearn.utils.parallel import parallel_gm # @todo: support edge kernel, sp kernel, user-defined kernel. def weisfeilerlehmankernel(*args, - node_label='atom', - edge_label='bond_type', - height=0, - base_kernel='subtree', - parallel=None, - n_jobs=None, - verbose=True): - """Calculate Weisfeiler-Lehman kernels between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - - G1, G2 : NetworkX graphs - Two graphs between which the kernel is calculated. - - node_label : string - Node attribute used as label. The default node label is atom. - - edge_label : string - Edge attribute used as label. The default edge label is bond_type. - - height : int - Subtree height. - - base_kernel : string - Base kernel used in each iteration of WL kernel. Only default 'subtree' - kernel can be applied for now. - - parallel : None - Which paralleliztion method is applied to compute the kernel. No - parallelization can be applied for now. - - n_jobs : int - Number of jobs for parallelization. The default is to use all - computational cores. This argument is only valid when one of the - parallelization method is applied and can be ignored for now. - - Return - ------ - Kmatrix : Numpy matrix - Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. - - Notes - ----- - This function now supports WL subtree kernel only. - """ -# The default base -# kernel is subtree kernel. For user-defined kernel, base_kernel is the -# name of the base kernel function used in each iteration of WL kernel. -# This function returns a Numpy matrix, each element of which is the -# user-defined Weisfeiler-Lehman kernel between 2 praphs. - # pre-process - base_kernel = base_kernel.lower() - Gn = args[0] if len(args) == 1 else [args[0], args[1]] # arrange all graphs in a list - Gn = [g.copy() for g in Gn] - ds_attrs = get_dataset_attributes(Gn, attr_names=['node_labeled'], - node_label=node_label) - if not ds_attrs['node_labeled']: - for G in Gn: - nx.set_node_attributes(G, '0', 'atom') - - start_time = time.time() - - # for WL subtree kernel - if base_kernel == 'subtree': - Kmatrix = _wl_kernel_do(Gn, node_label, edge_label, height, parallel, n_jobs, verbose) - - # for WL shortest path kernel - elif base_kernel == 'sp': - Kmatrix = _wl_spkernel_do(Gn, node_label, edge_label, height) - - # for WL edge kernel - elif base_kernel == 'edge': - Kmatrix = _wl_edgekernel_do(Gn, node_label, edge_label, height) - - # for user defined base kernel - else: - Kmatrix = _wl_userkernel_do(Gn, node_label, edge_label, height, base_kernel) - - run_time = time.time() - start_time - if verbose: - print("\n --- Weisfeiler-Lehman %s kernel matrix of size %d built in %s seconds ---" - % (base_kernel, len(args[0]), run_time)) - - return Kmatrix, run_time + node_label='atom', + edge_label='bond_type', + height=0, + base_kernel='subtree', + parallel=None, + n_jobs=None, + verbose=True): + """Calculate Weisfeiler-Lehman kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + + G1, G2 : NetworkX graphs + Two graphs between which the kernel is calculated. + + node_label : string + Node attribute used as label. The default node label is atom. + + edge_label : string + Edge attribute used as label. The default edge label is bond_type. + + height : int + Subtree height. + + base_kernel : string + Base kernel used in each iteration of WL kernel. Only default 'subtree' + kernel can be applied for now. + + parallel : None + Which paralleliztion method is applied to compute the kernel. No + parallelization can be applied for now. + + n_jobs : int + Number of jobs for parallelization. The default is to use all + computational cores. This argument is only valid when one of the + parallelization method is applied and can be ignored for now. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + + Notes + ----- + This function now supports WL subtree kernel only. + """ +# The default base +# kernel is subtree kernel. For user-defined kernel, base_kernel is the +# name of the base kernel function used in each iteration of WL kernel. +# This function returns a Numpy matrix, each element of which is the +# user-defined Weisfeiler-Lehman kernel between 2 praphs. + # pre-process + base_kernel = base_kernel.lower() + Gn = args[0] if len(args) == 1 else [args[0], args[1]] # arrange all graphs in a list + Gn = [g.copy() for g in Gn] + ds_attrs = get_dataset_attributes(Gn, attr_names=['node_labeled'], + node_label=node_label) + if not ds_attrs['node_labeled']: + for G in Gn: + nx.set_node_attributes(G, '0', 'atom') + + start_time = time.time() + + # for WL subtree kernel + if base_kernel == 'subtree': + Kmatrix = _wl_kernel_do(Gn, node_label, edge_label, height, parallel, n_jobs, verbose) + + # for WL shortest path kernel + elif base_kernel == 'sp': + Kmatrix = _wl_spkernel_do(Gn, node_label, edge_label, height) + + # for WL edge kernel + elif base_kernel == 'edge': + Kmatrix = _wl_edgekernel_do(Gn, node_label, edge_label, height) + + # for user defined base kernel + else: + Kmatrix = _wl_userkernel_do(Gn, node_label, edge_label, height, base_kernel) + + run_time = time.time() - start_time + if verbose: + print("\n --- Weisfeiler-Lehman %s kernel matrix of size %d built in %s seconds ---" + % (base_kernel, len(args[0]), run_time)) + + return Kmatrix, run_time def _wl_kernel_do(Gn, node_label, edge_label, height, parallel, n_jobs, verbose): - """Calculate Weisfeiler-Lehman kernels between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - node_label : string - node attribute used as label. - edge_label : string - edge attribute used as label. - height : int - wl height. - - Return - ------ - Kmatrix : Numpy matrix - Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. - """ - height = int(height) - Kmatrix = np.zeros((len(Gn), len(Gn))) - - # initial for height = 0 - all_num_of_each_label = [] # number of occurence of each label in each graph in this iteration - - # for each graph - for G in Gn: - # get the set of original labels - labels_ori = list(nx.get_node_attributes(G, node_label).values()) - # number of occurence of each label in G - all_num_of_each_label.append(dict(Counter(labels_ori))) - - # calculate subtree kernel with the 0th iteration and add it to the final kernel - compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, False) - - # iterate each height - for h in range(1, height + 1): - all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration - num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs -# all_labels_ori = set() # all unique orignal labels in all graphs in this iteration - all_num_of_each_label = [] # number of occurence of each label in G - -# # for each graph -# # ---- use pool.imap_unordered to parallel and track progress. ---- -# pool = Pool(n_jobs) -# itr = zip(Gn, range(0, len(Gn))) -# if len(Gn) < 100 * n_jobs: -# chunksize = int(len(Gn) / n_jobs) + 1 -# else: -# chunksize = 100 -# all_multisets_list = [[] for _ in range(len(Gn))] -## set_unique_list = [[] for _ in range(len(Gn))] -# get_partial = partial(wrapper_wl_iteration, node_label) -## if verbose: -## iterator = tqdm(pool.imap_unordered(get_partial, itr, chunksize), -## desc='wl iteration', file=sys.stdout) -## else: -# iterator = pool.imap_unordered(get_partial, itr, chunksize) -# for i, all_multisets in iterator: -# all_multisets_list[i] = all_multisets -## set_unique_list[i] = set_unique -## all_set_unique = all_set_unique | set(set_unique) -# pool.close() -# pool.join() - -# all_set_unique = set() -# for uset in all_multisets_list: -# all_set_unique = all_set_unique | set(uset) -# -# all_set_unique = list(all_set_unique) -## # a dictionary mapping original labels to new ones. -## set_compressed = {} -## for idx, uset in enumerate(all_set_unique): -## set_compressed.update({uset: idx}) -# -# for ig, G in enumerate(Gn): + """Calculate Weisfeiler-Lehman kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + wl height. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) + + # initial for height = 0 + all_num_of_each_label = [] # number of occurence of each label in each graph in this iteration + + # for each graph + for G in Gn: + # get the set of original labels + labels_ori = list(nx.get_node_attributes(G, node_label).values()) + # number of occurence of each label in G + all_num_of_each_label.append(dict(Counter(labels_ori))) + + # calculate subtree kernel with the 0th iteration and add it to the final kernel + compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, False) + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs +# all_labels_ori = set() # all unique orignal labels in all graphs in this iteration + all_num_of_each_label = [] # number of occurence of each label in G + +# # for each graph +# # ---- use pool.imap_unordered to parallel and track progress. ---- +# pool = Pool(n_jobs) +# itr = zip(Gn, range(0, len(Gn))) +# if len(Gn) < 100 * n_jobs: +# chunksize = int(len(Gn) / n_jobs) + 1 +# else: +# chunksize = 100 +# all_multisets_list = [[] for _ in range(len(Gn))] +## set_unique_list = [[] for _ in range(len(Gn))] +# get_partial = partial(wrapper_wl_iteration, node_label) +## if verbose: +## iterator = tqdm(pool.imap_unordered(get_partial, itr, chunksize), +## desc='wl iteration', file=sys.stdout) +## else: +# iterator = pool.imap_unordered(get_partial, itr, chunksize) +# for i, all_multisets in iterator: +# all_multisets_list[i] = all_multisets +## set_unique_list[i] = set_unique +## all_set_unique = all_set_unique | set(set_unique) +# pool.close() +# pool.join() + +# all_set_unique = set() +# for uset in all_multisets_list: +# all_set_unique = all_set_unique | set(uset) +# +# all_set_unique = list(all_set_unique) +## # a dictionary mapping original labels to new ones. +## set_compressed = {} +## for idx, uset in enumerate(all_set_unique): +## set_compressed.update({uset: idx}) +# +# for ig, G in enumerate(Gn): # -## # a dictionary mapping original labels to new ones. -## set_compressed = {} -## # if a label occured before, assign its former compressed label, -## # else assign the number of labels occured + 1 as the compressed label. -## for value in set_unique_list[i]: -## if uset in all_set_unique: -## set_compressed.update({uset: all_set_compressed[value]}) -## else: -## set_compressed.update({value: str(num_of_labels_occured + 1)}) -## num_of_labels_occured += 1 -# -## all_set_compressed.update(set_compressed) -# -# # relabel nodes -# for idx, node in enumerate(G.nodes()): -# G.nodes[node][node_label] = all_set_unique.index(all_multisets_list[ig][idx]) -# -# # get the set of compressed labels -# labels_comp = list(nx.get_node_attributes(G, node_label).values()) -## all_labels_ori.update(labels_comp) -# all_num_of_each_label[ig] = dict(Counter(labels_comp)) - - - - -# all_set_unique = list(all_set_unique) - - - # @todo: parallel this part. - for idx, G in enumerate(Gn): - - all_multisets = [] - for node, attrs in G.nodes(data=True): - # Multiset-label determination. - multiset = [G.nodes[neighbors][node_label] for neighbors in G[node]] - # sorting each multiset - multiset.sort() - multiset = [attrs[node_label]] + multiset # add the prefix - all_multisets.append(tuple(multiset)) - - # label compression - set_unique = list(set(all_multisets)) # set of unique multiset labels - # a dictionary mapping original labels to new ones. - set_compressed = {} - # if a label occured before, assign its former compressed label, - # else assign the number of labels occured + 1 as the compressed label. - for value in set_unique: - if value in all_set_compressed.keys(): - set_compressed.update({value: all_set_compressed[value]}) - else: - set_compressed.update({value: str(num_of_labels_occured + 1)}) - num_of_labels_occured += 1 - - all_set_compressed.update(set_compressed) - - # relabel nodes - for idx, node in enumerate(G.nodes()): - G.nodes[node][node_label] = set_compressed[all_multisets[idx]] - - # get the set of compressed labels - labels_comp = list(nx.get_node_attributes(G, node_label).values()) -# all_labels_ori.update(labels_comp) - all_num_of_each_label.append(dict(Counter(labels_comp))) - - # calculate subtree kernel with h iterations and add it to the final kernel - compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, False) - - return Kmatrix +## # a dictionary mapping original labels to new ones. +## set_compressed = {} +## # if a label occured before, assign its former compressed label, +## # else assign the number of labels occured + 1 as the compressed label. +## for value in set_unique_list[i]: +## if uset in all_set_unique: +## set_compressed.update({uset: all_set_compressed[value]}) +## else: +## set_compressed.update({value: str(num_of_labels_occured + 1)}) +## num_of_labels_occured += 1 +# +## all_set_compressed.update(set_compressed) +# +# # relabel nodes +# for idx, node in enumerate(G.nodes()): +# G.nodes[node][node_label] = all_set_unique.index(all_multisets_list[ig][idx]) +# +# # get the set of compressed labels +# labels_comp = list(nx.get_node_attributes(G, node_label).values()) +## all_labels_ori.update(labels_comp) +# all_num_of_each_label[ig] = dict(Counter(labels_comp)) + + + + +# all_set_unique = list(all_set_unique) + + + # @todo: parallel this part. + for idx, G in enumerate(Gn): + + all_multisets = [] + for node, attrs in G.nodes(data=True): + # Multiset-label determination. + multiset = [G.nodes[neighbors][node_label] for neighbors in G[node]] + # sorting each multiset + multiset.sort() + multiset = [attrs[node_label]] + multiset # add the prefix + all_multisets.append(tuple(multiset)) + + # label compression + set_unique = list(set(all_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, + # else assign the number of labels occured + 1 as the compressed label. + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({value: all_set_compressed[value]}) + else: + set_compressed.update({value: str(num_of_labels_occured + 1)}) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for idx, node in enumerate(G.nodes()): + G.nodes[node][node_label] = set_compressed[all_multisets[idx]] + + # get the set of compressed labels + labels_comp = list(nx.get_node_attributes(G, node_label).values()) +# all_labels_ori.update(labels_comp) + all_num_of_each_label.append(dict(Counter(labels_comp))) + + # calculate subtree kernel with h iterations and add it to the final kernel + compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, False) + + return Kmatrix def wl_iteration(G, node_label): - all_multisets = [] - for node, attrs in G.nodes(data=True): - # Multiset-label determination. - multiset = [G.nodes[neighbors][node_label] for neighbors in G[node]] - # sorting each multiset - multiset.sort() - multiset = [attrs[node_label]] + multiset # add the prefix - all_multisets.append(tuple(multiset)) -# # label compression -# set_unique = list(set(all_multisets)) # set of unique multiset labels - return all_multisets - -# # a dictionary mapping original labels to new ones. -# set_compressed = {} -# # if a label occured before, assign its former compressed label, -# # else assign the number of labels occured + 1 as the compressed label. -# for value in set_unique: -# if value in all_set_compressed.keys(): -# set_compressed.update({value: all_set_compressed[value]}) -# else: -# set_compressed.update({value: str(num_of_labels_occured + 1)}) -# num_of_labels_occured += 1 + all_multisets = [] + for node, attrs in G.nodes(data=True): + # Multiset-label determination. + multiset = [G.nodes[neighbors][node_label] for neighbors in G[node]] + # sorting each multiset + multiset.sort() + multiset = [attrs[node_label]] + multiset # add the prefix + all_multisets.append(tuple(multiset)) +# # label compression +# set_unique = list(set(all_multisets)) # set of unique multiset labels + return all_multisets + +# # a dictionary mapping original labels to new ones. +# set_compressed = {} +# # if a label occured before, assign its former compressed label, +# # else assign the number of labels occured + 1 as the compressed label. +# for value in set_unique: +# if value in all_set_compressed.keys(): +# set_compressed.update({value: all_set_compressed[value]}) +# else: +# set_compressed.update({value: str(num_of_labels_occured + 1)}) +# num_of_labels_occured += 1 # -# all_set_compressed.update(set_compressed) +# all_set_compressed.update(set_compressed) # -# # relabel nodes -# for idx, node in enumerate(G.nodes()): -# G.nodes[node][node_label] = set_compressed[all_multisets[idx]] +# # relabel nodes +# for idx, node in enumerate(G.nodes()): +# G.nodes[node][node_label] = set_compressed[all_multisets[idx]] # -# # get the set of compressed labels -# labels_comp = list(nx.get_node_attributes(G, node_label).values()) -# all_labels_ori.update(labels_comp) -# all_num_of_each_label.append(dict(Counter(labels_comp))) -# return +# # get the set of compressed labels +# labels_comp = list(nx.get_node_attributes(G, node_label).values()) +# all_labels_ori.update(labels_comp) +# all_num_of_each_label.append(dict(Counter(labels_comp))) +# return def wrapper_wl_iteration(node_label, itr_item): - g = itr_item[0] - i = itr_item[1] - all_multisets = wl_iteration(g, node_label) - return i, all_multisets + g = itr_item[0] + i = itr_item[1] + all_multisets = wl_iteration(g, node_label) + return i, all_multisets def compute_kernel_matrix(Kmatrix, all_num_of_each_label, Gn, parallel, n_jobs, verbose): - """Compute kernel matrix using the base kernel. - """ - if parallel == 'imap_unordered': - # compute kernels. - def init_worker(alllabels_toshare): - global G_alllabels - G_alllabels = alllabels_toshare - do_partial = partial(wrapper_compute_subtree_kernel, Kmatrix) - parallel_gm(do_partial, Kmatrix, Gn, init_worker=init_worker, - glbv=(all_num_of_each_label,), n_jobs=n_jobs, verbose=verbose) - elif parallel == None: - for i in range(len(Kmatrix)): - for j in range(i, len(Kmatrix)): - Kmatrix[i][j] = compute_subtree_kernel(all_num_of_each_label[i], - all_num_of_each_label[j], Kmatrix[i][j]) - Kmatrix[j][i] = Kmatrix[i][j] + """Compute kernel matrix using the base kernel. + """ + if parallel == 'imap_unordered': + # compute kernels. + def init_worker(alllabels_toshare): + global G_alllabels + G_alllabels = alllabels_toshare + do_partial = partial(wrapper_compute_subtree_kernel, Kmatrix) + parallel_gm(do_partial, Kmatrix, Gn, init_worker=init_worker, + glbv=(all_num_of_each_label,), n_jobs=n_jobs, verbose=verbose) + elif parallel == None: + for i in range(len(Kmatrix)): + for j in range(i, len(Kmatrix)): + Kmatrix[i][j] = compute_subtree_kernel(all_num_of_each_label[i], + all_num_of_each_label[j], Kmatrix[i][j]) + Kmatrix[j][i] = Kmatrix[i][j] def compute_subtree_kernel(num_of_each_label1, num_of_each_label2, kernel): - """Compute the subtree kernel. - """ - labels = set(list(num_of_each_label1.keys()) + list(num_of_each_label2.keys())) - vector1 = np.array([(num_of_each_label1[label] - if (label in num_of_each_label1.keys()) else 0) - for label in labels]) - vector2 = np.array([(num_of_each_label2[label] - if (label in num_of_each_label2.keys()) else 0) - for label in labels]) - kernel += np.dot(vector1, vector2) - return kernel + """Compute the subtree kernel. + """ + labels = set(list(num_of_each_label1.keys()) + list(num_of_each_label2.keys())) + vector1 = np.array([(num_of_each_label1[label] + if (label in num_of_each_label1.keys()) else 0) + for label in labels]) + vector2 = np.array([(num_of_each_label2[label] + if (label in num_of_each_label2.keys()) else 0) + for label in labels]) + kernel += np.dot(vector1, vector2) + return kernel def wrapper_compute_subtree_kernel(Kmatrix, itr): - i = itr[0] - j = itr[1] - return i, j, compute_subtree_kernel(G_alllabels[i], G_alllabels[j], Kmatrix[i][j]) - + i = itr[0] + j = itr[1] + return i, j, compute_subtree_kernel(G_alllabels[i], G_alllabels[j], Kmatrix[i][j]) + def _wl_spkernel_do(Gn, node_label, edge_label, height): - """Calculate Weisfeiler-Lehman shortest path kernels between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - node_label : string - node attribute used as label. - edge_label : string - edge attribute used as label. - height : int - subtree height. - - Return - ------ - Kmatrix : Numpy matrix - Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. - """ - pass - from gklearn.utils.utils import getSPGraph - - # init. - height = int(height) - Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel - - Gn = [ getSPGraph(G, edge_weight = edge_label) for G in Gn ] # get shortest path graphs of Gn - - # initial for height = 0 - for i in range(0, len(Gn)): - for j in range(i, len(Gn)): - for e1 in Gn[i].edges(data = True): - for e2 in Gn[j].edges(data = True): - if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): - Kmatrix[i][j] += 1 - Kmatrix[j][i] = Kmatrix[i][j] - - # iterate each height - for h in range(1, height + 1): - all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration - num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs - for G in Gn: # for each graph - set_multisets = [] - for node in G.nodes(data = True): - # Multiset-label determination. - multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] - # sorting each multiset - multiset.sort() - multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix - set_multisets.append(multiset) - - # label compression - set_unique = list(set(set_multisets)) # set of unique multiset labels - # a dictionary mapping original labels to new ones. - set_compressed = {} - # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label - for value in set_unique: - if value in all_set_compressed.keys(): - set_compressed.update({ value : all_set_compressed[value] }) - else: - set_compressed.update({ value : str(num_of_labels_occured + 1) }) - num_of_labels_occured += 1 - - all_set_compressed.update(set_compressed) - - # relabel nodes - for node in G.nodes(data = True): - node[1][node_label] = set_compressed[set_multisets[node[0]]] - - # calculate subtree kernel with h iterations and add it to the final kernel - for i in range(0, len(Gn)): - for j in range(i, len(Gn)): - for e1 in Gn[i].edges(data = True): - for e2 in Gn[j].edges(data = True): - if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): - Kmatrix[i][j] += 1 - Kmatrix[j][i] = Kmatrix[i][j] - - return Kmatrix + """Calculate Weisfeiler-Lehman shortest path kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + from gklearn.utils.utils import getSPGraph + + # init. + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel + + Gn = [ getSPGraph(G, edge_weight = edge_label) for G in Gn ] # get shortest path graphs of Gn + + # initial for height = 0 + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate subtree kernel with h iterations and add it to the final kernel + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + return Kmatrix def _wl_edgekernel_do(Gn, node_label, edge_label, height): - """Calculate Weisfeiler-Lehman edge kernels between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - node_label : string - node attribute used as label. - edge_label : string - edge attribute used as label. - height : int - subtree height. - - Return - ------ - Kmatrix : Numpy matrix - Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. - """ - pass - # init. - height = int(height) - Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel + """Calculate Weisfeiler-Lehman edge kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + # init. + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel - # initial for height = 0 - for i in range(0, len(Gn)): - for j in range(i, len(Gn)): - for e1 in Gn[i].edges(data = True): - for e2 in Gn[j].edges(data = True): - if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): - Kmatrix[i][j] += 1 - Kmatrix[j][i] = Kmatrix[i][j] - - # iterate each height - for h in range(1, height + 1): - all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration - num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs - for G in Gn: # for each graph - set_multisets = [] - for node in G.nodes(data = True): - # Multiset-label determination. - multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] - # sorting each multiset - multiset.sort() - multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix - set_multisets.append(multiset) - - # label compression - set_unique = list(set(set_multisets)) # set of unique multiset labels - # a dictionary mapping original labels to new ones. - set_compressed = {} - # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label - for value in set_unique: - if value in all_set_compressed.keys(): - set_compressed.update({ value : all_set_compressed[value] }) - else: - set_compressed.update({ value : str(num_of_labels_occured + 1) }) - num_of_labels_occured += 1 - - all_set_compressed.update(set_compressed) - - # relabel nodes - for node in G.nodes(data = True): - node[1][node_label] = set_compressed[set_multisets[node[0]]] - - # calculate subtree kernel with h iterations and add it to the final kernel - for i in range(0, len(Gn)): - for j in range(i, len(Gn)): - for e1 in Gn[i].edges(data = True): - for e2 in Gn[j].edges(data = True): - if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): - Kmatrix[i][j] += 1 - Kmatrix[j][i] = Kmatrix[i][j] - - return Kmatrix + # initial for height = 0 + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate subtree kernel with h iterations and add it to the final kernel + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + Kmatrix[i][j] += 1 + Kmatrix[j][i] = Kmatrix[i][j] + + return Kmatrix def _wl_userkernel_do(Gn, node_label, edge_label, height, base_kernel): - """Calculate Weisfeiler-Lehman kernels based on user-defined kernel between graphs. - - Parameters - ---------- - Gn : List of NetworkX graph - List of graphs between which the kernels are calculated. - node_label : string - node attribute used as label. - edge_label : string - edge attribute used as label. - height : int - subtree height. - base_kernel : string - Name of the base kernel function used in each iteration of WL kernel. This function returns a Numpy matrix, each element of which is the user-defined Weisfeiler-Lehman kernel between 2 praphs. - - Return - ------ - Kmatrix : Numpy matrix - Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. - """ - pass - # init. - height = int(height) - Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel + """Calculate Weisfeiler-Lehman kernels based on user-defined kernel between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + base_kernel : string + Name of the base kernel function used in each iteration of WL kernel. This function returns a Numpy matrix, each element of which is the user-defined Weisfeiler-Lehman kernel between 2 praphs. + + Return + ------ + Kmatrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + # init. + height = int(height) + Kmatrix = np.zeros((len(Gn), len(Gn))) # init kernel - # initial for height = 0 - Kmatrix = base_kernel(Gn, node_label, edge_label) - - # iterate each height - for h in range(1, height + 1): - all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration - num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs - for G in Gn: # for each graph - set_multisets = [] - for node in G.nodes(data = True): - # Multiset-label determination. - multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] - # sorting each multiset - multiset.sort() - multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix - set_multisets.append(multiset) - - # label compression - set_unique = list(set(set_multisets)) # set of unique multiset labels - # a dictionary mapping original labels to new ones. - set_compressed = {} - # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label - for value in set_unique: - if value in all_set_compressed.keys(): - set_compressed.update({ value : all_set_compressed[value] }) - else: - set_compressed.update({ value : str(num_of_labels_occured + 1) }) - num_of_labels_occured += 1 - - all_set_compressed.update(set_compressed) - - # relabel nodes - for node in G.nodes(data = True): - node[1][node_label] = set_compressed[set_multisets[node[0]]] - - # calculate kernel with h iterations and add it to the final kernel - Kmatrix += base_kernel(Gn, node_label, edge_label) - - return Kmatrix + # initial for height = 0 + Kmatrix = base_kernel(Gn, node_label, edge_label) + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate kernel with h iterations and add it to the final kernel + Kmatrix += base_kernel(Gn, node_label, edge_label) + + return Kmatrix diff --git a/gklearn/preimage/experiments/xp_median_preimage.py b/gklearn/preimage/experiments/xp_median_preimage.py index f3206bc..903faaa 100644 --- a/gklearn/preimage/experiments/xp_median_preimage.py +++ b/gklearn/preimage/experiments/xp_median_preimage.py @@ -196,6 +196,66 @@ def xp_median_preimage_9_3(): print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_9_4(): + """xp 9_4: MAO, WeisfeilerLehman, using CONSTANT. + """ + # set parameters. + ds_name = 'MAO' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 6, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) def xp_median_preimage_8_1(): @@ -383,6 +443,66 @@ def xp_median_preimage_8_3(): mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + +def xp_median_preimage_8_4(): + """xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. + """ + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 4, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + def xp_median_preimage_7_1(): """xp 7_1: MUTAG, StructuralSP, using CONSTANT. @@ -568,6 +688,66 @@ def xp_median_preimage_7_3(): print('fit method:', fit_method, '\n') mpg_options['fit_method'] = fit_method generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) + + +def xp_median_preimage_7_4(): + """xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. + """ + # set parameters. + ds_name = 'MUTAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'ds_name': ds_name, + 'parallel': True, # False + 'time_limit_in_sec': 0, + 'max_itrs': 100, # + 'max_itrs_without_update': 3, + 'epsilon_residual': 0.01, + 'epsilon_ec': 0.1, + 'verbose': 2} + kernel_options = {'name': 'WeisfeilerLehman', + 'height': 1, + 'base_kernel': 'subtree', + 'parallel': 'imap_unordered', + # 'parallel': None, + 'n_jobs': multiprocessing.cpu_count(), + 'normalize': True, + 'verbose': 2} + ged_options = {'method': 'IPFP', + 'initialization_method': 'RANDOM', # 'NODE' + 'initial_solutions': 10, # 1 + 'edit_cost': 'CONSTANT', # + 'attr_distance': 'euclidean', + 'ratio_runs_from_initial_solutions': 1, + 'threads': multiprocessing.cpu_count(), + 'init_option': 'EAGER_WITHOUT_SHUFFLED_COPIES'} + mge_options = {'init_type': 'MEDOID', + 'random_inits': 10, + 'time_limit': 600, + 'verbose': 2, + 'refine': False} + save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = False # + + # print settings. + print('parameters:') + print('dataset name:', ds_name) + print('mpg_options:', mpg_options) + print('kernel_options:', kernel_options) + print('ged_options:', ged_options) + print('mge_options:', mge_options) + print('save_results:', save_results) + print('irrelevant_labels:', irrelevant_labels) + print() + + # generate preimages. + for fit_method in ['k-graphs', 'expert'] + ['random'] * 5: + print('\n-------------------------------------') + print('fit method:', fit_method, '\n') + mpg_options['fit_method'] = fit_method + generate_median_preimages_by_class(ds_name, mpg_options, kernel_options, ged_options, mge_options, save_results=save_results, save_medians=True, plot_medians=True, load_gm='auto', dir_save=dir_save, irrelevant_labels=irrelevant_labels, edge_required=edge_required) def xp_median_preimage_6_1(): @@ -1432,6 +1612,9 @@ if __name__ == "__main__": #### xp 7_3: MUTAG, Treelet, using CONSTANT. # xp_median_preimage_7_3() + + #### xp 7_4: MUTAG, WeisfeilerLehman, using CONSTANT. +# xp_median_preimage_7_4() #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. # xp_median_preimage_8_1() @@ -1442,6 +1625,9 @@ if __name__ == "__main__": #### xp 8_3: Monoterpenoides, Treelet, using CONSTANT. # xp_median_preimage_8_3() + #### xp 8_4: Monoterpenoides, WeisfeilerLehman, using CONSTANT. +# xp_median_preimage_8_4() + #### xp 9_1: MAO, StructuralSP, using CONSTANT, symbolic only. # xp_median_preimage_9_1() @@ -1449,4 +1635,7 @@ if __name__ == "__main__": # xp_median_preimage_9_2() #### xp 9_3: MAO, Treelet, using CONSTANT. - xp_median_preimage_9_3() \ No newline at end of file +# xp_median_preimage_9_3() + + #### xp 9_4: MAO, WeisfeilerLehman, using CONSTANT. + xp_median_preimage_9_4() \ No newline at end of file diff --git a/gklearn/preimage/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 5f00641..f342465 100644 --- a/gklearn/preimage/median_preimage_generator.py +++ b/gklearn/preimage/median_preimage_generator.py @@ -751,8 +751,14 @@ class MedianPreimageGenerator(PreimageGenerator): edge_labels=self._dataset.edge_labels, ds_infos=self._dataset.get_dataset_infos(keys=['directed']), **self._kernel_options) + elif self._kernel_options['name'] == 'WeisfeilerLehman': + from gklearn.kernels import WeisfeilerLehman + self._graph_kernel = WeisfeilerLehman(node_labels=self._dataset.node_labels, + edge_labels=self._dataset.edge_labels, + ds_infos=self._dataset.get_dataset_infos(keys=['directed']), + **self._kernel_options) else: - raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH", "Treelet".') + raise Exception('The graph kernel given is not defined. Possible choices include: "StructuralSP", "ShortestPath", "PathUpToH", "Treelet", "WeisfeilerLehman".') # def __clean_graph(self, G, node_labels=[], edge_labels=[], node_attrs=[], edge_attrs=[]): diff --git a/gklearn/tests/test_graph_kernels.py b/gklearn/tests/test_graph_kernels.py index a92ebe9..bb442f3 100644 --- a/gklearn/tests/test_graph_kernels.py +++ b/gklearn/tests/test_graph_kernels.py @@ -233,7 +233,7 @@ def test_PathUpToH(ds_name, parallel, k_func, compute_method): @pytest.mark.parametrize('ds_name', ['Alkane', 'AIDS']) @pytest.mark.parametrize('parallel', ['imap_unordered', None]) -def test_treeletkernel(ds_name, parallel): +def test_Treelet(ds_name, parallel): """Test treelet kernel. """ from gklearn.kernels import Treelet @@ -258,28 +258,30 @@ def test_treeletkernel(ds_name, parallel): assert False, exception -# @pytest.mark.parametrize('ds_name', ['Acyclic']) -# #@pytest.mark.parametrize('base_kernel', ['subtree', 'sp', 'edge']) -# @pytest.mark.parametrize('base_kernel', ['subtree']) -# @pytest.mark.parametrize('parallel', ['imap_unordered', None]) -# def test_weisfeilerlehmankernel(ds_name, parallel, base_kernel): -# """Test Weisfeiler-Lehman kernel. -# """ -# from gklearn.kernels.weisfeilerLehmanKernel import weisfeilerlehmankernel +@pytest.mark.parametrize('ds_name', ['Acyclic']) +#@pytest.mark.parametrize('base_kernel', ['subtree', 'sp', 'edge']) +@pytest.mark.parametrize('base_kernel', ['subtree']) +@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +def test_WeisfeilerLehman(ds_name, parallel, base_kernel): + """Test Weisfeiler-Lehman kernel. + """ + from gklearn.kernels import WeisfeilerLehman -# Gn, y = chooseDataset(ds_name) + dataset = chooseDataset(ds_name) -# try: -# Kmatrix, run_time = weisfeilerlehmankernel(Gn, -# node_label='atom', -# edge_label='bond_type', -# height=2, -# base_kernel=base_kernel, -# parallel=parallel, -# n_jobs=multiprocessing.cpu_count(), -# verbose=True) -# except Exception as exception: -# assert False, exception + try: + graph_kernel = WeisfeilerLehman(node_labels=dataset.node_labels, + edge_labels=dataset.edge_labels, + ds_infos=dataset.get_dataset_infos(keys=['directed']), + height=2, base_kernel=base_kernel) + gram_matrix, run_time = graph_kernel.compute(dataset.graphs, + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel_list, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1:], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + kernel, run_time = graph_kernel.compute(dataset.graphs[0], dataset.graphs[1], + parallel=parallel, n_jobs=multiprocessing.cpu_count(), verbose=True) + except Exception as exception: + assert False, exception if __name__ == "__main__": From a69f3c710e9c28bcd2e596dd7f731ba7483f2760 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 14 Apr 2020 16:52:35 +0200 Subject: [PATCH 8/9] Add class WeisfeilerLehman. --- gklearn/kernels/weisfeiler_lehman.py | 465 +++++++++++++++++++++++++++++++++++ 1 file changed, 465 insertions(+) create mode 100644 gklearn/kernels/weisfeiler_lehman.py diff --git a/gklearn/kernels/weisfeiler_lehman.py b/gklearn/kernels/weisfeiler_lehman.py new file mode 100644 index 0000000..4ecb13f --- /dev/null +++ b/gklearn/kernels/weisfeiler_lehman.py @@ -0,0 +1,465 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Apr 14 15:16:34 2020 + +@author: ljia + +@references: + + [1] Shervashidze N, Schweitzer P, Leeuwen EJ, Mehlhorn K, Borgwardt KM. + Weisfeiler-lehman graph kernels. Journal of Machine Learning Research. + 2011;12(Sep):2539-61. +""" + +import numpy as np +import networkx as nx +from collections import Counter +from functools import partial +from gklearn.utils.parallel import parallel_gm +from gklearn.kernels import GraphKernel + + +class WeisfeilerLehman(GraphKernel): # @todo: total parallelization and sp, edge user kernel. + + def __init__(self, **kwargs): + GraphKernel.__init__(self) + self.__node_labels = kwargs.get('node_labels', []) + self.__edge_labels = kwargs.get('edge_labels', []) + self.__height = int(kwargs.get('height', 0)) + self.__base_kernel = kwargs.get('base_kernel', 'subtree') + self.__ds_infos = kwargs.get('ds_infos', {}) + + + def _compute_gm_series(self): + self.__add_dummy_node_labels(self._graphs) + + # for WL subtree kernel + if self.__base_kernel == 'subtree': + gram_matrix = self.__subtree_kernel_do(self._graphs) + + # for WL shortest path kernel + elif self.__base_kernel == 'sp': + gram_matrix = self.__sp_kernel_do(self._graphs) + + # for WL edge kernel + elif self.__base_kernel == 'edge': + gram_matrix = self.__edge_kernel_do(self._graphs) + + # for user defined base kernel + else: + gram_matrix = self.__user_kernel_do(self._graphs) + + return gram_matrix + + + def _compute_gm_imap_unordered(self): + if self._verbose >= 2: + raise Warning('Only a part of the computation is parallelized due to the structure of this kernel.') + return self._compute_gm_series() + + + def _compute_kernel_list_series(self, g1, g_list): # @todo: this should be better. + self.__add_dummy_node_labels(g_list + [g1]) + + # for WL subtree kernel + if self.__base_kernel == 'subtree': + gram_matrix = self.__subtree_kernel_do(g_list + [g1]) + + # for WL shortest path kernel + elif self.__base_kernel == 'sp': + gram_matrix = self.__sp_kernel_do(g_list + [g1]) + + # for WL edge kernel + elif self.__base_kernel == 'edge': + gram_matrix = self.__edge_kernel_do(g_list + [g1]) + + # for user defined base kernel + else: + gram_matrix = self.__user_kernel_do(g_list + [g1]) + + return list(gram_matrix[-1][0:-1]) + + + def _compute_kernel_list_imap_unordered(self, g1, g_list): + if self._verbose >= 2: + raise Warning('Only a part of the computation is parallelized due to the structure of this kernel.') + return self._compute_gm_imap_unordered() + + + def _wrapper_kernel_list_do(self, itr): + pass + + + def _compute_single_kernel_series(self, g1, g2): # @todo: this should be better. + self.__add_dummy_node_labels([g1] + [g2]) + + # for WL subtree kernel + if self.__base_kernel == 'subtree': + gram_matrix = self.__subtree_kernel_do([g1] + [g2]) + + # for WL shortest path kernel + elif self.__base_kernel == 'sp': + gram_matrix = self.__sp_kernel_do([g1] + [g2]) + + # for WL edge kernel + elif self.__base_kernel == 'edge': + gram_matrix = self.__edge_kernel_do([g1] + [g2]) + + # for user defined base kernel + else: + gram_matrix = self.__user_kernel_do([g1] + [g2]) + + return gram_matrix[0][1] + + + def __subtree_kernel_do(self, Gn): + """Calculate Weisfeiler-Lehman kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + + Return + ------ + gram_matrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + gram_matrix = np.zeros((len(Gn), len(Gn))) + + # initial for height = 0 + all_num_of_each_label = [] # number of occurence of each label in each graph in this iteration + + # for each graph + for G in Gn: + # set all labels into a tuple. + for nd, attrs in G.nodes(data=True): # @todo: there may be a better way. + G.nodes[nd]['label_tuple'] = tuple(attrs[name] for name in self.__node_labels) + # get the set of original labels + labels_ori = list(nx.get_node_attributes(G, 'label_tuple').values()) + # number of occurence of each label in G + all_num_of_each_label.append(dict(Counter(labels_ori))) + + # calculate subtree kernel with the 0th iteration and add it to the final kernel. + self.__compute_gram_matrix(gram_matrix, all_num_of_each_label, Gn) + + # iterate each height + for h in range(1, self.__height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + # all_labels_ori = set() # all unique orignal labels in all graphs in this iteration + all_num_of_each_label = [] # number of occurence of each label in G + + # @todo: parallel this part. + for idx, G in enumerate(Gn): + + all_multisets = [] + for node, attrs in G.nodes(data=True): + # Multiset-label determination. + multiset = [G.nodes[neighbors]['label_tuple'] for neighbors in G[node]] + # sorting each multiset + multiset.sort() + multiset = [attrs['label_tuple']] + multiset # add the prefix + all_multisets.append(tuple(multiset)) + + # label compression + set_unique = list(set(all_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, + # else assign the number of labels occured + 1 as the compressed label. + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({value: all_set_compressed[value]}) + else: + set_compressed.update({value: str(num_of_labels_occured + 1)}) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for idx, node in enumerate(G.nodes()): + G.nodes[node]['label_tuple'] = set_compressed[all_multisets[idx]] + + # get the set of compressed labels + labels_comp = list(nx.get_node_attributes(G, 'label_tuple').values()) + # all_labels_ori.update(labels_comp) + all_num_of_each_label.append(dict(Counter(labels_comp))) + + # calculate subtree kernel with h iterations and add it to the final kernel + self.__compute_gram_matrix(gram_matrix, all_num_of_each_label, Gn) + + return gram_matrix + + + def __compute_gram_matrix(self, gram_matrix, all_num_of_each_label, Gn): + """Compute Gram matrix using the base kernel. + """ + if self._parallel == 'imap_unordered': + # compute kernels. + def init_worker(alllabels_toshare): + global G_alllabels + G_alllabels = alllabels_toshare + do_partial = partial(self._wrapper_compute_subtree_kernel, gram_matrix) + parallel_gm(do_partial, gram_matrix, Gn, init_worker=init_worker, + glbv=(all_num_of_each_label,), n_jobs=self._n_jobs, verbose=self._verbose) + elif self._parallel is None: + for i in range(len(gram_matrix)): + for j in range(i, len(gram_matrix)): + gram_matrix[i][j] = self.__compute_subtree_kernel(all_num_of_each_label[i], + all_num_of_each_label[j], gram_matrix[i][j]) + gram_matrix[j][i] = gram_matrix[i][j] + + + def __compute_subtree_kernel(self, num_of_each_label1, num_of_each_label2, kernel): + """Compute the subtree kernel. + """ + labels = set(list(num_of_each_label1.keys()) + list(num_of_each_label2.keys())) + vector1 = np.array([(num_of_each_label1[label] + if (label in num_of_each_label1.keys()) else 0) + for label in labels]) + vector2 = np.array([(num_of_each_label2[label] + if (label in num_of_each_label2.keys()) else 0) + for label in labels]) + kernel += np.dot(vector1, vector2) + return kernel + + + def _wrapper_compute_subtree_kernel(self, gram_matrix, itr): + i = itr[0] + j = itr[1] + return i, j, self.__compute_subtree_kernel(G_alllabels[i], G_alllabels[j], gram_matrix[i][j]) + + + def _wl_spkernel_do(Gn, node_label, edge_label, height): + """Calculate Weisfeiler-Lehman shortest path kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + + Return + ------ + gram_matrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + from gklearn.utils.utils import getSPGraph + + # init. + height = int(height) + gram_matrix = np.zeros((len(Gn), len(Gn))) # init kernel + + Gn = [ getSPGraph(G, edge_weight = edge_label) for G in Gn ] # get shortest path graphs of Gn + + # initial for height = 0 + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + gram_matrix[i][j] += 1 + gram_matrix[j][i] = gram_matrix[i][j] + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate subtree kernel with h iterations and add it to the final kernel + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2]['cost'] != 0 and e1[2]['cost'] == e2[2]['cost'] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + gram_matrix[i][j] += 1 + gram_matrix[j][i] = gram_matrix[i][j] + + return gram_matrix + + + + def _wl_edgekernel_do(Gn, node_label, edge_label, height): + """Calculate Weisfeiler-Lehman edge kernels between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + + Return + ------ + gram_matrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + # init. + height = int(height) + gram_matrix = np.zeros((len(Gn), len(Gn))) # init kernel + + # initial for height = 0 + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + gram_matrix[i][j] += 1 + gram_matrix[j][i] = gram_matrix[i][j] + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate subtree kernel with h iterations and add it to the final kernel + for i in range(0, len(Gn)): + for j in range(i, len(Gn)): + for e1 in Gn[i].edges(data = True): + for e2 in Gn[j].edges(data = True): + if e1[2][edge_label] == e2[2][edge_label] and ((e1[0] == e2[0] and e1[1] == e2[1]) or (e1[0] == e2[1] and e1[1] == e2[0])): + gram_matrix[i][j] += 1 + gram_matrix[j][i] = gram_matrix[i][j] + + return gram_matrix + + + def _wl_userkernel_do(Gn, node_label, edge_label, height, base_kernel): + """Calculate Weisfeiler-Lehman kernels based on user-defined kernel between graphs. + + Parameters + ---------- + Gn : List of NetworkX graph + List of graphs between which the kernels are calculated. + node_label : string + node attribute used as label. + edge_label : string + edge attribute used as label. + height : int + subtree height. + base_kernel : string + Name of the base kernel function used in each iteration of WL kernel. This function returns a Numpy matrix, each element of which is the user-defined Weisfeiler-Lehman kernel between 2 praphs. + + Return + ------ + gram_matrix : Numpy matrix + Kernel matrix, each element of which is the Weisfeiler-Lehman kernel between 2 praphs. + """ + pass + # init. + height = int(height) + gram_matrix = np.zeros((len(Gn), len(Gn))) # init kernel + + # initial for height = 0 + gram_matrix = base_kernel(Gn, node_label, edge_label) + + # iterate each height + for h in range(1, height + 1): + all_set_compressed = {} # a dictionary mapping original labels to new ones in all graphs in this iteration + num_of_labels_occured = 0 # number of the set of letters that occur before as node labels at least once in all graphs + for G in Gn: # for each graph + set_multisets = [] + for node in G.nodes(data = True): + # Multiset-label determination. + multiset = [ G.node[neighbors][node_label] for neighbors in G[node[0]] ] + # sorting each multiset + multiset.sort() + multiset = node[1][node_label] + ''.join(multiset) # concatenate to a string and add the prefix + set_multisets.append(multiset) + + # label compression + set_unique = list(set(set_multisets)) # set of unique multiset labels + # a dictionary mapping original labels to new ones. + set_compressed = {} + # if a label occured before, assign its former compressed label, else assign the number of labels occured + 1 as the compressed label + for value in set_unique: + if value in all_set_compressed.keys(): + set_compressed.update({ value : all_set_compressed[value] }) + else: + set_compressed.update({ value : str(num_of_labels_occured + 1) }) + num_of_labels_occured += 1 + + all_set_compressed.update(set_compressed) + + # relabel nodes + for node in G.nodes(data = True): + node[1][node_label] = set_compressed[set_multisets[node[0]]] + + # calculate kernel with h iterations and add it to the final kernel + gram_matrix += base_kernel(Gn, node_label, edge_label) + + return gram_matrix + + + def __add_dummy_node_labels(self, Gn): + if len(self.__node_labels) == 0: + for G in Gn: + nx.set_node_attributes(G, '0', 'dummy') + self.__node_labels.append('dummy') \ No newline at end of file From b4e76e08d4eb852adbff22425df626196bfb5954 Mon Sep 17 00:00:00 2001 From: jajupmochi Date: Tue, 14 Apr 2020 16:54:46 +0200 Subject: [PATCH 9/9] Update README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b91452b..1f5aec6 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ A Python package for graph kernels, graph edit distances and graph pre-image pro ## Requirements -* python==3.6.9 +* python>=3.5 * numpy>=1.15.2 * scipy>=1.1.0 * matplotlib>=3.0.0

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≀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%0D%90Akkz9vKdxFSpqL0mTy4tL6CbPc!pmf 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