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/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 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 0000000..5db0b1d Binary files /dev/null and b/datasets/Acyclic/Acyclic.tar.gz differ diff --git a/datasets/Acyclic/bis(1-ethylpropyl)_ether.ct b/datasets/Acyclic/bis(1-ethylpropyl)_ether.ct new file mode 100644 index 0000000..b671854 --- /dev/null +++ b/datasets/Acyclic/bis(1-ethylpropyl)_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 5 1 1 + 2 6 1 1 + 3 7 1 1 + 4 8 1 1 + 5 9 1 1 + 6 9 1 1 + 7 10 1 1 + 8 10 1 1 + 9 11 1 1 + 10 11 1 1 diff --git a/datasets/Acyclic/bis(1-methylbutyl)_ether.ct b/datasets/Acyclic/bis(1-methylbutyl)_ether.ct new file mode 100644 index 0000000..20c06d4 --- /dev/null +++ b/datasets/Acyclic/bis(1-methylbutyl)_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 5 1 1 + 2 6 1 1 + 3 9 1 1 + 4 10 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/bis(butylthio)methane.ct b/datasets/Acyclic/bis(butylthio)methane.ct new file mode 100644 index 0000000..7380f35 --- /dev/null +++ b/datasets/Acyclic/bis(butylthio)methane.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 3 1 1 + 2 4 1 1 + 3 5 1 1 + 4 6 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/bis(ethylthio)methane.ct b/datasets/Acyclic/bis(ethylthio)methane.ct new file mode 100644 index 0000000..8fa4356 --- /dev/null +++ b/datasets/Acyclic/bis(ethylthio)methane.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 6 1 1 + 4 7 1 1 + 5 6 1 1 + 5 7 1 1 diff --git a/datasets/Acyclic/bis(methylthio)methane.ct b/datasets/Acyclic/bis(methylthio)methane.ct new file mode 100644 index 0000000..613daf5 --- /dev/null +++ b/datasets/Acyclic/bis(methylthio)methane.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 4 1 1 + 2 5 1 1 + 3 4 1 1 + 3 5 1 1 diff --git a/datasets/Acyclic/butyl_ethyl_sulfide.ct b/datasets/Acyclic/butyl_ethyl_sulfide.ct new file mode 100644 index 0000000..7849626 --- /dev/null +++ b/datasets/Acyclic/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 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/butyl_isobutyl_ether.ct b/datasets/Acyclic/butyl_isobutyl_ether.ct new file mode 100644 index 0000000..37c9917 --- /dev/null +++ b/datasets/Acyclic/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 4 1 1 + 2 8 1 1 + 3 8 1 1 + 4 5 1 1 + 5 6 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/butyl_isobutyl_sulfide.ct b/datasets/Acyclic/butyl_isobutyl_sulfide.ct new file mode 100644 index 0000000..eb146e5 --- /dev/null +++ b/datasets/Acyclic/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 4 1 1 + 2 8 1 1 + 3 8 1 1 + 4 5 1 1 + 5 6 1 1 + 6 9 1 1 + 7 8 1 1 + 7 9 1 1 diff --git a/datasets/Acyclic/butyl_isopentyl_ether.ct b/datasets/Acyclic/butyl_isopentyl_ether.ct new file mode 100644 index 0000000..1c4eff8 --- /dev/null +++ b/datasets/Acyclic/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 4 1 1 + 2 9 1 1 + 3 9 1 1 + 4 5 1 1 + 5 7 1 1 + 6 8 1 1 + 6 9 1 1 + 7 10 1 1 + 8 10 1 1 diff --git a/datasets/Acyclic/butyl_isopropyl_ether.ct b/datasets/Acyclic/butyl_isopropyl_ether.ct new file mode 100644 index 0000000..1d5cb24 --- /dev/null +++ b/datasets/Acyclic/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 4 1 1 + 2 7 1 1 + 3 7 1 1 + 4 5 1 1 + 5 6 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/butyl_isopropyl_sulfide.ct b/datasets/Acyclic/butyl_isopropyl_sulfide.ct new file mode 100644 index 0000000..e8b13bc --- /dev/null +++ b/datasets/Acyclic/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 4 1 1 + 2 7 1 1 + 3 7 1 1 + 4 5 1 1 + 5 6 1 1 + 6 8 1 1 + 7 8 1 1 diff --git a/datasets/Acyclic/butyl_methyl_ether.ct b/datasets/Acyclic/butyl_methyl_ether.ct new file mode 100644 index 0000000..0995987 --- /dev/null +++ b/datasets/Acyclic/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 3 1 1 + 2 6 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/butyl_methyl_sulfide.ct b/datasets/Acyclic/butyl_methyl_sulfide.ct new file mode 100644 index 0000000..966c92a --- /dev/null +++ b/datasets/Acyclic/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 3 1 1 + 2 6 1 1 + 3 4 1 1 + 4 5 1 1 + 5 6 1 1 diff --git a/datasets/Acyclic/butyl_pentyl_ether.ct b/datasets/Acyclic/butyl_pentyl_ether.ct new file mode 100644 index 0000000..47a4957 --- /dev/null +++ b/datasets/Acyclic/butyl_pentyl_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 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/butyl_propyl_ether.ct b/datasets/Acyclic/butyl_propyl_ether.ct new file mode 100644 index 0000000..eabcea6 --- /dev/null +++ b/datasets/Acyclic/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 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/butyl_propyl_sulfide.ct b/datasets/Acyclic/butyl_propyl_sulfide.ct new file mode 100644 index 0000000..a3261b6 --- /dev/null +++ b/datasets/Acyclic/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 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/butyl_sec-butyl_ether.ct b/datasets/Acyclic/butyl_sec-butyl_ether.ct new file mode 100644 index 0000000..416f7a2 --- /dev/null +++ b/datasets/Acyclic/butyl_sec-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 4 1 1 + 2 5 1 1 + 3 8 1 1 + 4 6 1 1 + 5 8 1 1 + 6 7 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/butyl_sec-butyl_sulfide.ct b/datasets/Acyclic/butyl_sec-butyl_sulfide.ct new file mode 100644 index 0000000..ea74b02 --- /dev/null +++ b/datasets/Acyclic/butyl_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 4 1 1 + 2 5 1 1 + 3 8 1 1 + 4 6 1 1 + 5 8 1 1 + 6 7 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/butyl_tert-butyl_ether.ct b/datasets/Acyclic/butyl_tert-butyl_ether.ct new file mode 100644 index 0000000..8746059 --- /dev/null +++ b/datasets/Acyclic/butyl_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 5 1 1 + 2 8 1 1 + 3 8 1 1 + 4 8 1 1 + 5 6 1 1 + 6 7 1 1 + 7 9 1 1 + 8 9 1 1 diff --git a/datasets/Acyclic/ci00007a011.pdf b/datasets/Acyclic/ci00007a011.pdf new file mode 100644 index 0000000..c868670 --- /dev/null +++ b/datasets/Acyclic/ci00007a011.pdf @@ -0,0 +1,2718 @@ +%PDF-1.6 +% +1 0 obj +<>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 0000000..30f2a29 Binary files /dev/null and b/datasets/Acyclic/ft9949002015.pdf differ 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 0000000..bf57dd3 Binary files /dev/null and b/datasets/Monoterpenoides/monoterpenoides.tar.gz differ diff --git a/datasets/Monoterpenoides/monoterpenoides_gxl.tgz b/datasets/Monoterpenoides/monoterpenoides_gxl.tgz new file mode 100644 index 0000000..ac24c4b Binary files /dev/null and b/datasets/Monoterpenoides/monoterpenoides_gxl.tgz differ diff --git a/datasets/Monoterpenoides/trainset_9.ds b/datasets/Monoterpenoides/trainset_9.ds new file mode 100644 index 0000000..1dac86e --- /dev/null +++ b/datasets/Monoterpenoides/trainset_9.ds @@ -0,0 +1,73 @@ +11.gxl 1 +3.gxl 1 +46.gxl 1 +39.gxl 1 +33.gxl 1 +43.gxl 1 +48.gxl 1 +24.gxl 1 +19.gxl 1 +62.gxl 2 +68.gxl 2 +55.gxl 2 +73.gxl 2 +79.gxl 2 +87.gxl 2 +92.gxl 2 +56.gxl 2 +84.gxl 2 +97.gxl 3 +130.gxl 3 +127.gxl 3 +120.gxl 3 +115.gxl 3 +110.gxl 3 +105.gxl 3 +96.gxl 3 +129.gxl 3 +118.gxl 3 +133.gxl 4 +136.gxl 4 +137.gxl 4 +142.gxl 4 +143.gxl 4 +147.gxl 4 +140.gxl 4 +141.gxl 4 +146.gxl 4 +161.gxl 6 +162.gxl 6 +173.gxl 6 +175.gxl 6 +176.gxl 6 +184.gxl 6 +186.gxl 6 +187.gxl 6 +166.gxl 6 +194.gxl 7 +195.gxl 7 +197.gxl 7 +199.gxl 7 +201.gxl 7 +202.gxl 7 +205.gxl 7 +207.gxl 7 +208.gxl 7 +216.gxl 8 +224.gxl 8 +228.gxl 8 +237.gxl 8 +247.gxl 8 +262.gxl 8 +271.gxl 8 +275.gxl 8 +282.gxl 8 +289.gxl 9 +286.gxl 9 +287.gxl 9 +292.gxl 9 +293.gxl 9 +296.gxl 9 +298.gxl 9 +301.gxl 9 +302.gxl 9 \ No newline at end of file diff --git a/gklearn/ged/__init__.py b/gklearn/ged/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gklearn/kernels/__init__.py b/gklearn/kernels/__init__.py index 73147ba..52df2b6 100644 --- a/gklearn/kernels/__init__.py +++ b/gklearn/kernels/__init__.py @@ -10,3 +10,6 @@ __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 +from gklearn.kernels.treelet import Treelet +from gklearn.kernels.weisfeiler_lehman import WeisfeilerLehman diff --git a/gklearn/kernels/path_up_to_h.py b/gklearn/kernels/path_up_to_h.py index 4b35463..b23687c 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(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: - 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(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 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. + # compute kernel list. 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] + - def _wrapper_get_sp_graphs(self, itr_item): + 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_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/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/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 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/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 diff --git a/gklearn/preimage/experiments/xp_median_preimage.py b/gklearn/preimage/experiments/xp_median_preimage.py index 7ae20ba..903faaa 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, @@ -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,31 +69,895 @@ 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'] * 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_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': 9, # + '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/' + ds_name + '.' + kernel_options['name'] + '/' + 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'] * 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 + 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(): + """xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. + """ + # set parameters. + ds_name = 'Monoterpenoides' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 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} + 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': '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_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': 7, # + '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/' + 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 # + + # 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_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. + """ + # 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} + 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': '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_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/' + 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_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 + 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(): + """xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. + """ + # set parameters. + ds_name = 'COIL-RAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 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} + 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': 'NON_SYMBOLIC', # + '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'] + ['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_2(): + """xp 6_2: COIL-RAG, ShortestPath, using NON_SYMBOLIC. + """ + # set parameters. + ds_name = 'COIL-RAG' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 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} + 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': 'NON_SYMBOLIC', # + '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 = 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'] + ['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_5_1(): + """xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. + """ + # set parameters. + ds_name = 'FRANKENSTEIN' # + mpg_options = {'fit_method': 'k-graphs', + 'init_ecc': [3, 3, 1, 3, 3, 0], # + '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': 'NON_SYMBOLIC', + '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'] + ['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(): - """xp 8_1: Monoterpenoides, sspkernel, using CONSTANT. +def xp_median_preimage_4_1(): + """xp 4_1: COLORS-3, StructuralSP, using NON_SYMBOLIC. """ # set parameters. - ds_name = 'Monoterpenoides' # + ds_name = 'COLORS-3' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'init_ecc': [3, 3, 1, 3, 3, 0], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, - 'max_itrs': 100, # + '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': 'structuralspkernel', + kernel_options = {'name': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -106,7 +970,7 @@ def xp_median_preimage_8_1(): ged_options = {'method': 'IPFP', 'initialization_method': 'RANDOM', # 'NODE' 'initial_solutions': 10, # 1 - 'edit_cost': 'CONSTANT', # + 'edit_cost': 'NON_SYMBOLIC', 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, 'threads': multiprocessing.cpu_count(), @@ -117,7 +981,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 # @@ -133,35 +997,33 @@ 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'] + ['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, sspkernel, using CONSTANT. + +def xp_median_preimage_3_2(): + """xp 3_2: Fingerprint, ShortestPath, using LETTER2, only node attrs. """ # set parameters. - ds_name = 'MUTAG' # + ds_name = 'Fingerprint' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [4, 4, 2, 1, 1, 1], # + 'init_ecc': [0.525, 0.525, 0.001, 0.125, 0.125], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, - 'max_itrs': 100, # + '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': '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(), @@ -170,7 +1032,7 @@ def xp_median_preimage_7_1(): ged_options = {'method': 'IPFP', 'initialization_method': 'RANDOM', # 'NODE' 'initial_solutions': 10, # 1 - 'edit_cost': 'CONSTANT', # + 'edit_cost': 'LETTER2', 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, 'threads': multiprocessing.cpu_count(), @@ -181,9 +1043,9 @@ def xp_median_preimage_7_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' - irrelevant_labels = None # - edge_required = False # + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # + edge_required = True # # print settings. print('parameters:') @@ -197,20 +1059,20 @@ 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'] + ['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(): - """xp 6_1: COIL-RAG, sspkernel, using NON_SYMBOLIC. +def xp_median_preimage_3_1(): + """xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. """ # set parameters. - ds_name = 'COIL-RAG' # + ds_name = 'Fingerprint' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3, 1], # + 'init_ecc': [0.525, 0.525, 0.001, 0.125, 0.125], # 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -221,7 +1083,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, @@ -234,7 +1096,7 @@ def xp_median_preimage_6_1(): ged_options = {'method': 'IPFP', 'initialization_method': 'RANDOM', # 'NODE' 'initial_solutions': 10, # 1 - 'edit_cost': 'NON_SYMBOLIC', # + 'edit_cost': 'LETTER2', 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, 'threads': multiprocessing.cpu_count(), @@ -245,8 +1107,8 @@ def xp_median_preimage_6_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' - irrelevant_labels = None # + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # edge_required = False # # print settings. @@ -261,20 +1123,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'] * 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_5_1(): - """xp 5_1: FRANKENSTEIN, sspkernel, using NON_SYMBOLIC. +def xp_median_preimage_2_1(): + """xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. """ # set parameters. - ds_name = 'FRANKENSTEIN' # + ds_name = 'COIL-DEL' # mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'init_ecc': [3, 3, 1, 3, 3], 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -285,7 +1147,7 @@ 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': 'StructuralSP', 'edge_weight': None, 'node_kernels': sub_kernels, 'edge_kernels': sub_kernels, @@ -298,7 +1160,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': 'LETTER2', 'attr_distance': 'euclidean', 'ratio_runs_from_initial_solutions': 1, 'threads': multiprocessing.cpu_count(), @@ -309,9 +1171,8 @@ def xp_median_preimage_5_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' - irrelevant_labels = None # - edge_required = False # + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = {'edge_labels': ['valence']} # print settings. print('parameters:') @@ -324,21 +1185,25 @@ def xp_median_preimage_5_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'] * 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) - + 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_4_1(): - """xp 4_1: COLORS-3, sspkernel, using NON_SYMBOLIC. + +def xp_median_preimage_1_1(): + """xp 1_1: Letter-high, StructuralSP. """ # set parameters. - ds_name = 'COLORS-3' # + ds_name = 'Letter-high' mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3, 0], # + 'init_ecc': [0.675, 0.675, 0.75, 0.425, 0.425], 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -349,20 +1214,78 @@ 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, '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': 10, # 1 - 'edit_cost': 'NON_SYMBOLIC', + '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/' + ds_name + '.' + kernel_options['name'] + '/' + + # 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'] * 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) + + +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(), @@ -373,9 +1296,9 @@ 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 # + edge_required = True # # print settings. print('parameters:') @@ -389,20 +1312,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', '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_3_1(): - """xp 3_1: Fingerprint, sspkernel, using LETTER2, only node attrs. +def xp_median_preimage_10_1(): + """xp 10_1: Letter-med, StructuralSP. """ # set parameters. - ds_name = 'Fingerprint' # + ds_name = 'Letter-med' mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [0.525, 0.525, 0.001, 0.125, 0.125], # + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -413,13 +1336,13 @@ 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, 'compute_method': 'naive', - 'parallel': 'imap_unordered', - # 'parallel': None, + 'parallel': 'imap_unordered', +# 'parallel': None, 'n_jobs': multiprocessing.cpu_count(), 'normalize': True, 'verbose': 2} @@ -437,9 +1360,7 @@ def xp_median_preimage_3_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' - irrelevant_labels = {'edge_attrs': ['orient', 'angle']} # - edge_required = False # + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' # print settings. print('parameters:') @@ -449,24 +1370,22 @@ def xp_median_preimage_3_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', 'random', 'random', 'random']: + 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) + 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_2_1(): - """xp 2_1: COIL-DEL, sspkernel, using LETTER2, only node attrs. + +def xp_median_preimage_10_2(): + """xp 10_2: Letter-med, ShortestPath. """ # set parameters. - ds_name = 'COIL-DEL' # + ds_name = 'Letter-med' mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3], + 'init_ecc': [0.525, 0.525, 0.75, 0.475, 0.475], 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -477,13 +1396,11 @@ 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, + 'parallel': 'imap_unordered', +# 'parallel': None, 'n_jobs': multiprocessing.cpu_count(), 'normalize': True, 'verbose': 2} @@ -501,8 +1418,9 @@ def xp_median_preimage_2_1(): 'verbose': 2, 'refine': False} save_results = True - dir_save='../results/xp_median_preimage/' - irrelevant_labels = {'edge_labels': ['valence']} + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = True # # print settings. print('parameters:') @@ -515,25 +1433,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', '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) + 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_11_1(): + """xp 11_1: Letter-low, StructuralSP. """ # set parameters. - ds_name = 'Letter-high' + ds_name = 'Letter-low' mpg_options = {'fit_method': 'k-graphs', - 'init_ecc': [3, 3, 1, 3, 3], + 'init_ecc': [0.075, 0.075, 0.25, 0.075, 0.075], 'ds_name': ds_name, 'parallel': True, # False 'time_limit_in_sec': 0, @@ -544,7 +1458,7 @@ 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, @@ -556,7 +1470,65 @@ def xp_median_preimage_1_1(): '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, + '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'] + '/' + + # 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'] * 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) + + +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, @@ -568,6 +1540,9 @@ def xp_median_preimage_1_1(): 'verbose': 2, 'refine': False} save_results = True + dir_save = '../results/xp_median_preimage/' + ds_name + '.' + kernel_options['name'] + '/' + irrelevant_labels = None # + edge_required = True # # print settings. print('parameters:') @@ -577,40 +1552,90 @@ 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', '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, irrelevant_labels=irrelevant_labels, edge_required=edge_required) if __name__ == "__main__": - #### xp 1_1: Letter-high, sspkernel. + #### 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, sspkernel, using LETTER2, only node attrs. + #### xp 2_1: COIL-DEL, StructuralSP, using LETTER2, only node attrs. # xp_median_preimage_2_1() - #### xp 3_1: Fingerprint, sspkernel, using LETTER2, only node attrs. + #### xp 3_1: Fingerprint, StructuralSP, using LETTER2, only node attrs. # xp_median_preimage_3_1() - #### xp 4_1: COLORS-3, sspkernel, using NON_SYMBOLIC. + #### 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, sspkernel, using NON_SYMBOLIC. + #### xp 5_1: FRANKENSTEIN, StructuralSP, using NON_SYMBOLIC. # xp_median_preimage_5_1() - #### xp 6_1: COIL-RAG, sspkernel, using NON_SYMBOLIC. + #### xp 6_1: COIL-RAG, StructuralSP, using NON_SYMBOLIC. # xp_median_preimage_6_1() - #### xp 7_1: MUTAG, sspkernel, using CONSTANT. + #### 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 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, sspkernel, using CONSTANT. + #### xp 8_1: Monoterpenoides, StructuralSP, using CONSTANT. # xp_median_preimage_8_1() - #### xp 9_1: MAO, sspkernel, using CONSTANT. - xp_median_preimage_9_1() \ No newline at end of file + #### xp 8_2: Monoterpenoides, PathUpToH, using CONSTANT. + # xp_median_preimage_8_2() + + #### 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() + + #### xp 9_2: MAO, PathUpToH, using CONSTANT, symbolic only. + # xp_median_preimage_9_2() + + #### xp 9_3: MAO, Treelet, using CONSTANT. +# 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/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/median_preimage_generator.py b/gklearn/preimage/median_preimage_generator.py index 6878701..f342465 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,26 @@ 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) + 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) + 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", "WeisfeilerLehman".') # def __clean_graph(self, G, node_labels=[], edge_labels=[], node_attrs=[], edge_attrs=[]): 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/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/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 diff --git a/gklearn/tests/test_graph_kernels.py b/gklearn/tests/test_graph_kernels.py new file mode 100644 index 0000000..bb442f3 --- /dev/null +++ b/gklearn/tests/test_graph_kernels.py @@ -0,0 +1,289 @@ +"""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) + 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', ['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) + 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', ['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) + 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', ['Alkane', 'AIDS']) +@pytest.mark.parametrize('parallel', ['imap_unordered', None]) +def test_Treelet(ds_name, parallel): + """Test treelet kernel. + """ + from gklearn.kernels import Treelet + from gklearn.utils.kernels import polynomialkernel + import functools + + dataset = chooseDataset(ds_name) + + 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']) +#@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 + + dataset = chooseDataset(ds_name) + + 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__": +# 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))] 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