Repository: wwu-mmll/photonai_graph (language: python)

Issue:
Rewrote getting started

Rewrote getting started

Rewrite getting started
Why does getting started require such an advanced method for data loading?

Couldn't we simplify this to use for example nx.load (or some other photonai_graph based loader)?

This advanced matlab data loading could be used as a more advanced example.


Discussion / hints:


The package is built with neuroimaging users in mind. This means that connectivity matrices are the most common form of data that will be encountered. This form of getting started is the most common use-case of this toolbox
Then we should put the referenced script directly into the package?

Fix patch:
diff --git a/documentation/docs/api/graph_io.md b/documentation/docs/api/graph_io.md
deleted file mode 100644
index 9dca489..0000000
--- a/documentation/docs/api/graph_io.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Graph IO functions
-
-The following Graph IO functions are available.
-
-## Graph Conversion Functions
-
-::: photonai_graph.GraphIO
diff --git a/documentation/docs/examples/GraphEmbedding_lle_example.ipynb b/documentation/docs/examples/GraphEmbedding_lle_example.ipynb
new file mode 120000
index 0000000..03353f9
--- /dev/null
+++ b/documentation/docs/examples/GraphEmbedding_lle_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/embeding_examples/GraphEmbedding_lle_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphKernel_PyramidMatch_example.ipynb b/documentation/docs/examples/GraphKernel_PyramidMatch_example.ipynb
new file mode 120000
index 0000000..65a0fd4
--- /dev/null
+++ b/documentation/docs/examples/GraphKernel_PyramidMatch_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/kernel_examples/GraphKernel_PyramidMatch_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphKernel_SVMtheta_example.ipynb b/documentation/docs/examples/GraphKernel_SVMtheta_example.ipynb
new file mode 120000
index 0000000..25776ad
--- /dev/null
+++ b/documentation/docs/examples/GraphKernel_SVMtheta_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/kernel_examples/GraphKernel_SVMtheta_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphLitmusTest.ipynb b/documentation/docs/examples/GraphLitmusTest.ipynb
new file mode 120000
index 0000000..c3fccd7
--- /dev/null
+++ b/documentation/docs/examples/GraphLitmusTest.ipynb
@@ -0,0 +1,1 @@
+../../../examples/LitmusTest/GraphLitmusTest.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphMeasure_extraction_example.ipynb b/documentation/docs/examples/GraphMeasure_extraction_example.ipynb
new file mode 120000
index 0000000..473a68c
--- /dev/null
+++ b/documentation/docs/examples/GraphMeasure_extraction_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/measure_examples/GraphMeasure_extraction_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphMeasure_pipeline_example.ipynb b/documentation/docs/examples/GraphMeasure_pipeline_example.ipynb
new file mode 120000
index 0000000..b395e0d
--- /dev/null
+++ b/documentation/docs/examples/GraphMeasure_pipeline_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/measure_examples/GraphMeasure_pipeline_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphNN_classification_example.ipynb b/documentation/docs/examples/GraphNN_classification_example.ipynb
new file mode 120000
index 0000000..c1d56fb
--- /dev/null
+++ b/documentation/docs/examples/GraphNN_classification_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/gcn_examples/GraphNN_classification_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/examples/GraphNN_regression_example.ipynb b/documentation/docs/examples/GraphNN_regression_example.ipynb
new file mode 120000
index 0000000..0b94531
--- /dev/null
+++ b/documentation/docs/examples/GraphNN_regression_example.ipynb
@@ -0,0 +1,1 @@
+../../../examples/gcn_examples/GraphNN_regression_example.ipynb
\ No newline at end of file
diff --git a/documentation/docs/extending_photonai_graph.md b/documentation/docs/extending_photonai_graph.md
index b90c475..9c0d1d3 100644
--- a/documentation/docs/extending_photonai_graph.md
+++ b/documentation/docs/extending_photonai_graph.md
@@ -6,4 +6,20 @@ For new Estimators see <a target="_blank", href="https://wwu-mmll.github.io/phot
 
 ## PHOTONAI Graph specific base classes
 
-Todo
\ No newline at end of file
+PHOTONAI Graph offers a few base classes for simple integration.
+
+To extend PHOTONAI Graph simply inherit from the desired base class
+and register your custom model to PHOTONAI.
+
+### GraphConstructor Base Class
+::: photonai_graph.GraphConstruction.GraphConstructor.__init__
+    rendering:
+        show_root_toc_entry: False
+
+### DGL Base Class - Classification
+::: photonai_graph.NeuralNets.dgl_base.DGLClassifierBaseModel.__init__
+    rendering:
+        show_root_toc_entry: False
+
+### DGL Base Class - Regression
+::: photonai_graph.NeuralNets.dgl_base.DGLRegressorBaseModel.__init__
\ No newline at end of file
diff --git a/documentation/docs/getting_started.md b/documentation/docs/getting_started.md
index 19559b7..7ab63b9 100644
--- a/documentation/docs/getting_started.md
+++ b/documentation/docs/getting_started.md
@@ -24,11 +24,16 @@ We cannot guarante that this function is correctly loading your data. If in doub
 With such a function you can then load your data:
 
 ```python
-from connectivity_loading import load_conn
+from photonai_graph.GraphUtilities import load_conn
 
 matrices = load_conn('/path/to/your/data.mat')
 ```
 
+!!! danger
+    Please make sure the imported data has the exact structure you are expecting.
+    We cannot guarantee to load your data correctly under any circumstances. If in doubt
+    write an importer for your own data.
+
 ## 2. Load your labels
 
 Now you can load your labels. Make sure that your labels match the number of subjects.
diff --git a/documentation/docs/load_and_save.md b/documentation/docs/load_and_save.md
deleted file mode 100644
index 9e02fb3..0000000
--- a/documentation/docs/load_and_save.md
+++ /dev/null
@@ -1,21 +0,0 @@
-PHOTONAI Graph offers methods for saving and loading networkx graphs.
-Additionally, there are transformation functions for converting the graphs from one format into another.
-
-!!! info
-    If a specific format is required for your analysis, PHOTONAI Graph will try to automatically
-    convert your input graphs.
-
-
-## Loading graphs
-Graphs can be loaded from different formats into networkx format.
-From this networkx graph you can use different conversion functions to convert them into the 
-desired format.
-
-### Load networkx graph from file
-::: photonai_graph.GraphIO.load_file_to_networkx
-
-## Saving graphs
-Graphs can be saved as networkx 
-
-### Graph to networkx file
-::: photonai_graph.GraphIO.save_networkx_to_file
\ No newline at end of file
diff --git a/documentation/docs/workflow.md b/documentation/docs/workflow.md
index c4d5373..ecc14f6 100644
--- a/documentation/docs/workflow.md
+++ b/documentation/docs/workflow.md
@@ -58,6 +58,7 @@ automatically transforming your input data into the desired format. If you want
 in an external library and later use PHOTONAI Graph, you have to take care of the input by yourself.
 
 The shape of the input has to be in this format:
+
 $$
 [100, 20, 20, 4]
 $$
diff --git a/documentation/mkdocs.yml b/documentation/mkdocs.yml
index cadbb87..9c2991a 100644
--- a/documentation/mkdocs.yml
+++ b/documentation/mkdocs.yml
@@ -28,7 +28,7 @@ theme:
 
 # Latex
 extra_javascript:
-  - javascripts/mathjax.js
+  - assets/javascript/mathjax.js
   - https://polyfill.io/v3/polyfill.min.js?features=es6
   - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
 
@@ -74,6 +74,15 @@ nav:
     - Graph Embeddings:
       - Graph Embedding LEM: 'examples/GraphEmbedding_lem_example.ipynb'
       - Graph Embedding LLE: 'examples/GraphEmbedding_lle_example.ipynb'
+    - Graph Neural Networks:
+        - GNN Classification: 'examples/GraphNN_classification_example.ipynb'
+        - GNN Regression: 'examples/GraphNN_regression_example.ipynb'
+    - Graph Kernels:
+        - PyramidMatch: 'examples/GraphKernel_PyramidMatch_example.ipynb'
+        - SVMtheta: 'examples/GraphKernel_SVMtheta_example.ipynb'
+    - Graph Measures:
+        - Extraction Example: 'examples/GraphMeasure_extraction_example.ipynb'
+        - Pipeline Example: 'examples/GraphMeasure_pipeline_example.ipynb'
     - Graph Litmus Test: 'examples/GraphLitmusTest.ipynb'
 
 extra_css:
diff --git a/examples/GraphConvNet_example.py b/examples/GraphConvNet_example.py
deleted file mode 100644
index 75fcb40..0000000
--- a/examples/GraphConvNet_example.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from photonai.base import Hyperpipe, PipelineElement
-from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels
-from sklearn.model_selection import KFold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=400, number_of_individuals=100)
-y = get_random_labels(number_of_labels=100)
-
-# Design your Pipeline
-my_pipe = Hyperpipe('basic_svm_pipe',
-                    inner_cv=KFold(n_splits=5),
-                    outer_cv=KFold(n_splits=5),
-                    optimizer='sk_opt',
-                    optimizer_params={'n_configurations': 25},
-                    metrics=['mean_absolute_error'],
-                    best_config_metric='mean_absolute_error')
-
-my_pipe.add(PipelineElement('GraphConstructorThreshold',
-                            hyperparameters={'threshold': 0.5}))
-
-my_pipe.add(PipelineElement('GraphConvNet_Classifier'))
-
-my_pipe.fit(X, y)
diff --git a/examples/gcn_examples/GraphNN_classification_example.ipynb b/examples/gcn_examples/GraphNN_classification_example.ipynb
new file mode 100644
index 0000000..ce153a9
--- /dev/null
+++ b/examples/gcn_examples/GraphNN_classification_example.ipynb
@@ -0,0 +1,668 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true
+   },
+   "source": [
+    "# GraphNN Classification\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from photonai.base import Hyperpipe, PipelineElement\n",
+    "from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels\n",
+    "from sklearn.model_selection import KFold"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Make random matrices to simulate connectivity matrices"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=100)\n",
+    "y = get_random_labels(l_type=\"classification\", number_of_labels=100)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Design your Pipeline\n",
+    "We add a simple GraphConstructor and a GCN Classifier"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Using backend: pytorch\n"
+     ]
+    }
+   ],
+   "source": [
+    "my_pipe = Hyperpipe('basic_gembedding_pipe',\n",
+    "                    inner_cv=KFold(n_splits=5),\n",
+    "                    outer_cv=KFold(n_splits=5),\n",
+    "                    optimizer='sk_opt',\n",
+    "                    optimizer_params={'n_configurations': 25},\n",
+    "                    metrics=['accuracy', 'balanced_accuracy', 'recall', 'precision'],\n",
+    "                    best_config_metric='mean_absolute_error')\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GCNClassifier'))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Finally we simply fit the hyperpipe to our data."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=====================================================================================================\n",
+      "PHOTONAI ANALYSIS: basic_gembedding_pipe\n",
+      "=====================================================================================================\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 1\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 29.92it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.38it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.60it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.45it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.53it/s]"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5375      |      0.4250      |\n",
+      "|  balanced_accuracy  |       0.5189      |      0.4698      |\n",
+      "|        recall       |       0.7690      |      0.7111      |\n",
+      "|      precision      |       0.6263      |      0.3659      |\n",
+      "| mean_absolute_error |       0.4625      |      0.5750      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:09<00:00, 20.96it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5375      |      0.4000      |\n",
+      "|  balanced_accuracy  |       0.5338      |      0.5238      |\n",
+      "|        recall       |       0.6829      |      0.8333      |\n",
+      "|      precision      |       0.5385      |      0.3125      |\n",
+      "| mean_absolute_error |       0.4625      |      0.6000      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 2\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.17it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.67it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 29.80it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.60it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 29.91it/s]"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5437      |      0.4875      |\n",
+      "|  balanced_accuracy  |       0.5094      |      0.4685      |\n",
+      "|        recall       |       0.1163      |      0.0400      |\n",
+      "|      precision      |       0.2125      |      0.0667      |\n",
+      "| mean_absolute_error |       0.4562      |      0.5125      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:09<00:00, 21.02it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5375      |      0.5000      |\n",
+      "|  balanced_accuracy  |       0.5000      |      0.5000      |\n",
+      "|        recall       |       0.0000      |      0.0000      |\n",
+      "|      precision      |       0.0000      |      0.0000      |\n",
+      "| mean_absolute_error |       0.4625      |      0.5000      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 3\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.17it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.37it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.30it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.48it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.19it/s]"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5500      |      0.4875      |\n",
+      "|  balanced_accuracy  |       0.5125      |      0.5073      |\n",
+      "|        recall       |       0.1500      |      0.1600      |\n",
+      "|      precision      |       0.1091      |      0.0667      |\n",
+      "| mean_absolute_error |       0.4500      |      0.5125      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:09<00:00, 21.12it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5375      |      0.5000      |\n",
+      "|  balanced_accuracy  |       0.5000      |      0.5000      |\n",
+      "|        recall       |       0.0000      |      0.0000      |\n",
+      "|      precision      |       0.0000      |      0.0000      |\n",
+      "| mean_absolute_error |       0.4625      |      0.5000      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 4\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 29.83it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.35it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.37it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.45it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.42it/s]"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5750      |      0.4750      |\n",
+      "|  balanced_accuracy  |       0.5278      |      0.4564      |\n",
+      "|        recall       |       0.1161      |      0.0400      |\n",
+      "|      precision      |       0.1286      |      0.0250      |\n",
+      "| mean_absolute_error |       0.4250      |      0.5250      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:09<00:00, 20.80it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5500      |      0.4500      |\n",
+      "|  balanced_accuracy  |       0.5000      |      0.5000      |\n",
+      "|        recall       |       0.0000      |      0.0000      |\n",
+      "|      precision      |       0.0000      |      0.0000      |\n",
+      "| mean_absolute_error |       0.4500      |      0.5500      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 5\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.44it/s]\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 29.48it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.44it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.51it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:06<00:00, 30.36it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5469      |      0.4625      |\n",
+      "|  balanced_accuracy  |       0.5094      |      0.5000      |\n",
+      "|        recall       |       0.1938      |      0.2000      |\n",
+      "|      precision      |       0.1051      |      0.0625      |\n",
+      "| mean_absolute_error |       0.4531      |      0.5375      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:09<00:00, 20.87it/s]\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|       accuracy      |       0.5375      |      0.5000      |\n",
+      "|  balanced_accuracy  |       0.5000      |      0.5000      |\n",
+      "|        recall       |       0.0000      |      0.0000      |\n",
+      "|      precision      |       0.0000      |      0.0000      |\n",
+      "| mean_absolute_error |       0.4625      |      0.5000      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "*****************************************************************************************************\n",
+      "Finished all outer fold computations.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "  0%|          | 0/200 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 200/200 [00:11<00:00, 17.25it/s]"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "*****************************************************************************************************\n",
+      "\n",
+      "ANALYSIS INFORMATION ================================================================================ \n",
+      "Project Folder: /Users/jan/PycharmProjects/photonai_graph/examples/gcn_examples/basic_gembedding_pipe_results_2022-03-29_22-10-54,\n",
+      "Computation Time: 2022-03-29 22:10:54.879967 - 2022-03-29 22:14:31.327652\n",
+      "Duration: 0:03:36.447685\n",
+      "Optimized for: mean_absolute_error\n",
+      "Hyperparameter Optimizer: sk_opt\n",
+      "\n",
+      "DUMMY RESULTS =======================================================================================\n",
+      "+-------------------+--+\n",
+      "| PERFORMANCE DUMMY |  |\n",
+      "+-------------------+--+\n",
+      "+-------------------+--+\n",
+      "\n",
+      "AVERAGE PERFORMANCE ACROSS OUTER FOLDS ==============================================================\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "|     Metric Name     | Training Mean | Training Std | Test Mean | Test Std |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "|       accuracy      |      0.54     |    0.005     |    0.47   |   0.04   |\n",
+      "|  balanced_accuracy  |    0.506754   |   0.013508   |  0.504762 | 0.009524 |\n",
+      "|        recall       |    0.136585   |   0.273171   |  0.166667 | 0.333333 |\n",
+      "|      precision      |    0.107692   |   0.215385   |   0.0625  |  0.125   |\n",
+      "| mean_absolute_error |      0.46     |    0.005     |    0.53   |   0.04   |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "\n",
+      "BEST HYPERPARAMETER CONFIGURATION ===================================================================\n",
+      "{}\n",
+      "\n",
+      "\n",
+      "+--------+----------+-------------------+--------+-----------+---------------------+----------------------------+\n",
+      "| fold # | accuracy | balanced_accuracy | recall | precision | mean_absolute_error | Best Hyperparameter Config |\n",
+      "+--------+----------+-------------------+--------+-----------+---------------------+----------------------------+\n",
+      "|   1    |  0.4000  |       0.5238      | 0.8333 |   0.3125  |        0.6000       |             {}             |\n",
+      "|   2*   |  0.5000  |       0.5000      | 0.0000 |   0.0000  |        0.5000       |             {}             |\n",
+      "|   3    |  0.5000  |       0.5000      | 0.0000 |   0.0000  |        0.5000       |             {}             |\n",
+      "|   4    |  0.4500  |       0.5000      | 0.0000 |   0.0000  |        0.5500       |             {}             |\n",
+      "|   5    |  0.5000  |       0.5000      | 0.0000 |   0.0000  |        0.5000       |             {}             |\n",
+      "+--------+----------+-------------------+--------+-----------+---------------------+----------------------------+\n",
+      "\n",
+      "PHOTONAI 2.2.0 ======================================================================================\n",
+      "Your results are stored in /Users/jan/PycharmProjects/photonai_graph/examples/gcn_examples/basic_gembedding_pipe_results_2022-03-29_22-10-54\n",
+      "Go to https://explorer.photon-ai.com and upload your photon_result_file.json for convenient result visualization! \n",
+      "For more info and documentation visit https://www.photon-ai.com\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "Hyperpipe(name='basic_gembedding_pipe')"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "my_pipe.fit(X, y)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/examples/gcn_examples/GraphNN_classification_example.py b/examples/gcn_examples/GraphNN_classification_example.py
deleted file mode 100644
index 042e936..0000000
--- a/examples/gcn_examples/GraphNN_classification_example.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from photonai.base import Hyperpipe, PipelineElement
-from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels
-from sklearn.model_selection import KFold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=100)
-y = get_random_labels(l_type="classification", number_of_labels=100)
-
-# Design your Pipeline
-my_pipe = Hyperpipe('basic_gembedding_pipe',
-                    inner_cv=KFold(n_splits=5),
-                    outer_cv=KFold(n_splits=5),
-                    optimizer='sk_opt',
-                    optimizer_params={'n_configurations': 25},
-                    metrics=['accuracy', 'balanced_accuracy', 'recall', 'precision'],
-                    best_config_metric='mean_absolute_error')
-
-my_pipe.add(PipelineElement('GraphConstructorThreshold',
-                            hyperparameters={'threshold': 0.95}))
-
-my_pipe.add(PipelineElement('GCNClassifier'))
-
-my_pipe.fit(X, y)
diff --git a/examples/gcn_examples/GraphNN_regression_example.ipynb b/examples/gcn_examples/GraphNN_regression_example.ipynb
new file mode 100644
index 0000000..d97558c
--- /dev/null
+++ b/examples/gcn_examples/GraphNN_regression_example.ipynb
@@ -0,0 +1,546 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true,
+    "pycharm": {
+     "is_executing": true
+    }
+   },
+   "source": [
+    "# Graph Neural Network regression example"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from photonai.base import Hyperpipe, PipelineElement\n",
+    "from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels\n",
+    "from sklearn.model_selection import KFold"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Make random matrices to simulate connectivity matrices"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=100)\n",
+    "y = get_random_labels(l_type=\"regression\", number_of_labels=100)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Design your Pipeline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Using backend: pytorch\n"
+     ]
+    }
+   ],
+   "source": [
+    "my_pipe = Hyperpipe('basic_gembedding_pipe',\n",
+    "                    inner_cv=KFold(n_splits=5),\n",
+    "                    outer_cv=KFold(n_splits=5),\n",
+    "                    optimizer='sk_opt',\n",
+    "                    optimizer_params={'n_configurations': 25},\n",
+    "                    metrics=['mean_absolute_error'],\n",
+    "                    best_config_metric='mean_absolute_error')\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GraphConstructorPercentage', percentage=90.0))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GATRegressor', nn_epochs=20))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Finally fit the Model to our data."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=====================================================================================================\n",
+      "PHOTONAI ANALYSIS: basic_gembedding_pipe\n",
+      "=====================================================================================================\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 1\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/PycharmProjects/photonai_graph/photonai_graph/NeuralNets/dgl_base.py:281: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at  ../torch/csrc/utils/tensor_new.cpp:201.)\n",
+      "  return batched_graph, torch.tensor(labels, dtype=torch.float32)\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.63it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.91it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.94it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.94it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.87it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2575      |      0.2572      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:03<00:00,  6.02it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2572      |      0.2509      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 2\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.93it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.92it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.89it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.83it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.88it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2629      |      0.2761      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:03<00:00,  5.81it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2646      |      0.2255      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 3\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.93it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.93it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.93it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.89it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.94it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2570      |      0.2660      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:03<00:00,  6.00it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2571      |      0.2500      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 4\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.86it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.94it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.90it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.90it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.82it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2541      |      0.2597      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:03<00:00,  6.03it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2545      |      0.2621      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 5\n",
+      "*****************************************************************************************************\n",
+      "Did not find any hyperparameter to convert into skopt space.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/optimization/scikit_optimize/sk_opt.py:169: UserWarning: Did not find any hyperparameter to convert into skopt space.\n",
+      "  warnings.warn(msg)\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.92it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.55it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.60it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.70it/s]\n",
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:02<00:00,  7.61it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2484      |      0.2474      |\n",
+      "+---------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:03<00:00,  5.85it/s]\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2479      |      0.2864      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "*****************************************************************************************************\n",
+      "Finished all outer fold computations.\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "  0%|          | 0/20 [00:00<?, ?it/s]/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/torch/autocast_mode.py:141: UserWarning: User provided device_type of 'cuda', but CUDA is not available. Disabling\n",
+      "  warnings.warn('User provided device_type of \\'cuda\\', but CUDA is not available. Disabling')\n",
+      "100%|██████████| 20/20 [00:04<00:00,  4.68it/s]"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "*****************************************************************************************************\n",
+      "\n",
+      "ANALYSIS INFORMATION ================================================================================ \n",
+      "Project Folder: /Users/jan/PycharmProjects/photonai_graph/examples/gcn_examples/basic_gembedding_pipe_results_2022-03-29_22-18-33,\n",
+      "Computation Time: 2022-03-29 22:18:33.721096 - 2022-03-29 22:19:59.707055\n",
+      "Duration: 0:01:25.985959\n",
+      "Optimized for: mean_absolute_error\n",
+      "Hyperparameter Optimizer: sk_opt\n",
+      "\n",
+      "DUMMY RESULTS =======================================================================================\n",
+      "+-------------------+--+\n",
+      "| PERFORMANCE DUMMY |  |\n",
+      "+-------------------+--+\n",
+      "+-------------------+--+\n",
+      "\n",
+      "AVERAGE PERFORMANCE ACROSS OUTER FOLDS ==============================================================\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "|     Metric Name     | Training Mean | Training Std | Test Mean | Test Std |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "| mean_absolute_error |    0.256251   |   0.005373   |  0.254963 | 0.019735 |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "\n",
+      "BEST HYPERPARAMETER CONFIGURATION ===================================================================\n",
+      "{}\n",
+      "\n",
+      "\n",
+      "+--------+---------------------+----------------------------+\n",
+      "| fold # | mean_absolute_error | Best Hyperparameter Config |\n",
+      "+--------+---------------------+----------------------------+\n",
+      "|   1    |        0.2509       |             {}             |\n",
+      "|   2*   |        0.2255       |             {}             |\n",
+      "|   3    |        0.2500       |             {}             |\n",
+      "|   4    |        0.2621       |             {}             |\n",
+      "|   5    |        0.2864       |             {}             |\n",
+      "+--------+---------------------+----------------------------+\n",
+      "\n",
+      "PHOTONAI 2.2.0 ======================================================================================\n",
+      "Your results are stored in /Users/jan/PycharmProjects/photonai_graph/examples/gcn_examples/basic_gembedding_pipe_results_2022-03-29_22-18-33\n",
+      "Go to https://explorer.photon-ai.com and upload your photon_result_file.json for convenient result visualization! \n",
+      "For more info and documentation visit https://www.photon-ai.com\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "Hyperpipe(name='basic_gembedding_pipe')"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "my_pipe.fit(X, y)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/examples/gcn_examples/GraphNN_regression_example.py b/examples/gcn_examples/GraphNN_regression_example.py
deleted file mode 100644
index 626e735..0000000
--- a/examples/gcn_examples/GraphNN_regression_example.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from photonai.base import Hyperpipe, PipelineElement
-from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels
-from sklearn.model_selection import KFold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=100)
-y = get_random_labels(l_type="regression", number_of_labels=100)
-
-# Design your Pipeline
-my_pipe = Hyperpipe('basic_gembedding_pipe',
-                    inner_cv=KFold(n_splits=5),
-                    outer_cv=KFold(n_splits=5),
-                    optimizer='sk_opt',
-                    optimizer_params={'n_configurations': 25},
-                    metrics=['mean_absolute_error'],
-                    best_config_metric='mean_absolute_error')
-
-my_pipe.add(PipelineElement('GraphConstructorPercentage',
-                            hyperparameters={'percentage': 90.0}))
-
-my_pipe.add(PipelineElement('GATRegressor',
-                            hyperparameters={'nn_epochs': 20}))
-
-my_pipe.fit(X, y)
diff --git a/examples/kernel_examples/GraphKernel_PyramidMatch_example.ipynb b/examples/kernel_examples/GraphKernel_PyramidMatch_example.ipynb
new file mode 100644
index 0000000..64908d4
--- /dev/null
+++ b/examples/kernel_examples/GraphKernel_PyramidMatch_example.ipynb
@@ -0,0 +1,450 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true,
+    "pycharm": {
+     "name": "#%% md\n"
+    }
+   },
+   "source": [
+    "# Graph Kernel Pyramid Match example"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {
+    "pycharm": {
+     "is_executing": true,
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "from photonai.base import Hyperpipe, PipelineElement\n",
+    "from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels\n",
+    "from sklearn.model_selection import KFold"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "pycharm": {
+     "name": "#%% md\n"
+    }
+   },
+   "source": [
+    "Generate random matrices to simulate connectivity matrices"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [],
+   "source": [
+    "X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)\n",
+    "y = get_random_labels(l_type=\"classification\", number_of_labels=200)\n",
+    "\n",
+    "# Design your Pipeline"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "pycharm": {
+     "name": "#%% md\n"
+    }
+   },
+   "source": [
+    "Design your Pipeline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Using backend: pytorch\n"
+     ]
+    }
+   ],
+   "source": [
+    "my_pipe = Hyperpipe('basic_kernel_pipe',\n",
+    "                    inner_cv=KFold(n_splits=5),\n",
+    "                    outer_cv=KFold(n_splits=5),\n",
+    "                    optimizer='grid_search',\n",
+    "                    metrics=['accuracy', 'balanced_accuracy', 'recall', 'precision'],\n",
+    "                    best_config_metric='accuracy')\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GrakelAdapter', node_feature_construction=\"sum\"))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GrakelTransformer', transformation='PyramidMatch'))\n",
+    "\n",
+    "my_pipe.add(PipelineElement(\"SVC\", kernel='precomputed'))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "pycharm": {
+     "name": "#%% md\n"
+    }
+   },
+   "source": [
+    "Finally fit the pipeline to our data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=====================================================================================================\n",
+      "PHOTONAI ANALYSIS: basic_kernel_pipe\n",
+      "=====================================================================================================\n",
+      "JsonTransformer was unable to create the .json file.\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 1\n",
+      "*****************************************************************************************************\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/base/hyperpipe.py:814: UserWarning: JsonTransformer was unable to create the .json file.\n",
+      "  warnings.warn(msg)\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.4250      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      0.6000      |\n",
+      "|     precision     |       1.0000      |      0.2687      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.5250      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      1.0000      |\n",
+      "|     precision     |       1.0000      |      0.5250      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 2\n",
+      "*****************************************************************************************************\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.4125      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      0.4000      |\n",
+      "|     precision     |       1.0000      |      0.1562      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.5750      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      1.0000      |\n",
+      "|     precision     |       1.0000      |      0.5750      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 3\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.5625      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      1.0000      |\n",
+      "|     precision     |       1.0000      |      0.5625      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.3250      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      1.0000      |\n",
+      "|     precision     |       1.0000      |      0.3250      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 4\n",
+      "*****************************************************************************************************\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.4062      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      0.6000      |\n",
+      "|     precision     |       1.0000      |      0.2562      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.5500      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      1.0000      |\n",
+      "|     precision     |       1.0000      |      0.5500      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 5\n",
+      "*****************************************************************************************************\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n",
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.4313      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      0.4000      |\n",
+      "|     precision     |       1.0000      |      0.1625      |\n",
+      "+-------------------+-------------------+------------------+\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/sklearn/metrics/_classification.py:1318: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.\n",
+      "  _warn_prf(average, modifier, msg_start, len(result))\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|       METRIC      | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "|      accuracy     |       1.0000      |      0.4000      |\n",
+      "| balanced_accuracy |       1.0000      |      0.5000      |\n",
+      "|       recall      |       1.0000      |      0.0000      |\n",
+      "|     precision     |       1.0000      |      0.0000      |\n",
+      "+-------------------+-------------------+------------------+\n",
+      "*****************************************************************************************************\n",
+      "Finished all outer fold computations.\n",
+      "Custom pipeline element must implement .save() method or allow pickle.\n",
+      "*****************************************************************************************************\n",
+      "\n",
+      "ANALYSIS INFORMATION ================================================================================ \n",
+      "Project Folder: /Users/jan/PycharmProjects/photonai_graph/examples/kernel_examples/basic_kernel_pipe_results_2022-03-29_22-31-22,\n",
+      "Computation Time: 2022-03-29 22:31:22.127919 - 2022-03-29 22:53:06.007463\n",
+      "Duration: 0:21:43.879544\n",
+      "Optimized for: accuracy\n",
+      "Hyperparameter Optimizer: grid_search\n",
+      "\n",
+      "DUMMY RESULTS =======================================================================================\n",
+      "+-------------------+--+\n",
+      "| PERFORMANCE DUMMY |  |\n",
+      "+-------------------+--+\n",
+      "+-------------------+--+\n",
+      "\n",
+      "AVERAGE PERFORMANCE ACROSS OUTER FOLDS ==============================================================\n",
+      "+-------------------+---------------+--------------+-----------+----------+\n",
+      "|    Metric Name    | Training Mean | Training Std | Test Mean | Test Std |\n",
+      "+-------------------+---------------+--------------+-----------+----------+\n",
+      "|      accuracy     |      1.0      |     0.0      |   0.475   | 0.096177 |\n",
+      "| balanced_accuracy |      1.0      |     0.0      |    0.5    |   0.0    |\n",
+      "|       recall      |      1.0      |     0.0      |    0.8    |   0.4    |\n",
+      "|     precision     |      1.0      |     0.0      |   0.395   | 0.216449 |\n",
+      "+-------------------+---------------+--------------+-----------+----------+\n",
+      "\n",
+      "BEST HYPERPARAMETER CONFIGURATION ===================================================================\n",
+      "{}\n",
+      "\n",
+      "\n",
+      "+--------+----------+-------------------+--------+-----------+----------------------------+\n",
+      "| fold # | accuracy | balanced_accuracy | recall | precision | Best Hyperparameter Config |\n",
+      "+--------+----------+-------------------+--------+-----------+----------------------------+\n",
+      "|   1    |  0.5250  |       0.5000      | 1.0000 |   0.5250  |             {}             |\n",
+      "|   2*   |  0.5750  |       0.5000      | 1.0000 |   0.5750  |             {}             |\n",
+      "|   3    |  0.3250  |       0.5000      | 1.0000 |   0.3250  |             {}             |\n",
+      "|   4    |  0.5500  |       0.5000      | 1.0000 |   0.5500  |             {}             |\n",
+      "|   5    |  0.4000  |       0.5000      | 0.0000 |   0.0000  |             {}             |\n",
+      "+--------+----------+-------------------+--------+-----------+----------------------------+\n",
+      "\n",
+      "PHOTONAI 2.2.0 ======================================================================================\n",
+      "Your results are stored in /Users/jan/PycharmProjects/photonai_graph/examples/kernel_examples/basic_kernel_pipe_results_2022-03-29_22-31-22\n",
+      "Go to https://explorer.photon-ai.com and upload your photon_result_file.json for convenient result visualization! \n",
+      "For more info and documentation visit https://www.photon-ai.com\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "Hyperpipe(name='basic_kernel_pipe')"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "my_pipe.fit(X, y)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/examples/kernel_examples/GraphKernel_PyramidMatch_example.py b/examples/kernel_examples/GraphKernel_PyramidMatch_example.py
deleted file mode 100644
index 19582e7..0000000
--- a/examples/kernel_examples/GraphKernel_PyramidMatch_example.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from photonai.base import Hyperpipe, PipelineElement
-from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels
-from sklearn.model_selection import KFold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)
-y = get_random_labels(l_type="classification", number_of_labels=200)
-
-# Design your Pipeline
-my_pipe = Hyperpipe('basic_kernel_pipe',
-                    inner_cv=KFold(n_splits=5),
-                    outer_cv=KFold(n_splits=5),
-                    optimizer='grid_search',
-                    metrics=['accuracy', 'balanced_accuracy', 'recall', 'precision'],
-                    best_config_metric='accuracy')
-
-my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))
-
-my_pipe.add(PipelineElement('GrakelAdapter', node_feature_construction="sum"))
-
-my_pipe.add(PipelineElement('PyramidMatch'))
-
-my_pipe.add(PipelineElement("SVC", kernel='precomputed'))
-
-my_pipe.fit(X, y)
diff --git a/examples/kernel_examples/GraphKernel_SVMtheta_example.ipynb b/examples/kernel_examples/GraphKernel_SVMtheta_example.ipynb
new file mode 100644
index 0000000..cac3908
--- /dev/null
+++ b/examples/kernel_examples/GraphKernel_SVMtheta_example.ipynb
@@ -0,0 +1,316 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true,
+    "pycharm": {
+     "is_executing": true
+    }
+   },
+   "source": [
+    "# Graph Kernel SVM theta example"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from photonai.base import Hyperpipe, PipelineElement\n",
+    "from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels\n",
+    "from sklearn.model_selection import KFold"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Generate example data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)\n",
+    "y = get_random_labels(l_type=\"regression\", number_of_labels=200)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Design example pipeline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Using backend: pytorch\n"
+     ]
+    }
+   ],
+   "source": [
+    "my_pipe = Hyperpipe('basic_kernel_pipe',\n",
+    "                    inner_cv=KFold(n_splits=5),\n",
+    "                    outer_cv=KFold(n_splits=5),\n",
+    "                    optimizer='grid_search',\n",
+    "                    metrics=['mean_absolute_error'],\n",
+    "                    best_config_metric='mean_absolute_error')\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GrakelAdapter'))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GrakelTransformer', transformation='SvmTheta'))\n",
+    "\n",
+    "my_pipe.add(PipelineElement(\"SVR\", kernel='precomputed'))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Fit pipeline to example data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=====================================================================================================\n",
+      "PHOTONAI ANALYSIS: basic_kernel_pipe\n",
+      "=====================================================================================================\n",
+      "JsonTransformer was unable to create the .json file.\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 1\n",
+      "*****************************************************************************************************\n"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/Users/jan/anaconda3/envs/photonai_graph_test/lib/python3.9/site-packages/photonai/base/hyperpipe.py:814: UserWarning: JsonTransformer was unable to create the .json file.\n",
+      "  warnings.warn(msg)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2499      |      0.2544      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2502      |      0.2415      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 2\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2536      |      0.2576      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2542      |      0.2278      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 3\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2338      |      0.2420      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2350      |      0.3038      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 4\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2436      |      0.2485      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2446      |      0.2724      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 5\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2544      |      0.2590      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.2548      |      0.2238      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "*****************************************************************************************************\n",
+      "Finished all outer fold computations.\n",
+      "Custom pipeline element must implement .save() method or allow pickle.\n",
+      "*****************************************************************************************************\n",
+      "\n",
+      "ANALYSIS INFORMATION ================================================================================ \n",
+      "Project Folder: /Users/jan/PycharmProjects/photonai_graph/examples/kernel_examples/basic_kernel_pipe_results_2022-03-29_22-35-32,\n",
+      "Computation Time: 2022-03-29 22:35:32.051073 - 2022-03-29 22:36:21.945384\n",
+      "Duration: 0:00:49.894311\n",
+      "Optimized for: mean_absolute_error\n",
+      "Hyperparameter Optimizer: grid_search\n",
+      "\n",
+      "DUMMY RESULTS =======================================================================================\n",
+      "+-------------------+--+\n",
+      "| PERFORMANCE DUMMY |  |\n",
+      "+-------------------+--+\n",
+      "+-------------------+--+\n",
+      "\n",
+      "AVERAGE PERFORMANCE ACROSS OUTER FOLDS ==============================================================\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "|     Metric Name     | Training Mean | Training Std | Test Mean | Test Std |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "| mean_absolute_error |    0.247754   |   0.007348   |  0.253866 | 0.030233 |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "\n",
+      "BEST HYPERPARAMETER CONFIGURATION ===================================================================\n",
+      "{}\n",
+      "\n",
+      "\n",
+      "+--------+---------------------+----------------------------+\n",
+      "| fold # | mean_absolute_error | Best Hyperparameter Config |\n",
+      "+--------+---------------------+----------------------------+\n",
+      "|   1    |        0.2415       |             {}             |\n",
+      "|   2    |        0.2278       |             {}             |\n",
+      "|   3    |        0.3038       |             {}             |\n",
+      "|   4    |        0.2724       |             {}             |\n",
+      "|   5*   |        0.2238       |             {}             |\n",
+      "+--------+---------------------+----------------------------+\n",
+      "\n",
+      "PHOTONAI 2.2.0 ======================================================================================\n",
+      "Your results are stored in /Users/jan/PycharmProjects/photonai_graph/examples/kernel_examples/basic_kernel_pipe_results_2022-03-29_22-35-32\n",
+      "Go to https://explorer.photon-ai.com and upload your photon_result_file.json for convenient result visualization! \n",
+      "For more info and documentation visit https://www.photon-ai.com\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "Hyperpipe(name='basic_kernel_pipe')"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "my_pipe.fit(X, y)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/examples/kernel_examples/GraphKernel_SVMtheta_example.py b/examples/kernel_examples/GraphKernel_SVMtheta_example.py
deleted file mode 100644
index 2087bad..0000000
--- a/examples/kernel_examples/GraphKernel_SVMtheta_example.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from photonai.base import Hyperpipe, PipelineElement
-from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels
-from sklearn.model_selection import KFold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)
-y = get_random_labels(l_type="regression", number_of_labels=200)
-
-# Design your Pipeline
-my_pipe = Hyperpipe('basic_kernel_pipe',
-                    inner_cv=KFold(n_splits=5),
-                    outer_cv=KFold(n_splits=5),
-                    optimizer='grid_search',
-                    metrics=['mean_absolute_error'],
-                    best_config_metric='mean_absolute_error')
-
-my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))
-
-my_pipe.add(PipelineElement('GrakelAdapter'))
-
-my_pipe.add(PipelineElement('SvmTheta'))
-
-my_pipe.add(PipelineElement("SVR", kernel='precomputed'))
-
-my_pipe.fit(X, y)
diff --git a/examples/measure_examples/GraphMeasure_extraction_example.ipynb b/examples/measure_examples/GraphMeasure_extraction_example.ipynb
new file mode 100644
index 0000000..08b8931
--- /dev/null
+++ b/examples/measure_examples/GraphMeasure_extraction_example.ipynb
@@ -0,0 +1,120 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true
+   },
+   "source": [
+    "# Graph Measure extraction example\n",
+    "This example will show you how to save the graph measurement results as CSV file."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Using backend: pytorch\n"
+     ]
+    }
+   ],
+   "source": [
+    "import numpy as np\n",
+    "\n",
+    "from photonai_graph.GraphUtilities import get_random_connectivity_data\n",
+    "from photonai_graph.GraphMeasureTransform import GraphMeasureTransform\n",
+    "from photonai_graph.GraphConstruction.graph_constructor_threshold import GraphConstructorThreshold"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Generate random matrices to simulate connectivity matrices"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Instantiate a constructor to threshold the graphs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "g_constructor = GraphConstructorThreshold(threshold=0.95)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Instantiate the measure_transformer"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "g_measure_transformer = GraphMeasureTransform(graph_functions={\"global_efficiency\": {},\n",
+    "                                                               \"local_efficiency\": {},\n",
+    "                                                               \"average_clustering\": {},\n",
+    "                                                               \"degree_centrality\": {},\n",
+    "                                                               \"betweenness_centrality\": {},\n",
+    "                                                               \"overall_reciprocity\": {}})\n",
+    "\n",
+    "X_trans = g_constructor.transform(X)\n",
+    "\n",
+    "g_measure_transformer.extract_measures(X_trans, path=\"test_measures.csv\", ids=np.arange(200))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This will generate an example CSV file containing the measurement results for each graph."
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/examples/measure_examples/GraphMeasure_extraction_example.py b/examples/measure_examples/GraphMeasure_extraction_example.py
deleted file mode 100644
index 85e0c1c..0000000
--- a/examples/measure_examples/GraphMeasure_extraction_example.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from photonai_graph.GraphUtilities import get_random_connectivity_data
-from photonai_graph.GraphMeasureTransform import GraphMeasureTransform
-from photonai_graph.GraphConstruction.graph_constructor_threshold import GraphConstructorThreshold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)
-
-
-# instantiate a constructor to threshold the graphs
-g_constructor = GraphConstructorThreshold(threshold=0.95)
-
-# instantiate the measure_transformer
-g_measure_transformer = GraphMeasureTransform(graph_functions={"global_efficiency": {},
-                                                               "local_efficiency": {},
-                                                               "average_clustering": {},
-                                                               "degree_centrality": {},
-                                                               "betweenness_centrality": {},
-                                                               "overall_reciprocity": {}})
-
-X_trans = g_constructor.transform(X)
-
-g_measure_transformer.extract_measures(X_trans, path="/path/to/your/data/test_measures.csv")
diff --git a/examples/measure_examples/GraphMeasure_pipeline_example.ipynb b/examples/measure_examples/GraphMeasure_pipeline_example.ipynb
new file mode 100644
index 0000000..afbd976
--- /dev/null
+++ b/examples/measure_examples/GraphMeasure_pipeline_example.ipynb
@@ -0,0 +1,304 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {
+    "collapsed": true,
+    "pycharm": {
+     "is_executing": true
+    }
+   },
+   "source": [
+    "# Graph Measure Pipeline example\n",
+    "This example will show you how you can use graph measures directly in your hyperpipe."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from photonai.base import Hyperpipe, PipelineElement\n",
+    "from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels\n",
+    "from sklearn.model_selection import KFold"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Generate random matrices to simulate connectivity matrices"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)\n",
+    "y = get_random_labels(l_type=\"regression\", number_of_labels=200)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Design your Pipeline"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Using backend: pytorch\n"
+     ]
+    }
+   ],
+   "source": [
+    "my_pipe = Hyperpipe('basic_measure_pipe',\n",
+    "                    inner_cv=KFold(n_splits=5),\n",
+    "                    outer_cv=KFold(n_splits=5),\n",
+    "                    optimizer='grid_search',\n",
+    "                    metrics=['mean_absolute_error'],\n",
+    "                    best_config_metric='mean_absolute_error')\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))\n",
+    "\n",
+    "my_pipe.add(PipelineElement('GraphMeasureTransform', graph_functions={\"global_efficiency\": {},\n",
+    "                                                                      \"local_efficiency\": {},\n",
+    "                                                                      \"average_clustering\": {},\n",
+    "                                                                      \"degree_centrality\": {},\n",
+    "                                                                      \"betweenness_centrality\": {},\n",
+    "                                                                      \"overall_reciprocity\": {}}))\n",
+    "\n",
+    "my_pipe.add(PipelineElement(\"SVR\"))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Finally fit the pipeline to your data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "=====================================================================================================\n",
+      "PHOTONAI ANALYSIS: basic_measure_pipe\n",
+      "=====================================================================================================\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 1\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1166      |      0.2611      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1217      |      0.2781      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 2\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1164      |      0.2564      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1202      |      0.2964      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 3\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1147      |      0.2675      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1188      |      0.2652      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 4\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1164      |      0.2791      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1240      |      0.2471      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "\n",
+      "*****************************************************************************************************\n",
+      "Outer Cross validation Fold 5\n",
+      "*****************************************************************************************************\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "BEST_CONFIG \n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "{}\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "VALIDATION PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1177      |      0.2668      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "TEST PERFORMANCE\n",
+      "-----------------------------------------------------------------------------------------------------\n",
+      "+---------------------+-------------------+------------------+\n",
+      "|        METRIC       | PERFORMANCE TRAIN | PERFORMANCE TEST |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "| mean_absolute_error |       0.1214      |      0.2784      |\n",
+      "+---------------------+-------------------+------------------+\n",
+      "*****************************************************************************************************\n",
+      "Finished all outer fold computations.\n",
+      "*****************************************************************************************************\n",
+      "\n",
+      "ANALYSIS INFORMATION ================================================================================ \n",
+      "Project Folder: /Users/jan/PycharmProjects/photonai_graph/examples/measure_examples/basic_measure_pipe_results_2022-03-29_22-53-16,\n",
+      "Computation Time: 2022-03-29 22:53:16.555478 - 2022-03-29 22:55:59.836637\n",
+      "Duration: 0:02:43.281159\n",
+      "Optimized for: mean_absolute_error\n",
+      "Hyperparameter Optimizer: grid_search\n",
+      "\n",
+      "DUMMY RESULTS =======================================================================================\n",
+      "+-------------------+--+\n",
+      "| PERFORMANCE DUMMY |  |\n",
+      "+-------------------+--+\n",
+      "+-------------------+--+\n",
+      "\n",
+      "AVERAGE PERFORMANCE ACROSS OUTER FOLDS ==============================================================\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "|     Metric Name     | Training Mean | Training Std | Test Mean | Test Std |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "| mean_absolute_error |    0.121207   |   0.001749   |  0.273027 | 0.016342 |\n",
+      "+---------------------+---------------+--------------+-----------+----------+\n",
+      "\n",
+      "BEST HYPERPARAMETER CONFIGURATION ===================================================================\n",
+      "{}\n",
+      "\n",
+      "\n",
+      "+--------+---------------------+----------------------------+\n",
+      "| fold # | mean_absolute_error | Best Hyperparameter Config |\n",
+      "+--------+---------------------+----------------------------+\n",
+      "|   1    |        0.2781       |             {}             |\n",
+      "|   2    |        0.2964       |             {}             |\n",
+      "|   3    |        0.2652       |             {}             |\n",
+      "|   4*   |        0.2471       |             {}             |\n",
+      "|   5    |        0.2784       |             {}             |\n",
+      "+--------+---------------------+----------------------------+\n",
+      "\n",
+      "PHOTONAI 2.2.0 ======================================================================================\n",
+      "Your results are stored in /Users/jan/PycharmProjects/photonai_graph/examples/measure_examples/basic_measure_pipe_results_2022-03-29_22-53-16\n",
+      "Go to https://explorer.photon-ai.com and upload your photon_result_file.json for convenient result visualization! \n",
+      "For more info and documentation visit https://www.photon-ai.com\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "Hyperpipe(name='basic_measure_pipe')"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "my_pipe.fit(X, y)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3 (ipykernel)",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.7"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
\ No newline at end of file
diff --git a/examples/measure_examples/GraphMeasure_pipeline_example.py b/examples/measure_examples/GraphMeasure_pipeline_example.py
deleted file mode 100644
index e73aad4..0000000
--- a/examples/measure_examples/GraphMeasure_pipeline_example.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from photonai.base import Hyperpipe, PipelineElement
-from photonai_graph.GraphUtilities import get_random_connectivity_data, get_random_labels
-from sklearn.model_selection import KFold
-
-# make random matrices to simulate connectivity matrices
-X = get_random_connectivity_data(number_of_nodes=50, number_of_individuals=200)
-y = get_random_labels(l_type="regression", number_of_labels=200)
-
-# Design your Pipeline
-my_pipe = Hyperpipe('basic_measure_pipe',
-                    inner_cv=KFold(n_splits=5),
-                    outer_cv=KFold(n_splits=5),
-                    optimizer='grid_search',
-                    metrics=['mean_absolute_error'],
-                    best_config_metric='mean_absolute_error')
-
-my_pipe.add(PipelineElement('GraphConstructorThreshold', threshold=0.95))
-
-my_pipe.add(PipelineElement('GraphMeasureTransform', graph_functions={"global_efficiency": {},
-                                                                      "local_efficiency": {},
-                                                                      "average_clustering": {},
-                                                                      "degree_centrality": {},
-                                                                      "betweenness_centrality": {},
-                                                                      "overall_reciprocity": {}}))
-
-my_pipe.add(PipelineElement("SVR"))
-
-my_pipe.fit(X, y)
diff --git a/photonai_graph/GraphConstruction/graph_constructor.py b/photonai_graph/GraphConstruction/graph_constructor.py
index be44838..3df3a0b 100644
--- a/photonai_graph/GraphConstruction/graph_constructor.py
+++ b/photonai_graph/GraphConstruction/graph_constructor.py
@@ -14,9 +14,10 @@ class GraphConstructor(BaseEstimator, TransformerMixin, ABC):
 
     def __init__(self,
                  one_hot_nodes: int = 0,
+                 use_abs: int = 0,
                  fisher_transform: int = 0,
                  discard_original_connectivity: bool = False,
-                 use_abs: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
@@ -29,12 +30,15 @@ def __init__(self,
         ----------
         one_hot_nodes: int, default=0
             whether to return a one hot node encoding as feature or not
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int, default=0
             whether to perform a fisher transform of every matrix
         discard_original_connectivity: bool,default=False
             If true the second index of the last dimension will be the original connectivity.
             Otherwise the original connectivity will be dropped from the matrix.
-        use_abs: int
+        use_abs_fisher: int
             Changes the values to absolute values. Is applied after fisher transform and before
             z-score transformation
         zscore: int, default=0
@@ -51,9 +55,11 @@ def __init__(self,
         if one_hot_nodes not in [0, 1]:
             raise ValueError("one_hot_nodes must be in [0, 1]")
         self.one_hot_nodes = one_hot_nodes
+        self.use_abs = use_abs
         self.fisher_transform = fisher_transform
+        self.use_abs_fisher = use_abs_fisher
         self.discard_original_connectivity = discard_original_connectivity
-        self.use_abs = use_abs
+        self.use_abs_fisher = use_abs_fisher
         self.zscore = zscore
         self.use_abs_zscore = use_abs_zscore
         self.adjacency_axis = adjacency_axis
@@ -79,14 +85,16 @@ def get_mtrx(self, graph_obj: np.ndarray) -> (np.ndarray, np.ndarray):
 
     def prep_mtrx(self, adjacency: np.ndarray) -> np.ndarray:
         """transforms the matrix according to selected criteria"""
-        if self.fisher_transform:
-            adjacency = individual_fishertransform(adjacency)
         if self.use_abs:
             adjacency = np.abs(adjacency)
+        if self.fisher_transform:
+            adjacency = individual_fishertransform(adjacency)
+            if self.use_abs_fisher:
+                adjacency = np.abs(adjacency)
         if self.zscore:
             adjacency = individual_ztransform(adjacency)
-        if self.use_abs_zscore:
-            adjacency = np.abs(adjacency)
+            if self.use_abs_zscore:
+                adjacency = np.abs(adjacency)
 
         return adjacency
 
diff --git a/photonai_graph/GraphConstruction/graph_constructor_knn.py b/photonai_graph/GraphConstruction/graph_constructor_knn.py
index da0e7e4..b6e7efe 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_knn.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_knn.py
@@ -8,13 +8,13 @@ class GraphConstructorKNN(GraphConstructor):
     def __init__(self,
                  k_distance: int = 10,
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
-                 logs: str = None
-                 ):
+                 logs: str = None):
         """
         Transformer class for generating adjacency matrices
         from connectivity matrices. Selects the k nearest
@@ -27,19 +27,23 @@ def __init__(self,
         ----------
         k_distance: int
             the k nearest neighbours value, for the kNN algorithm.
-        adjacency_axis: int,default=0
-            position of the adjacency matrix, default being zero
         one_hot_nodes: int,default=0
             Whether to generate a one hot encoding of the nodes in the matrix (1) or not (0)
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int,default=0
             whether to perform a fisher transform of each matrix (1) or not (0)
-        use_abs: int,default=0
+        use_abs_fisher: int,default=0
             changes the values to absolute values. Is applied after fisher transform and before z-score transformation
         zscore: int,default=0
             performs a zscore transformation of the data. Applied after fisher transform and np_abs
         use_abs_zscore: int,default=0
             whether to use the absolute values of the z-score transformation or allow for negative values
-
+        adjacency_axis: int,default=0
+            position of the adjacency matrix, default being zero
+        logs: str, default=None
+            Path to the log data
 
         Example
         -------
@@ -59,8 +63,9 @@ def __init__(self,
         ```
        """
         super(GraphConstructorKNN, self).__init__(one_hot_nodes=one_hot_nodes,
-                                                  fisher_transform=fisher_transform,
                                                   use_abs=use_abs,
+                                                  fisher_transform=fisher_transform,
+                                                  use_abs_fisher=use_abs_fisher,
                                                   zscore=zscore,
                                                   use_abs_zscore=use_abs_zscore,
                                                   adjacency_axis=adjacency_axis,
diff --git a/photonai_graph/GraphConstruction/graph_constructor_percentage.py b/photonai_graph/GraphConstruction/graph_constructor_percentage.py
index 795f23f..a9a0af9 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_percentage.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_percentage.py
@@ -5,15 +5,17 @@
 class GraphConstructorPercentage(GraphConstructor):
     _estimator_type = "transformer"
 
-    def __init__(self, percentage: float = 80,
+    def __init__(self,
+                 percentage: float = 80,
                  retain_weights: float = 0,
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
-                 logs: str = ''):
+                 logs: str = None):
         """
         Transformer class for generating adjacency matrices
         from connectivity matrices. Selects the top x percent
@@ -24,20 +26,25 @@ def __init__(self, percentage: float = 80,
         ----------
         percentage: float
             value of percent of connections to discard. A value of 90 keeps only the top 10%
-        adjacency_axis: int, default=0
-            position of the adjacency matrix, default being zero
+        retain_weights: float
+            whether to retain weight values or not
         one_hot_nodes: int, default=0
             Whether to generate a one hot encoding of the nodes in the matrix (1) or not (0)
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int, default=0
             whether to perform a fisher transform of each matrix (1) or not (0)
-        use_abs: int, default=0
+        use_abs_fisher: int, default=0
             changes the values to absolute values. Is applied after fisher transform and before z-score transformation
         zscore: int, default=0
             performs a zscore transformation of the data. Applied after fisher transform and np_abs
         use_abs_zscore: int, default=0
             whether to use the absolute values of the z-score transformation or allow for negative values
-        retain_weights: float
-            whether to retain weight values or not
+        adjacency_axis: int, default=0
+            position of the adjacency matrix, default being zero
+        logs: str, default=None
+            Path to the log data
 
         Example
         -------
@@ -59,8 +66,9 @@ def __init__(self, percentage: float = 80,
 
        """
         super(GraphConstructorPercentage, self).__init__(one_hot_nodes=one_hot_nodes,
-                                                         fisher_transform=fisher_transform,
                                                          use_abs=use_abs,
+                                                         fisher_transform=fisher_transform,
+                                                         use_abs_fisher=use_abs_fisher,
                                                          zscore=zscore,
                                                          use_abs_zscore=use_abs_zscore,
                                                          adjacency_axis=adjacency_axis,
diff --git a/photonai_graph/GraphConstruction/graph_constructor_percentage_window.py b/photonai_graph/GraphConstruction/graph_constructor_percentage_window.py
index 2afc295..c21d698 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_percentage_window.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_percentage_window.py
@@ -10,13 +10,13 @@ def __init__(self,
                  percentage_lower: float = 10,
                  retain_weights: float = 0,
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
-                 logs: str = None
-                 ):
+                 logs: str = None):
         """
         Transformer class for generating adjacency matrices
         from connectivity matrices. Selects the top x percent
@@ -29,18 +29,23 @@ def __init__(self,
             upper limit of the percentage window
         percentage_lower: float
             lower limit of the percentage window
-        adjacency_axis: int
-            position of the adjacency matrix, default being zero
         one_hot_nodes: int
             Whether to generate a one hot encoding of the nodes in the matrix (1) or not (0)
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int
             whether to perform a fisher transform of each matrix (1) or not (0)
-        use_abs: int,default=0
+        use_abs_fisher: int,default=0
             changes the values to absolute values. Is applied after fisher transform and before z-score transformation
         zscore: int,default=0
             performs a zscore transformation of the data. Applied after fisher transform and np_abs
         use_abs_zscore: int,default=0
             whether to use the absolute values of the z-score transformation or allow for negative values
+        adjacency_axis: int
+            position of the adjacency matrix, default being zero
+        logs: str, default=None
+            Path to the log data
 
         Example
         -------
@@ -61,8 +66,9 @@ def __init__(self,
         ```
        """
         super(GraphConstructorPercentageWindow, self).__init__(one_hot_nodes=one_hot_nodes,
-                                                               fisher_transform=fisher_transform,
                                                                use_abs=use_abs,
+                                                               fisher_transform=fisher_transform,
+                                                               use_abs_fisher=use_abs_fisher,
                                                                zscore=zscore,
                                                                use_abs_zscore=use_abs_zscore,
                                                                adjacency_axis=adjacency_axis,
diff --git a/photonai_graph/GraphConstruction/graph_constructor_random_walks.py b/photonai_graph/GraphConstruction/graph_constructor_random_walks.py
index 21c3836..e2d6343 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_random_walks.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_random_walks.py
@@ -15,10 +15,10 @@ def __init__(self,
                  walk_length: int = 10,
                  window_size: int = 5,
                  no_edge_weight: int = 1,
-                 feature_axis=1,
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
@@ -45,18 +45,23 @@ def __init__(self,
             size of the sliding window from which to sample to coocurrence of two nodes
         no_edge_weight: int,default=1
             whether to return an edge weight (0) or not (1)
-        adjacency_axis: int,default=0
-            position of the adjacency matrix, default being zero
         one_hot_nodes: int,default=0
             Whether to generate a one hot encoding of the nodes in the matrix (1) or not (0)
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int,default=0
             whether to perform a fisher transform of each matrix (1) or not (0)
-        use_abs: int,default=0
+        use_abs_fisher: int,default=0
             changes the values to absolute values. Is applied after fisher transform and before z-score transformation
         zscore: int,default=0
             performs a zscore transformation of the data. Applied after fisher transform and np_abs
         use_abs_zscore: int,default=0
             whether to use the absolute values of the z-score transformation or allow for negative values
+        adjacency_axis: int,default=0
+            position of the adjacency matrix, default being zero
+        logs: str, default=None
+            Path to the log data
 
 
         Example
@@ -79,8 +84,9 @@ def __init__(self,
         ```
        """
         super(GraphConstructorRandomWalks, self).__init__(one_hot_nodes=one_hot_nodes,
-                                                          fisher_transform=fisher_transform,
                                                           use_abs=use_abs,
+                                                          fisher_transform=fisher_transform,
+                                                          use_abs_fisher=use_abs_fisher,
                                                           zscore=zscore,
                                                           use_abs_zscore=use_abs_zscore,
                                                           adjacency_axis=adjacency_axis,
@@ -90,7 +96,6 @@ def __init__(self,
         self.walk_length = walk_length
         self.window_size = window_size
         self.no_edge_weight = no_edge_weight
-        self.feature_axis = feature_axis
 
     @staticmethod
     def random_walk(adjacency: np.ndarray, walk_length: int, num_walks: int) -> List[List[List[int]]]:
diff --git a/photonai_graph/GraphConstruction/graph_constructor_spatial.py b/photonai_graph/GraphConstruction/graph_constructor_spatial.py
index 529cd9f..7ab75ff 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_spatial.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_spatial.py
@@ -13,18 +13,19 @@ def __init__(self,
                  atlas_name: str = 'ho',
                  atlas_folder: str = "",
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
-                 logs: str = None
-                 ):
+                 logs: str = None):
         """
         Transformer class for generating adjacency matrices
         from connectivity matrices. Selects the k nearest
         neighbours for each node based on spatial distance
-        of the coordinates in the chosen atlas.
+        of the coordinates in the chosen atlas. This method
+        can be applied to both DTI and rs-fMRI data.
         Adapted from Ktena et al, 2017.
 
         !!! danger
@@ -39,19 +40,23 @@ def __init__(self,
             name of the atlas coordinate file
         atlas_folder: str,default="ho"
             path to the atlas coordinate file
-        adjacency_axis: int,default=0
-            position of the adjacency matrix, default being zero
         one_hot_nodes: int,default=0
             Whether to generate a one hot encoding of the nodes in the matrix (1) or not (0)
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int,default=0
             whether to perform a fisher transform of each matrix (1) or not (0)
-        use_abs: int,default=0
+        use_abs_fisher: int,default=0
             changes the values to absolute values. Is applied after fisher transform and before z-score transformation
         zscore: int,default=0
             performs a zscore transformation of the data. Applied after fisher transform and np_abs
         use_abs_zscore: int,default=0
             whether to use the absolute values of the z-score transformation or allow for negative values
-
+        adjacency_axis: int,default=0
+            position of the adjacency matrix, default being zero
+        logs: str, default=None
+            Path to the log data
 
         Example
         -------
@@ -74,8 +79,9 @@ def __init__(self,
         ```
        """
         super(GraphConstructorSpatial, self).__init__(one_hot_nodes=one_hot_nodes,
-                                                      fisher_transform=fisher_transform,
                                                       use_abs=use_abs,
+                                                      fisher_transform=fisher_transform,
+                                                      use_abs_fisher=use_abs_fisher,
                                                       zscore=zscore,
                                                       use_abs_zscore=use_abs_zscore,
                                                       adjacency_axis=adjacency_axis,
diff --git a/photonai_graph/GraphConstruction/graph_constructor_threshold.py b/photonai_graph/GraphConstruction/graph_constructor_threshold.py
index bf5208b..42f07e8 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_threshold.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_threshold.py
@@ -6,14 +6,16 @@
 class GraphConstructorThreshold(GraphConstructor):
     _estimator_type = "transformer"
 
-    def __init__(self, threshold: float = 0.1,
+    def __init__(self,
+                 threshold: float = 0.1,
                  concatenation_axis: int = 3,
                  return_adjacency_only: int = 0,
                  retain_weights: int = 0,
                  discard_original_connectivity: bool = False,
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
@@ -28,26 +30,29 @@ def __init__(self, threshold: float = 0.1,
         ----------
         threshold: float
             threshold value below which to set matrix entries to zero
-        adjacency_axis: int, default=0
-            position of the adjacency matrix, default being zero
         concatenation_axis: int
             axis along which to concatenate the adjacency and feature matrix
+        return_adjacency_only: int
+            whether to return the adjacency matrix only (1) or also a feature matrix (0)
+        retain_weights: int
+            whether to retain weight values or not
         discard_original_connectivity: bool,default=False
             If true the original connectivity will be passed on. Otherwise it gets discarded
         one_hot_nodes: int
             Whether to generate a one hot encoding of the nodes in the matrix (1) or not (0)
-        return_adjacency_only: int
-            whether to return the adjacency matrix only (1) or also a feature matrix (0)
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int
             whether to perform a fisher transform of each matrix (1) or not (0)
-        use_abs: int, default=0
+        use_abs_fisher: int, default=0
             changes the values to absolute values. Is applied after fisher transform and before z-score transformation
         zscore: int, default=0
             performs a zscore transformation of the data. Applied after fisher transform and np_abs
         use_abs_zscore:
             whether to use the absolute values of the z-score transformation or allow for negative values
-        retain_weights: int
-            whether to retain weight values or not
+        adjacency_axis: int, default=0
+            position of the adjacency matrix, default being zero
         logs: str, default=None
             Path to the log data
 
@@ -70,9 +75,10 @@ def __init__(self, threshold: float = 0.1,
         ```
        """
         super(GraphConstructorThreshold, self).__init__(one_hot_nodes=one_hot_nodes,
+                                                        use_abs=use_abs,
                                                         fisher_transform=fisher_transform,
                                                         discard_original_connectivity=discard_original_connectivity,
-                                                        use_abs=use_abs,
+                                                        use_abs_fisher=use_abs_fisher,
                                                         zscore=zscore,
                                                         use_abs_zscore=use_abs_zscore,
                                                         adjacency_axis=adjacency_axis,
diff --git a/photonai_graph/GraphConstruction/graph_constructor_threshold_window.py b/photonai_graph/GraphConstruction/graph_constructor_threshold_window.py
index 5762cbe..ae08b97 100644
--- a/photonai_graph/GraphConstruction/graph_constructor_threshold_window.py
+++ b/photonai_graph/GraphConstruction/graph_constructor_threshold_window.py
@@ -11,8 +11,9 @@ def __init__(self,
                  threshold_lower: float = 0.8,
                  retain_weights: float = 0,
                  one_hot_nodes: int = 0,
-                 fisher_transform: int = 0,
                  use_abs: int = 0,
+                 fisher_transform: int = 0,
+                 use_abs_fisher: int = 0,
                  zscore: int = 0,
                  use_abs_zscore: int = 0,
                  adjacency_axis: int = 0,
@@ -29,13 +30,16 @@ def __init__(self,
             upper limit of the threshold window
         threshold_lower: float
             lower limit of the threshold window
-        adjacency_axis: int
-            position of the adjacency matrix, default being zero
+        retain_weights: int
+            whether to retain weight values or not
         one_hot_nodes: int
             Whether to generate a one hot encoding of the nodes in the matrix.
+        use_abs: bool, default = False
+            whether to convert all matrix values to absolute values before applying
+            other transformations
         fisher_transform: int
             Perform a fisher transform of each matrix. No (0) or Yes (1)
-        use_abs: int
+        use_abs_fisher: int
             Changes the values to absolute values. Is applied after fisher transform and before
             z-score transformation
         zscore: int, default=0
@@ -44,6 +48,8 @@ def __init__(self,
         use_abs_zscore: int, default=0
             whether to use the absolute values of the z-score transformation or allow for negative
             values. Applied after fisher transform, use_abs and zscore
+        adjacency_axis: int
+            position of the adjacency matrix, default being zero
         logs: str, default=None
             Path to the log data
 
@@ -65,8 +71,9 @@ def __init__(self,
         ```
        """
         super(GraphConstructorThresholdWindow, self).__init__(one_hot_nodes=one_hot_nodes,
-                                                              fisher_transform=fisher_transform,
                                                               use_abs=use_abs,
+                                                              fisher_transform=fisher_transform,
+                                                              use_abs_fisher=use_abs_fisher,
                                                               zscore=zscore,
                                                               use_abs_zscore=use_abs_zscore,
                                                               adjacency_axis=adjacency_axis,
diff --git a/photonai_graph/GraphConversions.py b/photonai_graph/GraphConversions.py
index f2ba010..45eb89d 100644
--- a/photonai_graph/GraphConversions.py
+++ b/photonai_graph/GraphConversions.py
@@ -1,4 +1,3 @@
-from scipy import sparse
 import networkx as nx
 import numpy as np
 import warnings
@@ -7,320 +6,18 @@
 try:
     import dgl
     import torch
-except ImportError:
+except ImportError:  # pragma: no cover
     pass
 
-sparse_types = {
-    "bsr_matrix": sparse.bsr_matrix,
-    "coo_matrix": sparse.coo_matrix,
-    "csc_matrix": sparse.csc_matrix,
-    "csr_matrix": sparse.csr_matrix,
-    "dia_matrix": sparse.dia_matrix,
-    "dok_matrix": sparse.dok_matrix,
-    "lil_matrix": sparse.lil_matrix,
-    "spmatrix": sparse.spmatrix
-}
 
-
-def networkx_to_dense(graphs):
-    """convert a networkx graph to a numpy array
-
-        Parameters
-        ----------
-            graphs: list of graphs
-
-        Returns
-        -------
-            list of numpy arrays or a single numpy array
-    """
-
-    def single_networkx_to_dense(graph):
-        """INTERNAL HELPER FUNCTION
-        convert a networkx graph to a numpy array
-
-        Parameters
-        ----------
-        graph: nx.classes.graph.Graph
-            Input networkx graph object
-
-        Returns
-        -------
-        np.ndarray
-            Numpy representation of the input graph
-        """
-        if not isinstance(graph, nx.classes.graph.Graph):
-            raise ValueError("Non nx graph object was given as input")
-        return nx.to_numpy_array(graph)
-    if not isinstance(graphs, list):
-        return single_networkx_to_dense(graphs)
-
-    return [single_networkx_to_dense(graph) for graph in graphs]
-
-
-def networkx_to_sparse(graphs, fmt: str = 'csr'):
-    """converts networkx graph to sparse graphs
-
-        Parameters
-        ---------
-        graphs: list or single nx.classes.graph.Graph
-            list of graphs or single to be converted to scipy sparse matrix/matrices
-        fmt: str, default="csr"
-            format of the scipy sparse matrix
-    """
-    def single_networkx_to_sparse(graph, fmt: str = 'csr'):
-        """INTERNAL HELPER FUNCTION
-        converts a single networkx graph to a scipy sparse matrix
-
-        Parameters
-        ----------
-        graph: nx.classes.graph.Graph
-            Input networkx graph
-        fmt: str,default="fmt"
-            scipy sparse matrix format
-
-        Returns
-        -------
-        sparse scipy matrix
-        """
-        if not isinstance(graph, nx.classes.graph.Graph):
-            raise ValueError(f'Got unknown object for conversion: {type(graph)}')
-        return nx.to_scipy_sparse_matrix(graph, format=fmt)
-
-    if not isinstance(graphs, list):
-        return single_networkx_to_sparse(graphs, fmt=fmt)
-
-    return [single_networkx_to_sparse(graph, fmt=fmt) for graph in graphs]
-
-
-def networkx_to_dgl(graphs, node_attrs=None, edge_attrs=None):
-    """convert networkx graphs to dgl graphs
-
-        Parameters
-        --------
-        graphs: list,
-            list or single networkx graphs to be converted
-        node_attrs: list, default=None
-            name of node attributes as list
-        edge_attrs: list, default=None
-            name of edge attributes as list
-
-        Returns
-        -------
-        dgl.DGLGraph
-    """
-
-    def single_networkx_to_dgl(graph: nx.classes.graph.Graph, node_attrs, edge_attrs):
-        """INTERNAL HELPER FUNCTION
-        convert a single networkx graph to a dgl graph
-
-        Parameters
-        ----------
-        graph: nx.classes.graph.Graph
-            Input networkx graph
-        node_attrs: list,default=None
-            Note attributes
-        edge_attrs: list,default=None
-            Edge attributes
-
-        Returns
-        -------
-            dgl.DGLGraph
-        """
-        assert_imported(["dgl"])
-        if not isinstance(graph, nx.classes.graph.Graph):
-            raise ValueError(f"Got unexpected type {type(graph)} for conversion")
-        if not nx.is_directed(graph):
-            graph = graph.to_directed()
-        if node_attrs or edge_attrs is None:
-            g = dgl.from_networkx(graph)
-        else:
-            g = dgl.from_networkx(graph, node_attrs=node_attrs, edge_attrs=edge_attrs)
-        return g
-
-    assert_imported(["dgl"])
-
-    if isinstance(graphs, np.ndarray):
-        graphs = [graphs[graph] for graph in range(graphs.shape[0])]
-    if not isinstance(graphs, list):
-        return single_networkx_to_dgl(graph=graphs, node_attrs=node_attrs, edge_attrs=edge_attrs)
-
-    return [single_networkx_to_dgl(graph, node_attrs=node_attrs, edge_attrs=edge_attrs)
-            for graph in graphs]
-
-
-def sparse_to_networkx(graphs):
-    """convert scipy sparse matrices to networkx graphs
-
-        Parameters
-        ---------
-        graphs:
-            list of sparse matrices or single sparse matrix
-    """
-
-    def single_sparse_to_networkx(graph):
-        """INTERNAL HELPER FUNCTION
-        convert single scipy sparse matrix to networkx graph
-
-        Parameters
-        ----------
-        graph:
-            Input graph as sparse scipy matrix
-
-        Returns
-        -------
-        nx.classes.graph.Graph
-        """
-        try:
-            return nx.from_scipy_sparse_matrix(graph)
-        except Exception as e:
-            print("Please check your input.\n"
-                  "This function only takes a single sparse matrix or a list of sparse matrices.")
-            raise e
-    if not isinstance(graphs, list):
-        return single_sparse_to_networkx(graphs)
-
-    return [single_sparse_to_networkx(graph) for graph in graphs]
-
-
-def dense_to_networkx(mtrx, adjacency_axis=0, feature_axis=1, feature_construction="features"):
-    """converts an array or list of arrays to a list of networkx graphs
-
-        Parameters
-        ---------
-        mtrx: list or np.ndarray
-            numpy matrices to be converted
-        adjacency_axis: int, default=0
-            position of the adjacency matrices
-        feature_axis: int, default=1
-            position of the feature matrices
-        feature_construction: str, default="features"
-            method of node feature construction, for more information see
-            get_dense_feature function
-    """
-
-    if isinstance(mtrx, np.ndarray):
-        mtrx = [mtrx[idx] for idx in range(mtrx.shape[0])]
-    if not isinstance(mtrx, list):
-        raise ValueError(f"Expected np.ndarray or list as input, got {type(mtrx)}")
-
-    graph_list = []
-    for item in mtrx:
-        if not isinstance(item, np.ndarray):
-            raise ValueError(f'Expected np.ndarray as input, got {type(mtrx)}')
-        networkx_graph = nx.from_numpy_matrix(A=item[:, :, adjacency_axis])
-        features = get_dense_feature(item, adjacency_axis, feature_axis, aggregation=feature_construction)
-        nx.set_node_attributes(networkx_graph, features, name="feat")
-        graph_list.append(networkx_graph)
-
-    mtrx_conv = graph_list
-
-    return mtrx_conv
-
-
-def get_dense_feature(matrix, adjacency_axis, feature_axis, aggregation="sum"):
-    """returns the features for a networkx graph
-
-        Parameters
-        ---------
-        matrix: np.matrix/np.ndarray
-            feature matrix
-        adjacency_axis: int
-            position of the adjacency matrix
-        feature_axis: int
-            position of the feature matrix
-        aggregation:
-            method of feature construction, sum gives a row-wise sum,
-            "mean" gives a row-wise mean, "node_degree" give a row-wise node-degree,
-            features returns the entire row as the feature vector
-    """
-    if aggregation == "sum":
-        features = np.sum(matrix[:, :, feature_axis], axis=1)
-        features = features.tolist()
-    elif aggregation == "mean":
-        features = (np.sum(matrix[:, :, feature_axis], axis=1)) / matrix.shape[0]
-        features = features.tolist()
-    elif aggregation == "node_degree":
-        features = np.count_nonzero(matrix[:, :, adjacency_axis], axis=1, keepdims=False)
-        features = features.tolist()
-    elif aggregation == "features":
-        features = matrix[:, :, feature_axis]
-        features = features.reshape((features.shape[0], -1))
-        features = features.tolist()
-    else:
-        raise KeyError('Only sum, mean, node_degree and all features are supported')
-
-    features = dict(enumerate(features, 0))
-
-    return features
-
-
-# todo: why is feature_axis needed here?
-def get_dense_edge_features(matrix, adjacency_axis, feature_axis):
-    """returns the features for an edge label dictionary
-
-        Parameters
-        ---------
-        matrix: np.matrix/np.ndarray
-            feature matrix
-        adjacency_axis: int
-            position of the adjacency matrix
-        feature_axis: int
-            position of the feature matrix
-    """
-    edge_feat = {}
-    for index, value in np.ndenumerate(matrix[:, :, adjacency_axis]):
-        conn_key = (str(index[0]), str(index[1]))
-        key_val = {conn_key: value}
-        edge_feat.update(key_val)
-    return edge_feat
-
-
-def dense_to_sparse(graphs, m_type="coo_matrix", adjacency_axis=None, feature_axis=None):
-    """converts numpy dense matrices to scipy sparse matrices
-
-        Parameters
-        ---------
-        graphs: list or np.ndarray or np.matrix
-            graphs in dense format which are to be converted
-        m_type: str, default="coo_matrix"
-            matrix format for the scipy sparse matrices
-        adjacency_axis: int, default=None
-            position of the adjacency matrix
-        feature_axis: int, default=None
-            position of the feature matrix
-
-
-        Returns
-        -------
-        list,list
-
-    """
-    if m_type not in sparse_types:
-        raise KeyError('Your desired output format is not supported.\nPlease check your output format.')
-
-    if isinstance(graphs, np.ndarray):
-        graphs = [graphs[idx] for idx in range(graphs.shape[0])]
-
-    if not isinstance(graphs, list):
-        raise ValueError("Input needs to be a numpy array or a list of arrays.")
-
-    graph_list = []
-    feature_list = []
-    initial_dim = np.ndim(graphs[0])
-    if initial_dim not in [2, 3]:
-        raise ValueError(f"Got unexpected graph shape: {initial_dim}")
-    for graph in graphs:
-        if np.ndim(graph) != initial_dim:
-            raise ValueError("All graphs must have same shape.")
-        if initial_dim == 2:
-            graph_list.append(sparse_types[m_type](graph))
-        else:
-            sparse_graph = sparse_types[m_type](graph[:, :, adjacency_axis])
-            sparse_features = sparse_types[m_type](graph[:, :, feature_axis])
-            feature_list.append(sparse_features)
-            graph_list.append(sparse_graph)
-
-    return graph_list, feature_list
+def dense_to_networkx(graphs: np.ndarray, adjacency_axis: int = None, feature_axis=None):
+    if adjacency_axis is None:
+        warnings.warn("No adjacency passed. Guessing that adjacency is in first channel...")
+        adjacency_axis=0
+    nx_graphs = [nx.from_numpy_array(graphs[i, ..., adjacency_axis]) for i in range(graphs.shape[0])]
+    if feature_axis is not None:
+        raise NotImplementedError("This feature is not implemented yet.")
+    return nx_graphs
 
 
 def dense_to_dgl(graphs, adjacency_axis=None, feature_axis=None):
@@ -395,39 +92,6 @@ def convert_matrix(current_graph_mtrx, current_features):
     return matrices
 
 
-def sparse_to_dgl(graphs, adjacency_axis=0, feature_axis=1):
-    """convert sparse matrices to dgl graphs
-
-        Parameters
-        ---------
-        graphs: tuple, list, np.ndarray or np.matrix
-            tuple consisting of two lists
-        adjacency_axis: int, default=0
-            position of the adjacency matrix
-        feature_axis: int, default=1
-            position of the feature matrix
-    """
-    assert_imported(["dgl"])
-
-    if isinstance(graphs, np.ndarray):
-        graphs = [graphs[idx] for idx in range(graphs.shape[0])]
-
-    if isinstance(graphs, tuple):
-        graph_list = []
-        for adj, feat in zip(graphs[adjacency_axis], graphs[feature_axis]):
-            g = dgl.from_scipy(sp_mat=adj)
-            graph_list.append(g)
-    elif isinstance(graphs, list):
-        graph_list = []
-        for adj in graphs:
-            g = dgl.from_scipy(sp_mat=adj)
-            graph_list.append(g)
-    else:
-        raise Exception('Expected tuple, list or 1d-array as input.')
-
-    return graph_list
-
-
 def dgl_to_dense(graphs, in_fmt="csr"):
     """turns dgl graphs into dense matrices
 
@@ -470,36 +134,6 @@ def dgl_to_sparse(graphs, fmt="csr"):
     return graph_list
 
 
-def dgl_to_networkx(graphs, node_attrs=None, edge_attrs=None):
-    """turns dgl graph into networkx graphs
-
-        Parameters
-        ---------
-        graphs: list
-            list of dgl graphs to be converted to networkx graphs
-        node_attrs: list, default=None
-            Node attributes as a list of strings
-        edge_attrs: list, default=None
-            Edge attributes as a list of strings
-    """
-    assert_imported(["dgl"])
-
-    if node_attrs is None:
-        node_attrs = ["feat"]
-    if edge_attrs is None:
-        edge_attrs = ["weight"]
-
-    # check input type
-    if not isinstance(graphs, list):
-        raise Exception('Input graphs need to be in list format')
-
-    graph_list = []
-    for graph in graphs:
-        nx_graph = dgl.DGLGraph.to_networkx(graph, node_attrs, edge_attrs)
-        graph_list.append(nx_graph)
-    return graph_list
-
-
 def check_dgl(graphs, adjacency_axis=None, feature_axis=None):
     """Checks the input and converts it to dgl format
 
@@ -518,73 +152,12 @@ def check_dgl(graphs, adjacency_axis=None, feature_axis=None):
         raise TypeError('can only handle np arrays or lists as input')
 
     if isinstance(graphs, list) or np.ndim(graphs) == 1:
-        if isinstance(graphs[0], nx.classes.graph.Graph):
-            dgl_graphs = networkx_to_dgl(graphs)
-        elif isinstance((graphs[0]), dgl.DGLGraph):
-            dgl_graphs = graphs
-        else:
-            try:
-                dgl_graphs = sparse_to_dgl(graphs)
-            except Exception as e:
-                print('Can only handle ndarrays of networkx graphs or scipy matrices')
-                raise e
+        if not isinstance((graphs[0]), dgl.DGLGraph):
+            raise ValueError("Expected list of dglGraph or dense matrix")
+        dgl_graphs = graphs
     elif np.ndim(graphs) > 1:
         dgl_graphs = dense_to_dgl(graphs, adjacency_axis, feature_axis)
     else:
-        raise ValueError('numpy matrix must have between one and four dimensions')
+        raise ValueError('numpy matrix must have one or four dimensions')
 
     return dgl_graphs
-
-
-conversion_functions = {
-    ("networkx", "dense"): networkx_to_dense,
-    ("networkx", "sparse"): networkx_to_sparse,
-    ("networkx", "dgl"): networkx_to_dgl,
-    ("dense", "networkx"): dense_to_networkx,
-    ("dense", "sparse"): dense_to_sparse,
-    ("dense", "dgl"): dense_to_dgl,
-    ("sparse", "networkx"): sparse_to_networkx,
-    ("sparse", "dense"): sparse_to_dense,
-    ("sparse", "dgl"): sparse_to_dgl,
-    ("dgl", "networkx"): dgl_to_networkx,
-    ("dgl", "dense"): dgl_to_dense,
-    ("dgl", "sparse"): dgl_to_sparse
-}
-
-
-def convert_graphs(graphs, input_format="networkx", output_format="stellargraph"):
-    """Convert graphs from one format to the other.
-
-        Parameters
-        ----------
-        graphs : graphs
-            list of graphs, or np.ndarray/np.matrix
-
-        input_format : str, default="networkx"
-            format of the graphs to be transformed
-
-        output_format : str, default="stellargraph"
-            desired output format of the graph(s)
-
-        Returns
-        -------
-        list, np.ndarray, np.matrix
-            The transformed matrices as a list
-
-        Notes
-        -----
-        Output format is referenced by package name, written in lowercase letters
-
-        """
-    if input_format == output_format:
-        warnings.warn('Graphs already in desired format.')
-
-        return graphs
-
-    if (input_format, output_format) not in conversion_functions.keys():
-        raise TypeError('Your desired conversion is not supported.'
-                        'Please check your in- and output format')
-
-    trans_graphs = conversion_functions[(input_format, output_format)](graphs)
-
-    return trans_graphs
diff --git a/photonai_graph/GraphEmbedding/graph_embedding_base.py b/photonai_graph/GraphEmbedding/graph_embedding_base.py
index 8517517..9a1e7ff 100644
--- a/photonai_graph/GraphEmbedding/graph_embedding_base.py
+++ b/photonai_graph/GraphEmbedding/graph_embedding_base.py
@@ -45,10 +45,10 @@ def __init__(self,
     def fit(self, X, y):
         return self
 
-    @staticmethod
-    def _calculate_embedding(embedding: StaticGraphEmbedding, matrices: np.ndarray) -> np.ndarray:
+    def _calculate_embedding(self, embedding: StaticGraphEmbedding, matrices: np.ndarray) -> np.ndarray:
         """Returns embedding of graphs"""
-        graphs = dense_to_networkx(matrices)  # convert matrices
+        # convert matrices
+        graphs = dense_to_networkx(matrices, adjacency_axis=self.adjacency_axis)
         embedding_list = []
 
         for graph in graphs:
diff --git a/photonai_graph/GraphIO.py b/photonai_graph/GraphIO.py
deleted file mode 100644
index 8cea78f..0000000
--- a/photonai_graph/GraphIO.py
+++ /dev/null
@@ -1,119 +0,0 @@
-import os
-
-from networkx.drawing.nx_pydot import write_dot, read_dot
-import networkx as nx
-import numpy as np
-
-output_formats = {
-    "dot": write_dot,
-    "AdjacencyList": nx.write_adjlist,
-    "MultilineAdjacencyList": nx.write_multiline_adjlist,
-    "EdgeList": nx.write_edgelist,
-    "WeightedEdgeList": nx.write_weighted_edgelist,
-    "GEXF": nx.write_gexf,
-    "pickle": nx.write_gpickle,
-    "GLM": nx.write_gml,
-    "GraphML": nx.write_graphml,
-    "GraphML-XML": nx.write_graphml_xml,
-    "GraphML-LXML": nx.write_graphml_lxml,
-    "graph6": nx.write_graph6,
-    "PAJEK": nx.write_pajek
-}
-
-input_formats = {
-    "dot": read_dot,
-    "AdjacencyList": nx.read_adjlist,
-    "MultilineAdjacencyList": nx.read_multiline_adjlist,
-    "EdgeList": nx.read_edgelist,
-    "WeightedEdgeList": nx.read_edgelist,
-    "GEXF": nx.read_gexf,
-    "pickle": nx.read_gpickle,
-    "GML": nx.read_gml,
-    "GraphML": nx.read_graphml,
-    "graph6": nx.read_graph6,
-    "PAJEK": nx.read_pajek
-}
-
-
-def save_networkx_to_file(graphs, path, output_format="dot", ids=None):
-    """Saves networkx graph(s) to a file
-
-        Parameters
-        ----------
-        graphs: a list of networkx graphs or single networkx graph
-            list of graphs you want to save
-        path: str
-            path where to save the data as a string
-        output_format: str
-            output format in which the graphs should be saved. See output_formats
-            at top of the file for more information on valid output formats
-        ids: list, default=None
-            a list of ids after which to name each graph in the file. If no list is
-            specified the graphs are just numbered as graph_x
-
-    """
-    def save_single_networkx_to_file(graph, path, output_format="dot"):
-        """internal helper function
-
-        Parameters
-        ----------
-        graph
-            networkx graph object
-        path
-            path to save the graph to
-        output_format
-            desired output format
-        """
-        if not isinstance(graph, nx.classes.graph.Graph):
-            raise ValueError(f"Got unknown object for serialization: {type(graph)}")
-        output_formats[output_format](graph, path)
-
-    if output_format not in output_formats:
-        raise ValueError("The output format is not supported. Please check your output format.")
-
-    if not isinstance(graphs, list):
-        return save_single_networkx_to_file(graph=graphs, path=path, output_format=output_format)
-
-    # Check if we have got a list of ids
-    if ids is None or not isinstance(ids, list):
-        ids = np.arange(len(graphs))
-
-    # check if id and graphs they have equal length
-    if len(graphs) != len(ids):
-        raise ValueError(
-            'The photonai_graph ID list and the list of Graphs are not of equal length. '
-            'Please ensure that they have equal length.')
-
-    for graph, i in zip(graphs, ids):
-        graph_filename = "graph_" + str(i)
-        graph_path = os.path.join(path, graph_filename)
-        save_single_networkx_to_file(graph=graph, path=graph_path, output_format=output_format)
-
-
-def load_file_to_networkx(path, input_format="dot"):
-    """load graph into networkx from a file
-
-        Parameters
-        ----------
-        path: list, str
-            path(s) where graphs are stored
-        input_format:
-            format in which these graphs are stored
-
-        Returns
-        -------
-        list
-            List of loaded networkx graphs
-    """
-    if isinstance(path, str):
-        path = [path]
-
-    graph_list = []
-    if input_format not in input_formats:
-        raise KeyError("Input format is not supported right now.")
-
-    for graph in path:
-        g = input_formats[input_format](graph)
-        graph_list.append(g)
-
-    return graph_list
diff --git a/photonai_graph/GraphKernels/GrakelTransformer.py b/photonai_graph/GraphKernels/GrakelTransformer.py
new file mode 100644
index 0000000..f629735
--- /dev/null
+++ b/photonai_graph/GraphKernels/GrakelTransformer.py
@@ -0,0 +1,59 @@
+from sklearn.base import BaseEstimator, TransformerMixin
+
+from grakel import VertexHistogram, EdgeHistogram, ShortestPath, GraphletSampling, RandomWalk, NeighborhoodHash,\
+    WeisfeilerLehman, NeighborhoodSubgraphPairwiseDistance, LovaszTheta, SvmTheta, OddSth, GraphHopper, Propagation,\
+    PyramidMatch, SubgraphMatching, MultiscaleLaplacian, CoreFramework
+
+
+class GrakelTransformer(BaseEstimator, TransformerMixin):
+
+    transformations = {
+        "VertexHistogram": VertexHistogram,
+        "EdgeHistogram": EdgeHistogram,
+        "ShortestPath": ShortestPath,
+        "GraphletSampling": GraphletSampling,
+        "RandomWalk": RandomWalk,
+        "NeighborhoodHash": NeighborhoodHash,
+        "WeisfeilerLehman": WeisfeilerLehman,
+        "NeighborhoodSubgraphPairwiseDistance": NeighborhoodSubgraphPairwiseDistance,
+        "LovaszTheta": LovaszTheta,
+        "SvmTheta": SvmTheta,
+        "OddSth": OddSth,
+        "GraphHopper": GraphHopper,
+        "Propagation": Propagation,
+        "PyramidMatch": PyramidMatch,
+        "SubgraphMatching": SubgraphMatching,
+        "MultiscaleLaplacian": MultiscaleLaplacian,
+        "CoreFramework": CoreFramework
+    }
+
+    def __init__(self, transformation: str = None, **kwargs):
+        """A transformer class for transforming graphs in grakel format.
+
+        Parameters
+        ----------
+        args
+            Transformer arguments
+        transformation
+            The transformation requested by the user
+        kwargs
+            Transformer arguments
+        """
+        if transformation not in self.transformations.keys():
+            raise ValueError(f"The requested transformation {transformation} was not found.")
+        self.transformation_class = self.transformations[transformation]
+        for key in kwargs.keys():
+            setattr(self, key, kwargs[key])
+        self.kwargs_keys = kwargs.keys()
+        self.transformation = None
+
+    def fit(self, X, y=None):
+        kwargs = {k: getattr(self, k) for k in self.kwargs_keys}
+        self.transformation = self.transformation_class(**kwargs)
+        self.transformation.fit(X, y)
+        return self
+
+    def transform(self, X):
+        if self.transformation is None:
+            raise ValueError("Transformation was not fit yet.")
+        return self.transformation.transform(X)
diff --git a/photonai_graph/GraphKernels/grakel_adapter.py b/photonai_graph/GraphKernels/grakel_adapter.py
index 7bb4535..0d3cfc1 100644
--- a/photonai_graph/GraphKernels/grakel_adapter.py
+++ b/photonai_graph/GraphKernels/grakel_adapter.py
@@ -1,6 +1,6 @@
 from sklearn.base import BaseEstimator, ClassifierMixin
-from photonai_graph.GraphConversions import get_dense_feature, get_dense_edge_features
 from photonai_graph.util import assert_imported
+import numpy as np
 try:
     from grakel import graph
     import grakel
@@ -91,8 +91,8 @@ def construct_node_features(self, matrices):
         """construct node features from the feature matrix"""
         label_list = []
         for mtrx in range(matrices.shape[0]):
-            feat = get_dense_feature(matrices[mtrx, :, :, :], adjacency_axis=self.adjacency_axis,
-                                     feature_axis=self.feature_axis, aggregation=self.node_feature_construction)
+            feat = self.get_dense_feature(matrices[mtrx, :, :, :], adjacency_axis=self.adjacency_axis,
+                                          feature_axis=self.feature_axis, aggregation=self.node_feature_construction)
             label_list.append(feat)
 
         return label_list
@@ -101,8 +101,63 @@ def construct_edge_features(self, matrices):
         """construct edge features from the feature or adjacency matrix"""
         label_list = []
         for mtrx in range(matrices.shape[0]):
-            feat = get_dense_edge_features(matrices[mtrx, :, :, :], adjacency_axis=self.adjacency_axis,
-                                           feature_axis=self.feature_axis)
+            feat = self.get_dense_edge_features(matrices[mtrx, :, :, :], adjacency_axis=self.adjacency_axis,
+                                                feature_axis=self.feature_axis)
             label_list.append(feat)
 
         return label_list
+
+    @staticmethod
+    def get_dense_edge_features(matrix, adjacency_axis, feature_axis):
+        """returns the features for an edge label dictionary
+            Parameters
+            ---------
+            matrix: np.matrix/np.ndarray
+                feature matrix
+            adjacency_axis: int
+                position of the adjacency matrix
+            feature_axis: int
+                position of the feature matrix
+        """
+        edge_feat = {}
+        for index, value in np.ndenumerate(matrix[:, :, adjacency_axis]):
+            conn_key = (str(index[0]), str(index[1]))
+            key_val = {conn_key: value}
+            edge_feat.update(key_val)
+        return edge_feat
+
+    @staticmethod
+    def get_dense_feature(matrix, adjacency_axis, feature_axis, aggregation="sum"):
+        """returns the features for a networkx graph
+            Parameters
+            ---------
+            matrix: np.matrix/np.ndarray
+                feature matrix
+            adjacency_axis: int
+                position of the adjacency matrix
+            feature_axis: int
+                position of the feature matrix
+            aggregation:
+                method of feature construction, sum gives a row-wise sum,
+                "mean" gives a row-wise mean, "node_degree" give a row-wise node-degree,
+                features returns the entire row as the feature vector
+        """
+        if aggregation == "sum":
+            features = np.sum(matrix[:, :, feature_axis], axis=1)
+            features = features.tolist()
+        elif aggregation == "mean":
+            features = (np.sum(matrix[:, :, feature_axis], axis=1)) / matrix.shape[0]
+            features = features.tolist()
+        elif aggregation == "node_degree":
+            features = np.count_nonzero(matrix[:, :, adjacency_axis], axis=1, keepdims=False)
+            features = features.tolist()
+        elif aggregation == "features":
+            features = matrix[:, :, feature_axis]
+            features = features.reshape((features.shape[0], -1))
+            features = features.tolist()
+        else:
+            raise KeyError('Only sum, mean, node_degree and all features are supported')
+
+        features = dict(enumerate(features, 0))
+
+        return features
diff --git a/photonai_graph/GraphMeasureTransform.py b/photonai_graph/GraphMeasureTransform.py
index f021772..fcb9362 100644
--- a/photonai_graph/GraphMeasureTransform.py
+++ b/photonai_graph/GraphMeasureTransform.py
@@ -24,22 +24,24 @@
 # TODO: make documentation for every single method
 
 import networkx
-import dask
-from dask.diagnostics import ProgressBar
+from tqdm.contrib.concurrent import thread_map
+from functools import partial
 from sklearn.base import BaseEstimator, TransformerMixin
-from photonai_graph.GraphConversions import dense_to_networkx
 import networkx as nx
 import pandas as pd
 import numpy as np
 import json
 import os
 
+from photonai_graph.GraphConversions import dense_to_networkx
+
 
 class GraphMeasureTransform(BaseEstimator, TransformerMixin):
     _estimator_type = "transformer"
 
     def __init__(self,
                  graph_functions: dict = None,
+                 adjacency_axis: int = 0,
                  logs: str = None,
                  n_processes: int = 1):
         """The GraphMeasureTransform class is a class for extracting graph measures from graphs.
@@ -52,6 +54,8 @@ def __init__(self,
             a dict of graph functions to calculate with keys as the networkx function name and a dict of the arguments
             as the value. In this second dictionary, the keys are the functions arguments and values are the desired
             values for the argument.
+        adjacency_axis: int,default=0
+            Channel index for adjacency
         logs: str,default=None
             path to the log data
         n_processes: str,default=None
@@ -70,20 +74,20 @@ def __init__(self,
         if graph_functions is None:
             graph_functions = {"global_efficiency": {}, "average_node_connectivity": {}}
         self.graph_functions = graph_functions
+        self.adjacency_axis = adjacency_axis
 
-        if logs:
-            self.logs = logs
-        else:
+        self.logs = logs
+        if not logs:
             self.logs = os.getcwd()
 
     def fit(self, X, y):
         return self
 
     def _inner_transform(self, X):
-        X_transformed = []
+        x_transformed = []
 
         if isinstance(X, np.ndarray) or isinstance(X, np.matrix):
-            graphs = dense_to_networkx(X, adjacency_axis=0)
+            graphs = dense_to_networkx(X, adjacency_axis=self.adjacency_axis)
         elif isinstance(X, list) and min([isinstance(g, nx.classes.graph.Graph) for g in X]):
             graphs = X
         else:
@@ -95,27 +99,21 @@ def _inner_transform(self, X):
         with open(measure_json, 'r') as measure_json_file:
             measure_j = json.load(measure_json_file)
 
-        # ToDo: write unit test for parallelization
-
         if self.n_processes > 1:
-            task_list = []
-            for graph in graphs:
-                tmp = dask.delayed(self._compute_graph_metrics)(graph, self.graph_functions, measure_j)
-                task_list.append(tmp)
-            with ProgressBar():
-                X_transformed = list(dask.compute(*task_list, num_workers=self.n_processes, scheduler='threads'))
+            pfn = partial(self._compute_graph_metrics, graph_functions=self.graph_functions, measure_j=measure_j)
+            x_transformed = thread_map(pfn, graphs, max_workers=self.n_processes)
         else:
             for graph in graphs:
                 measure_list_graph = self._compute_graph_metrics(graph, self.graph_functions, measure_j)
-                X_transformed.append(measure_list_graph)
+                x_transformed.append(measure_list_graph)
 
         for c_measure in range(len(self.graph_functions)):
-            expected_values = max([len(graph[c_measure]) for graph in X_transformed])
-            for graph in X_transformed:
+            expected_values = max([len(graph[c_measure]) for graph in x_transformed])
+            for graph in x_transformed:
                 if len(graph[c_measure]) < expected_values:
                     graph[c_measure] = [np.NAN] * expected_values
 
-        return X_transformed
+        return x_transformed
 
     def transform(self, X):
         X_transformed = self._inner_transform(X)
@@ -131,8 +129,6 @@ def transform(self, X):
         return X_transformed
 
     def _compute_graph_metrics(self, graph, graph_functions, measure_j):
-        if networkx.classes.function.is_empty(graph):
-            print("Graph is empty")
         measure_list_graph = []
         for key, value in graph_functions.items():
             measure_list = list()
diff --git a/photonai_graph/GraphUtilities.py b/photonai_graph/GraphUtilities.py
index 8aff4a9..0815d3c 100644
--- a/photonai_graph/GraphUtilities.py
+++ b/photonai_graph/GraphUtilities.py
@@ -10,9 +10,15 @@
 from scipy import stats
 from scipy import sparse
 import matplotlib.pyplot as plt
+import scipy.io as sio
+try:
+    import mat73
+except ImportError as e:  # pragma: no cover
+    pass
 
+from photonai_graph.util import assert_imported
 
-def draw_connectogram(graph, edge_rad=None, colorscheme=None, nodesize=None,
+def draw_connectogram(graph, connection_style="arc3", colorscheme=None, nodesize=None,
                       node_shape='o', weight=None, path=None, show=True):
     """This functions draws a connectogram, from a graph.
 
@@ -20,8 +26,8 @@ def draw_connectogram(graph, edge_rad=None, colorscheme=None, nodesize=None,
     ----------
     graph: nx.class.graph.Graph
         input graph, a single networkx graph
-    edge_rad:
-        edge radius, controlling the curvature of the drawn edges
+    connection_style:
+        connection style, controlling the style of the drawn edges
     colorscheme:
         colormap for drawing the connectogram
     nodesize: int
@@ -48,12 +54,12 @@ def draw_connectogram(graph, edge_rad=None, colorscheme=None, nodesize=None,
         elarge = [(u, v) for (u, v, d) in graph.edges(data=True) if d['weight'] > weight]
         esmall = [(u, v) for (u, v, d) in graph.edges(data=True) if d['weight'] <= weight]
         nx.draw_networkx_edges(graph, pos, edgelist=elarge,
-                               connectionstyle=edge_rad)
+                               connectionstyle=connection_style)
         nx.draw_networkx_edges(graph, pos, edgelist=esmall,
-                               alpha=0.5, edge_color='b', style='dashed', connectionstyle=edge_rad)
+                               alpha=0.5, edge_color='b', style='dashed', connectionstyle=connection_style)
 
     else:
-        nx.draw_networkx_edges(graph, pos, connectionstyle=edge_rad)
+        nx.draw_networkx_edges(graph, pos, connectionstyle=connection_style)
 
     if show:
         plt.show()
@@ -367,7 +373,9 @@ def individual_ztransform(matrx, adjacency_axis=0):
 
 
 def individual_fishertransform(matrx, adjacency_axis=0):
-    """applies a fisher transformation individually to each connectivity matrix in an array
+    """applies a fisher transformation individually to each connectivity matrix in an array.
+        all values need to be finite (non nans) as this would introduce complex numbers, which
+        can not be handled by other methods.
 
         Parameters
         ----------
@@ -392,12 +400,15 @@ def individual_fishertransform(matrx, adjacency_axis=0):
     transformed_matrices = []
     if np.ndim(matrx) != 4:
         raise ValueError("Please check input dimension of your graph data.")
+    if not np.isfinite(matrx).all():
+        raise ValueError("For a fisher transform graph data should only include finite values, no nans")
     for i in range(matrx.shape[0]):
         matrix = matrx[i, :, :, adjacency_axis].copy()
         matrix = np.arctanh(matrix)
         transformed_matrices.append(matrix)
 
     transformed_matrices = np.asarray(transformed_matrices)
+    transformed_matrices = transformed_matrices[:, :, :, np.newaxis]
 
     return transformed_matrices
 
@@ -489,3 +500,23 @@ def check_asteroidal(graph: Union[nx.Graph, List[nx.Graph]]) -> Union[Union[List
                          'Please check your inputs.')
 
     return graph_answer
+
+
+def load_conn(path='', mtrx_name='matrix', subject_dim=3, modality_dim=2):
+    """loads matlab 4d connectivity matrix from matlab file"""
+    assert_imported(['mat73'])
+    try:
+        matfile = sio.loadmat(path)
+        mtrx = matfile[mtrx_name]
+        mtrx = np.moveaxis(mtrx, [subject_dim, modality_dim], [0, 3])
+    except Exception as ex1:
+        try:
+            matfile = mat73.loadmat(path)
+            mtrx = matfile[mtrx_name]
+            mtrx = np.moveaxis(mtrx, [subject_dim, modality_dim], [0, 3])
+        except Exception as ex2:
+            raise Exception(ex1, ex2)
+
+    return mtrx
+
+
diff --git a/photonai_graph/NeuralNets/GATModel.py b/photonai_graph/NeuralNets/GATModel.py
index 68c55d6..47a8ee8 100644
--- a/photonai_graph/NeuralNets/GATModel.py
+++ b/photonai_graph/NeuralNets/GATModel.py
@@ -1,9 +1,12 @@
 from typing import List
 
-import dgl
-import torch.nn as nn
 import numpy as np
-from dgl.nn.pytorch import GATConv
+try:
+    import dgl
+    import torch.nn as nn
+    from dgl.nn.pytorch import GATConv
+except ImportError:
+    pass
 
 from photonai_graph.NeuralNets.dgl_base import DGLClassifierBaseModel, DGLRegressorBaseModel
 
diff --git a/photonai_graph/NeuralNets/GCNModel.py b/photonai_graph/NeuralNets/GCNModel.py
index b2b24f7..974cf3a 100644
--- a/photonai_graph/NeuralNets/GCNModel.py
+++ b/photonai_graph/NeuralNets/GCNModel.py
@@ -1,8 +1,11 @@
-import dgl
 import numpy as np
-import torch.nn as nn
-import torch.nn.functional as F
-from dgl.nn.pytorch import GraphConv
+try:
+    import dgl
+    import torch.nn as nn
+    import torch.nn.functional as F
+    from dgl.nn.pytorch import GraphConv
+except ImportError:
+    pass
 
 from photonai_graph.NeuralNets.dgl_base import DGLRegressorBaseModel, DGLClassifierBaseModel
 
diff --git a/photonai_graph/NeuralNets/NNUtilities.py b/photonai_graph/NeuralNets/NNUtilities.py
index b14def9..8ef205a 100644
--- a/photonai_graph/NeuralNets/NNUtilities.py
+++ b/photonai_graph/NeuralNets/NNUtilities.py
@@ -1,5 +1,8 @@
-import torch
-from torch.utils.data import Dataset
+try:
+    import torch
+    from torch.utils.data import Dataset
+except ImportError:
+    pass
 
 
 class CustomDataset(Dataset):
diff --git a/photonai_graph/NeuralNets/SGCModel.py b/photonai_graph/NeuralNets/SGCModel.py
index d10a50a..f577480 100644
--- a/photonai_graph/NeuralNets/SGCModel.py
+++ b/photonai_graph/NeuralNets/SGCModel.py
@@ -1,7 +1,10 @@
-import dgl
 import numpy as np
-import torch.nn as nn
-from dgl.nn.pytorch import GraphConv, SGConv, GATConv
+try:
+    import dgl
+    import torch.nn as nn
+    from dgl.nn.pytorch import GraphConv, SGConv, GATConv
+except ImportError:
+    pass
 
 from photonai_graph.NeuralNets.dgl_base import DGLClassifierBaseModel, DGLRegressorBaseModel
 
diff --git a/photonai_graph/photonai_graph.json b/photonai_graph/photonai_graph.json
index e3a96cd..daa222c 100644
--- a/photonai_graph/photonai_graph.json
+++ b/photonai_graph/photonai_graph.json
@@ -83,72 +83,8 @@
       "photonai_graph.GraphKernels.grakel_adapter.GrakelAdapter",
       "Transformer"
    ],
-   "VertexHistogram": [
-      "grakel.VertexHistogram",
-      "Transformer"
-   ],
-   "EdgeHistogram": [
-      "grakel.EdgeHistogram",
-      "Transformer"
-   ],
-   "ShortestPath": [
-      "grakel.ShortestPath",
-      "Transformer"
-   ],
-   "GraphletSampling": [
-      "grakel.GraphletSampling",
-      "Transformer"
-   ],
-   "RandomWalk": [
-      "grakel.RandomWalk",
-      "Transformer"
-   ],
-   "NeighborhoodHash": [
-      "grakel.NeighborhoodHash",
-      "Transformer"
-   ],
-   "WeisfeilerLehman": [
-      "grakel.WeisfeilerLehman",
-      "Transformer"
-   ],
-   "NeighborhoodSubgraphPairwiseDistance": [
-      "grakel.NeighborhoodSubgraphPairwiseDistance",
-      "Transformer"
-   ],
-   "LovaszTheta": [
-      "grakel.LovaszTheta",
-      "Transformer"
-   ],
-   "SvmTheta": [
-      "grakel.SvmTheta",
-      "Transformer"
-   ],
-   "OddSth": [
-      "grakel.OddSth",
-      "Transformer"
-   ],
-   "GraphHopper": [
-      "grakel.GraphHopper",
-      "Transformer"
-   ],
-   "Propagation": [
-      "grakel.Propagation",
-      "Transformer"
-   ],
-   "PyramidMatch": [
-      "grakel.PyramidMatch",
-      "Transformer"
-   ],
-   "SubgraphMatching": [
-      "grakel.SubgraphMatching",
-      "Transformer"
-   ],
-   "MultiscaleLaplacian": [
-      "grakel.MultiscaleLaplacian",
-      "Transformer"
-   ],
-   "CoreFramework": [
-      "grakel.CoreFramework",
+   "GrakelTransformer": [
+      "photonai_graph.GraphKernels.GrakelTransformer.GrakelTransformer",
       "Transformer"
    ],
    "CofluctTransform": [
diff --git a/setup.py b/setup.py
index 78f0a0e..01961d4 100644
--- a/setup.py
+++ b/setup.py
@@ -18,7 +18,7 @@
 within the PHOTON framework. The module provides a range of graph machine learning algorithms, along with methods for constructing graphs.
 """,
     author='PHOTON Team',
-    author_email='v_hols01@uni-muenster.de',
+    author_email='hahnt@uni-muenster.de',
     url='https://github.com/wwu-mmll/photonai_graph.git',
     download_url='https://github.com/wwu-mmll/photonai_graph/archive/' + __version__ + '.tar.gz',
     keywords=['machine learning', 'deep learning', 'graph convolutional neural networks', 'graphs'],


Test patch:
diff --git a/test/constructor_tests/ho_coords.csv b/test/constructor_tests/ho_coords.csv
new file mode 100644
index 0000000..f7a14b8
--- /dev/null
+++ b/test/constructor_tests/ho_coords.csv
@@ -0,0 +1,111 @@
+     -9.81,    -19.57,      8.88
+    -13.54,      6.86,     14.24
+    -24.98,     -1.02,      3.24
+    -18.28,     -7.34,      1.35
+    -25.21,    -25.81,     -9.14
+    -23.16,     -4.72,    -14.71
+     -8.03,      8.75,     -5.81
+     11.55,    -18.97,      9.19
+     14.84,      7.41,     15.21
+     26.36,      0.46,      3.36
+     18.78,     -4.33,      1.47
+     27.21,    -23.35,     -9.68
+     23.34,     -4.17,    -14.21
+      9.47,      8.73,     -5.27
+     26.04,     52.63,     10.98
+    -24.76,     53.01,     10.36
+     36.99,      1.59,      2.32
+    -34.94,      0.47,      3.09
+     14.68,     19.58,     59.48
+    -14.37,     17.46,     59.43
+     40.07,     19.32,     44.86
+    -37.74,     18.01,     45.42
+     52.62,     27.79,      9.93
+    -50.00,     28.79,     10.78
+     52.19,     15.13,     18.53
+    -50.24,     15.09,     17.93
+     33.71,    -11.47,     52.54
+    -33.81,    -11.80,     51.46
+     41.62,     13.18,    -28.17
+    -40.66,     11.27,    -27.75
+     59.40,     -1.36,     -6.46
+    -56.59,     -4.80,     -4.31
+     60.89,    -22.95,      4.31
+    -61.32,    -27.38,      5.66
+     59.40,     -2.14,    -21.95
+    -58.58,     -4.65,    -19.76
+     61.54,    -22.52,    -11.02
+    -61.41,    -28.07,     -9.63
+     58.64,    -49.42,      3.94
+    -57.44,    -53.25,      3.19
+     47.61,     -3.73,    -39.89
+    -47.93,     -5.28,    -37.90
+     54.95,    -23.45,    -26.80
+    -53.14,    -27.97,    -24.53
+     55.96,    -49.56,    -15.27
+    -51.04,    -54.29,    -14.58
+     39.43,    -26.09,     55.03
+    -39.10,    -28.01,     54.35
+     29.49,    -48.50,     62.38
+    -28.87,    -49.88,     60.26
+     59.16,    -27.55,     40.49
+    -57.30,    -33.90,     39.44
+     55.62,    -40.54,     36.22
+    -55.44,    -47.56,     35.31
+     52.34,    -52.39,     35.82
+    -48.90,    -55.34,     33.16
+     33.99,    -72.42,     41.38
+    -31.25,    -74.00,     41.40
+     46.28,    -75.19,      0.31
+    -45.30,    -76.22,      0.53
+     12.68,    -74.99,     11.11
+    -11.48,    -76.29,     10.88
+      4.90,     41.31,    -17.77
+     -6.38,     40.57,    -16.11
+      5.63,     -2.45,     61.56
+     -6.99,     -2.33,     57.90
+      4.48,     19.08,    -11.51
+     -6.03,     18.50,    -13.68
+      7.41,     35.48,     26.33
+     -7.82,     35.88,     23.74
+      5.27,     18.84,     24.68
+     -6.26,     18.45,     25.45
+      6.73,    -35.48,     31.13
+     -7.13,    -37.14,     30.01
+      9.07,    -58.67,     41.57
+     -9.03,    -60.04,     38.78
+      8.74,    -79.68,     30.79
+     -9.54,    -81.23,     28.81
+     29.07,     23.16,    -13.80
+    -28.68,     23.99,    -13.92
+     20.95,     -8.89,    -28.38
+    -19.71,     -9.45,    -28.53
+     21.00,      0.00,    -21.50
+     21.82,    -30.04,    -14.79
+    -19.23,    -33.47,    -14.76
+     13.45,    -64.20,     -3.06
+    -12.40,    -65.53,     -3.87
+     31.47,     -4.07,    -41.36
+    -29.78,     -4.55,    -41.42
+     36.75,    -24.19,    -26.11
+    -35.12,    -30.23,    -23.47
+     35.94,    -50.03,    -15.07
+    -33.56,    -54.89,    -14.43
+     27.65,    -75.85,     -9.76
+    -25.73,    -77.45,    -11.04
+     40.56,     18.96,      9.13
+    -37.60,     19.06,      9.01
+     48.71,     -5.63,     15.12
+    -46.58,     -7.60,     15.38
+     47.58,    -28.40,     25.08
+    -45.22,    -32.73,     24.42
+     47.53,     -6.65,     -5.22
+    -45.11,     -8.50,     -6.43
+     47.20,    -18.09,      8.50
+    -42.84,    -21.98,      9.30
+     52.09,    -27.05,     14.19
+    -49.80,    -32.02,     13.26
+      2.35,    -81.33,     15.15
+    -19.26,    -64.74,     18.53
+     18.08,    -96.63,     11.22
+    -17.42,    -98.61,      8.92
diff --git a/test/constructor_tests/test_graph_constructor_base.py b/test/constructor_tests/test_graph_constructor_base.py
index 3baefa1..01515d7 100644
--- a/test/constructor_tests/test_graph_constructor_base.py
+++ b/test/constructor_tests/test_graph_constructor_base.py
@@ -9,6 +9,10 @@ def setUp(self):
         self.X4d_adjacency = np.ones((20, 20, 20, 1))
         self.X4d_features = np.random.rand(20, 20, 20, 1)
         self.X4d = np.concatenate((self.X4d_adjacency, self.X4d_features), axis=3)
+        self.test_mtrx = np.array(([0.5, 0, 0, 0],
+                                  [0, 1, 0, 0],
+                                  [0, 0, 1, 0],
+                                  [0, 0, 0, 0.5]))
         self.y = np.ones(20)
 
     def test_wrong_input_shape(self):
@@ -88,3 +92,47 @@ def test_prep_matrix(self):
         input_matrix = np.eye(4)
         output_matrix = g_constr.prep_mtrx(input_matrix * -1)
         self.assertTrue(np.array_equal(input_matrix, output_matrix))
+
+    def test_use_abs(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, use_abs=True)
+        input_matrix = np.eye(4) * -1
+        output_matrix = g_constr.prep_mtrx(input_matrix)
+        self.assertTrue(np.array_equal(np.eye(4), output_matrix))
+
+    def test_use_abs_fisher(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, fisher_transform=1, use_abs_fisher=1)
+        input_matrix = np.eye(4) * -1
+        input_matrix = input_matrix[np.newaxis, :, :, np.newaxis]
+        output_matrix = g_constr.prep_mtrx(input_matrix)
+        ids = np.diag(output_matrix[0, ..., 0])
+        self.assertTrue(np.array_equal(np.isposinf(ids), [True, True, True, True]))
+
+    def test_use_zscore(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, zscore=1)
+        output_matrix = g_constr.prep_mtrx(self.test_mtrx[np.newaxis, :, :, np.newaxis])
+        self.assertEqual((np.sum(np.array(output_matrix) >= 0)), 4)
+
+    def test_use_abs_zscore(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, zscore=1, use_abs_zscore=1)
+        output_matrix = g_constr.prep_mtrx(self.test_mtrx[np.newaxis, :, :, np.newaxis])
+        self.assertEqual((np.sum(np.array(output_matrix) >= 0)), 16)
+
+    def test_use_abs_and_fisher(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, use_abs=1, fisher_transform=1)
+        output_matrix = g_constr.prep_mtrx(self.test_mtrx[np.newaxis, :, :, np.newaxis])
+        self.assertEqual((np.sum(np.array(output_matrix) >= 1)), 2)
+
+    def test_use_abs_and_fisher_and_abs_fisher(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, use_abs=1, fisher_transform=1, use_abs_fisher=1)
+        output_matrix = g_constr.prep_mtrx(self.test_mtrx[np.newaxis, :, :, np.newaxis])
+        self.assertEqual((np.sum(np.array(output_matrix) >= 1)), 2)
+
+    def test_use_abs_and_fisher_and_zsore(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, use_abs=1, fisher_transform=1, zscore=1)
+        output_matrix = g_constr.prep_mtrx(self.test_mtrx[np.newaxis, :, :, np.newaxis])
+        self.assertEqual((np.sum(np.array(output_matrix) >= 1)), 2)
+
+    def test_fisher_and_zscore_and_abszscore(self):
+        g_constr = GraphConstructorThreshold(threshold=0.5, fisher_transform=1, zscore=1, use_abs_zscore=1)
+        output_matrix = g_constr.prep_mtrx(self.test_mtrx[np.newaxis, :, :, np.newaxis])
+        self.assertEqual((np.sum(np.array(output_matrix) >= 1)), 2)
diff --git a/test/constructor_tests/test_graph_constructor_spatial.py b/test/constructor_tests/test_graph_constructor_spatial.py
index e290e71..a1e4a58 100644
--- a/test/constructor_tests/test_graph_constructor_spatial.py
+++ b/test/constructor_tests/test_graph_constructor_spatial.py
@@ -11,6 +11,7 @@ def setUp(self):
         # get random matrix as feature matrix
         self.X4d = np.ones((20, 12, 12, 2))
         self.Xrandom4d = np.random.rand(20, 12, 12, 2)
+        self.XrandomHO4d = np.random.rand(20, 110, 110, 2)
         self.y = np.ones((20))
 
         # get test atlas
@@ -23,6 +24,18 @@ def setUp(self):
         arr = np.array([[3]])
         self.check_array = np.tile(arr, (1, 12))
 
+        # get check array for ho_atlas
+        self.ho_check = [4, 3, 4, 5, 5, 4, 3, 4, 3, 4, 5,
+                         4, 4, 5, 3, 3, 5, 5, 3, 4, 3, 3,
+                         4, 4, 4, 4, 3, 3, 3, 3, 3, 4, 4,
+                         3, 4, 4, 4, 3, 4, 3, 3, 3, 3, 3,
+                         3, 3, 3, 3, 3, 3, 4, 4, 3, 3, 4,
+                         4, 4, 4, 3, 3, 5, 5, 3, 4, 4, 3,
+                         6, 6, 4, 4, 4, 4, 3, 3, 5, 6, 6,
+                         7, 3, 4, 3, 3, 3, 3, 3, 4, 3, 3,
+                         4, 3, 4, 3, 4, 3, 4, 4, 4, 5, 4,
+                         5, 5, 4, 4, 4, 4, 4, 6, 4, 3, 3]
+
     def test_spatial(self):
         path = "/tmp/test_coords.csv"
         self.spatial_coords.to_csv(path, header=False, index=False)
@@ -41,3 +54,11 @@ def test_spatial_mechanism(self):
         bool_array = np.count_nonzero(trans[0, :, :, 0], axis=1, keepdims=True) == self.check_array
         self.assertFalse(False in bool_array)
         os.remove(path)
+
+    def test_ho_atlas(self):
+        path = os.path.dirname(os.path.abspath(__file__))
+        g_constr = GraphConstructorSpatial(k_distance=3, atlas_name='ho', atlas_folder=path)
+        g_constr.fit(self.XrandomHO4d, self.y)
+        trans = g_constr.transform(self.XrandomHO4d)
+        ho_adj = trans[0, :, :, 0]
+        self.assertTrue(np.array_equal(np.count_nonzero(ho_adj, axis=0), self.ho_check))
diff --git a/test/conversion_tests/test_convert_graphs.py b/test/conversion_tests/test_convert_graphs.py
deleted file mode 100644
index 4064a3a..0000000
--- a/test/conversion_tests/test_convert_graphs.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import unittest
-import dgl
-import networkx as nx
-import warnings
-from photonai_graph.GraphConversions import convert_graphs
-
-
-class ConvertGraphsTest(unittest.TestCase):
-
-    def setUp(self):
-        # create networkx graphs
-        nx_graph = nx.cycle_graph(5)
-        self.nx_graph_list = [nx_graph] * 10
-
-    def test_warnings(self):
-        with warnings.catch_warnings(record=True) as w:
-            # Cause all warnings to always be triggered.
-            warnings.simplefilter("always")
-            # Trigger a warning.
-            convert_graphs(self.nx_graph_list, input_format="networkx",
-                           output_format="networkx")
-            # Verify some things
-            self.assertEqual(len(w), 1)
-            self.assertTrue("desired format" in str(w[-1].message))
-
-    def test_nonsense_conversion(self):
-        with self.assertRaises(TypeError):
-            convert_graphs(self.nx_graph_list, input_format="edge_list",
-                           output_format="networkx")
-
-    def test_networkx_to_dgl(self):
-        g = convert_graphs(self.nx_graph_list, input_format="networkx",
-                           output_format="dgl")
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
diff --git a/test/conversion_tests/test_dense_to_networkx.py b/test/conversion_tests/test_dense_to_networkx.py
deleted file mode 100644
index 6da5dd8..0000000
--- a/test/conversion_tests/test_dense_to_networkx.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import unittest
-import networkx as nx
-import numpy as np
-from photonai_graph.GraphConversions import dense_to_networkx
-
-
-class DenseToNetworkxTest(unittest.TestCase):
-
-    def setUp(self):
-        self.random4d = np.random.rand(20, 20, 20, 2)
-        self.array_list = [np.random.rand(20, 20, 2)] * 10
-        self.edge_dict = self.edge_dict = {(1, 0): 1, (2, 0): 1}
-
-    def test_output_list(self):
-        mtrx = dense_to_networkx(self.random4d)
-        self.assertEqual(type(mtrx), list)
-        for itm in mtrx:
-            self.assertEqual(type(itm), nx.Graph)
-
-    def test_input_list_dense(self):
-        mtrx = dense_to_networkx(self.array_list)
-        self.assertEqual(type(mtrx[0]), nx.Graph)
-
-    def test_input_nonsense_list(self):
-        with self.assertRaises(ValueError):
-            dense_to_networkx([self.edge_dict] * 10)
-
-    def test_input_nonsense_array(self):
-        with self.assertRaises(ValueError):
-            dense_to_networkx(np.array([self.edge_dict] * 10))
-
-    def test_input_nonsense(self):
-        with self.assertRaises(ValueError):
-            dense_to_networkx(self.edge_dict)
diff --git a/test/conversion_tests/test_dense_to_sparse.py b/test/conversion_tests/test_dense_to_sparse.py
deleted file mode 100644
index 82c4488..0000000
--- a/test/conversion_tests/test_dense_to_sparse.py
+++ /dev/null
@@ -1,76 +0,0 @@
-import unittest
-import numpy as np
-from scipy import sparse
-from photonai_graph.GraphConversions import dense_to_sparse
-
-
-class DenseToSparseTest(unittest.TestCase):
-
-    def setUp(self):
-        # create dense matrices
-        id_matrix = np.eye(3)
-        id_array = id_matrix[:, :, np.newaxis]
-        id_3d_no_adj = id_matrix[np.newaxis, :, :]
-        id_3d = np.repeat(id_array, 2, axis=2)
-        id_3d_no_adj = np.repeat(id_3d_no_adj, 5, axis=0)
-        id_4d = np.repeat(id_3d[np.newaxis, :, :, :], 5, axis=0)
-        self.matrix_2d = id_matrix
-        self.matrix_2d_list = [id_matrix] * 10
-        self.matrix_3d = id_3d
-        self.matrix_3d_list = [id_3d] * 10
-        self.matrix_3d_no_adj = id_3d_no_adj
-        self.matrix_4d = id_4d
-        self.matrix_4d_list = [id_4d] * 10
-        # create sparse control matrices
-        sparse_matrix = sparse.eye(3)
-        self.sparse_2d = sparse_matrix
-        # create nonsense input
-        self.edge_dict = self.edge_dict = {(1, 0): 1, (2, 0): 1}
-
-    def test_wrong_type(self):
-        with self.assertRaises(KeyError):
-            dense_to_sparse(self.matrix_3d, m_type="xxl_matrix")
-
-    def test_wrong_input(self):
-        with self.assertRaises(ValueError):
-            dense_to_sparse(self.edge_dict)
-
-    def test_2d_matrix(self):
-        mtrx = dense_to_sparse([self.matrix_2d])
-        self.assertTrue((mtrx[0][0] != self.sparse_2d).nnz == 0)
-
-    def test_2d_list(self):
-        mtrx = dense_to_sparse(self.matrix_2d_list)
-        adj_list = mtrx[0]
-        self.assertTrue((adj_list[0] != self.sparse_2d).nnz == 0)
-
-    def test_3d_matrix_no_adj(self):
-        mtrx = dense_to_sparse(self.matrix_3d_no_adj)
-        adj_list = mtrx[0]
-        self.assertTrue((adj_list[0] != self.sparse_2d).nnz == 0)
-
-    def test_3d_adj(self):
-        mtrx = dense_to_sparse([self.matrix_3d], adjacency_axis=0, feature_axis=1)
-        self.assertTrue((mtrx[0][0] != self.sparse_2d).nnz == 0)
-
-    def test_3d_matrix_list(self):
-        mtrx = dense_to_sparse(self.matrix_3d_list, adjacency_axis=0, feature_axis=1)
-        adj_list = mtrx[0]
-        self.assertTrue((adj_list[0] != self.sparse_2d).nnz == 0)
-
-    def test_4d_no_adj(self):
-        with self.assertRaises(ValueError):
-            dense_to_sparse([self.matrix_4d])
-
-    def test_4d_adj(self):
-        mtrx = dense_to_sparse(self.matrix_4d, adjacency_axis=0, feature_axis=0)
-        adj_list = mtrx[0]
-        self.assertTrue((adj_list[0] != self.sparse_2d).nnz == 0)
-
-    def test_4d_list(self):
-        with self.assertRaises(ValueError):
-            dense_to_sparse(self.matrix_4d_list, adjacency_axis=0, feature_axis=1)
-
-    def test_nonsense_input(self):
-        with self.assertRaises(ValueError):
-            dense_to_sparse(self.edge_dict)
diff --git a/test/conversion_tests/test_dgl.py b/test/conversion_tests/test_dgl.py
index f3224db..3fb1502 100644
--- a/test/conversion_tests/test_dgl.py
+++ b/test/conversion_tests/test_dgl.py
@@ -39,30 +39,10 @@ def test_nonsense_input(self):
         with self.assertRaises(TypeError):
             check_dgl(self.edge_dict)
 
-    def test_list_networkx(self):
-        g = check_dgl(self.nx_graph_list)
-        self.assertEqual(len(g), 10)
-
-    def test_networkx_conversion(self):
-        g = check_dgl(self.nx_graph_list)
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
-
-    def test_networkx_output_num_nodes(self):
-        g = check_dgl(self.nx_graph_list)
-        self.assertEqual(g[0].number_of_nodes(), 5)
-
-    def test_networkx_output_num_edges(self):
-        g = check_dgl(self.nx_graph_list)
-        self.assertEqual(g[0].number_of_edges(), 10)
-
     def test_list_dgl(self):
         g = check_dgl(self.dgl_graph_list)
         self.assertEqual(len(g), 10)
 
-    def test_dgl_conversion(self):
-        g = check_dgl(self.nx_graph_list)
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
-
     def test_dgl_output_num_nodes(self):
         g = check_dgl(self.dgl_graph_list)
         self.assertEqual(g[0].number_of_nodes(), 3)
@@ -71,22 +51,6 @@ def test_dgl_output_num_edges(self):
         g = check_dgl(self.dgl_graph_list)
         self.assertEqual(g[0].number_of_edges(), 6)
 
-    def test_list_sparse(self):
-        g = check_dgl(self.sp_matrix_list)
-        self.assertEqual(len(g), 10)
-
-    def test_sparse_conversion(self):
-        g = check_dgl(self.sp_matrix_list)
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
-
-    def test_sparse_output_num_nodes(self):
-        g = check_dgl(self.sp_matrix_list)
-        self.assertEqual(g[0].number_of_nodes(), 3)
-
-    def test_sparse_output_num_edges(self):
-        g = check_dgl(self.sp_matrix_list)
-        self.assertEqual(g[0].number_of_edges(), 6)
-
     def test_numpy_list_exception(self):
         with self.assertRaises(Exception):
             check_dgl(self.np_list)
diff --git a/test/conversion_tests/test_dgl_to_networkx.py b/test/conversion_tests/test_dgl_to_networkx.py
deleted file mode 100644
index eb4cec5..0000000
--- a/test/conversion_tests/test_dgl_to_networkx.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import unittest
-import dgl
-import networkx as nx
-from photonai_graph.GraphConversions import dgl_to_networkx
-
-
-class DglToNetworkxTest(unittest.TestCase):
-
-    def setUp(self):
-        # create dgl graph and nonsense input
-        dgl_graph = dgl.DGLGraph()
-        dgl_graph.add_nodes(3)
-        dgl_graph.add_edges([0, 0, 1, 1, 2, 2], [1, 2, 0, 2, 0, 1])
-        self.graphs = [dgl_graph] * 10
-        self.edge_dict = {(1, 0): 1, (2, 0): 1}
-
-    def test_nonsense_input(self):
-        with self.assertRaises(Exception):
-            dgl_to_networkx(self.edge_dict)
-
-    def test_list_type(self):
-        g = dgl_to_networkx(self.graphs, node_attrs=[], edge_attrs=[])
-        self.assertEqual(type(g), list)
-
-    def test_output_format_multigraph(self):
-        g = dgl_to_networkx(self.graphs, node_attrs=[], edge_attrs=[])
-        self.assertEqual(type(g[0]), nx.classes.MultiDiGraph)
-
-    def test_output_graph_num_nodes(self):
-        g = dgl_to_networkx(self.graphs, node_attrs=[], edge_attrs=[])
-        graph = g[0]
-        self.assertEqual(graph.number_of_nodes(), 3)
-
-    def test_output_graph_num_edges(self):
-        g = dgl_to_networkx(self.graphs, node_attrs=[], edge_attrs=[])
-        graph = g[0]
-        self.assertEqual(graph.number_of_edges(), 6)
diff --git a/test/conversion_tests/test_get_dense_edge_features.py b/test/conversion_tests/test_get_dense_edge_features.py
deleted file mode 100644
index 7edf74c..0000000
--- a/test/conversion_tests/test_get_dense_edge_features.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import unittest
-import numpy as np
-from photonai_graph.GraphConversions import get_dense_edge_features
-
-
-class GetDenseEdgeFeaturesTest(unittest.TestCase):
-
-    def setUp(self):
-        id_matrix = np.eye(3)
-        id_array = id_matrix[:, :, np.newaxis]
-        self.check_matrix = np.repeat(id_array, 2, axis=2)
-        self.control_dict = {('0', '0'): 1.0,
-                             ('0', '1'): 0.0,
-                             ('0', '2'): 0.0,
-                             ('1', '0'): 0.0,
-                             ('1', '1'): 1.0,
-                             ('1', '2'): 0.0,
-                             ('2', '0'): 0.0,
-                             ('2', '1'): 0.0,
-                             ('2', '2'): 1.0}
-
-    def test_return_type(self):
-        feat = get_dense_edge_features(self.check_matrix, adjacency_axis=0, feature_axis=1)
-        self.assertEqual(type(feat), dict)
-
-    def test_dict_content(self):
-        feat = get_dense_edge_features(self.check_matrix, adjacency_axis=0, feature_axis=1)
-        self.assertTrue(feat == self.control_dict)
diff --git a/test/conversion_tests/test_get_dense_feature.py b/test/conversion_tests/test_get_dense_feature.py
deleted file mode 100644
index 48b0c6d..0000000
--- a/test/conversion_tests/test_get_dense_feature.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import unittest
-import numpy as np
-from photonai_graph.GraphConversions import get_dense_feature
-
-
-class GetDenseFeatureTest(unittest.TestCase):
-
-    def setUp(self):
-        id_matrix = np.eye(5)
-        id_array = id_matrix[:, :, np.newaxis]
-        self.check_matrix = np.repeat(id_array, 2, axis=2)
-        self.control_dict = {0: [1, 0, 0, 0, 0],
-                             1: [0, 1, 0, 0, 0],
-                             2: [0, 0, 1, 0, 0],
-                             3: [0, 0, 0, 1, 0],
-                             4: [0, 0, 0, 0, 1]}
-
-    def test_return_type(self):
-        feat = get_dense_feature(self.check_matrix, adjacency_axis=0, feature_axis=1)
-        self.assertEqual(type(feat), dict)
-
-    def test_sum(self):
-        feat = get_dense_feature(self.check_matrix, adjacency_axis=0, feature_axis=1,
-                                 aggregation="sum")
-        self.assertTrue(all(value == 1 for value in feat.values()))
-
-    def test_mean(self):
-        feat = get_dense_feature(self.check_matrix, adjacency_axis=0, feature_axis=1,
-                                 aggregation="mean")
-        self.assertTrue(all(value == 0.2 for value in feat.values()))
-
-    def test_node_degree(self):
-        feat = get_dense_feature(self.check_matrix, adjacency_axis=0, feature_axis=1,
-                                 aggregation="node_degree")
-        self.assertTrue(all(value == 1 for value in feat.values()))
-
-    def test_features(self):
-        feat = get_dense_feature(self.check_matrix, adjacency_axis=0, feature_axis=1,
-                                 aggregation="features")
-        self.assertTrue(feat == self.control_dict)
-
-    def test_error(self):
-        with self.assertRaises(KeyError):
-            get_dense_feature(self.check_matrix, adjacency_axis=0, feature_axis=1,
-                              aggregation="weight")
diff --git a/test/conversion_tests/test_networkx_to_dense.py b/test/conversion_tests/test_networkx_to_dense.py
deleted file mode 100644
index ab69a2d..0000000
--- a/test/conversion_tests/test_networkx_to_dense.py
+++ /dev/null
@@ -1,43 +0,0 @@
-import unittest
-import networkx as nx
-import numpy as np
-from photonai_graph.GraphConversions import networkx_to_dense
-
-
-class NetworkxToDenseTest(unittest.TestCase):
-
-    def setUp(self):
-        self.graph = nx.cycle_graph(20)
-        self.graphs = [nx.cycle_graph(20)] * 10
-        self.check_graph = nx.cycle_graph(5)
-        self.check_matrix = np.array([[0, 1, 0, 0, 1],
-                                      [1, 0, 1, 0, 0],
-                                      [0, 1, 0, 1, 0],
-                                      [0, 0, 1, 0, 1],
-                                      [1, 0, 0, 1, 0]])
-
-    def test_list(self):
-        mtrxs = networkx_to_dense(self.graphs)
-        self.assertEqual(type(mtrxs), list)
-        for mtrx in mtrxs:
-            self.assertEqual(type(mtrx), np.ndarray)
-
-    def test_single_graph(self):
-        mtrx = networkx_to_dense(self.graph)
-        self.assertEqual(type(mtrx), np.ndarray)
-
-    def test_matrix_shape(self):
-        mtrx = networkx_to_dense(self.graph)
-        self.assertEqual(np.shape(mtrx), (20, 20))
-
-    def test_check_graph(self):
-        mtrx = networkx_to_dense(self.check_graph)
-        self.assertTrue(np.array_equal(mtrx, self.check_matrix))
-
-    def test_check_nonsense_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_dense(self.check_matrix)
-
-    def test_check_nonsense_list_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_dense([self.check_matrix] * 10)
diff --git a/test/conversion_tests/test_networkx_to_dgl.py b/test/conversion_tests/test_networkx_to_dgl.py
deleted file mode 100644
index e50cf6e..0000000
--- a/test/conversion_tests/test_networkx_to_dgl.py
+++ /dev/null
@@ -1,51 +0,0 @@
-import unittest
-import networkx as nx
-import numpy as np
-import dgl
-from photonai_graph.GraphConversions import networkx_to_dgl
-
-
-class NetworkxToDglTest(unittest.TestCase):
-
-    def setUp(self):
-        self.graph = nx.cycle_graph(20)
-        self.graphs = [nx.cycle_graph(20)] * 10
-        self.check_graph = nx.cycle_graph(5)
-        self.edge_dict = {(1, 0): 1, (2, 0): 1}
-        # create 1d array of networkx graphs
-        self.nx_array = np.array([nx.cycle_graph(20), nx.cycle_graph(15), nx.cycle_graph(20)])
-
-    def test_list(self):
-        mtrxs = networkx_to_dgl(self.graphs)
-        self.assertEqual(type(mtrxs), list)
-        for mtrx in mtrxs:
-            self.assertEqual(type(mtrx), dgl.DGLGraph)
-
-    def test_single_graph(self):
-        mtrx = networkx_to_dgl(self.graph)
-        self.assertEqual(type(mtrx), dgl.DGLGraph)
-
-    def test_num_nodes(self):
-        mtrx = networkx_to_dgl(self.check_graph)
-        self.assertEqual(mtrx.number_of_nodes(), 5)
-
-    def test_num_edges(self):
-        mtrx = networkx_to_dgl(self.check_graph)
-        self.assertEqual(mtrx.number_of_edges(), 10)
-
-    def test_check_nonsense_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_dgl(self.edge_dict)
-
-    def test_check_nonsense_list_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_dgl([self.edge_dict] * 10)
-
-    def test_check_nonsense_array_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_dgl(np.array([self.edge_dict] * 10))
-
-    def test_nx_array(self):
-        mtrxs = networkx_to_dgl(self.nx_array)
-        for mtrx in mtrxs:
-            self.assertEqual(type(mtrx), dgl.DGLGraph)
diff --git a/test/conversion_tests/test_networkx_to_sparse.py b/test/conversion_tests/test_networkx_to_sparse.py
deleted file mode 100644
index 86de846..0000000
--- a/test/conversion_tests/test_networkx_to_sparse.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import unittest
-import networkx as nx
-import scipy.sparse
-from photonai_graph.GraphConversions import networkx_to_sparse
-
-
-class NetworkxToSparseTest(unittest.TestCase):
-
-    def setUp(self):
-        self.graph = nx.cycle_graph(20)
-        self.graphs = [nx.cycle_graph(20)] * 10
-        self.check_graph = nx.cycle_graph(5)
-        self.check_matrix = scipy.sparse.csr_matrix([[0, 1, 0, 0, 1],
-                                                     [1, 0, 1, 0, 0],
-                                                     [0, 1, 0, 1, 0],
-                                                     [0, 0, 1, 0, 1],
-                                                     [1, 0, 0, 1, 0]])
-
-    def test_list(self):
-        mtrx = networkx_to_sparse(self.graphs)
-        self.assertEqual(type(mtrx), list)
-
-    def test_np_type(self):
-        mtrx = networkx_to_sparse(self.graphs)
-        self.assertEqual(type(mtrx[0]), scipy.sparse.csr_matrix)
-
-    def test_single_graph(self):
-        mtrx = networkx_to_sparse(self.graph)
-        self.assertEqual(type(mtrx), scipy.sparse.csr_matrix)
-
-    def test_matrix_shape(self):
-        mtrx = networkx_to_sparse(self.graph)
-        self.assertEqual(mtrx.shape, (20, 20))
-
-    def test_check_graph(self):
-        mtrx = networkx_to_sparse(self.check_graph)
-        self.assertTrue((mtrx != self.check_matrix).nnz == 0)
-
-    def test_check_nonsense_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_sparse(self.check_matrix)
-
-    def test_check_nonsense_list_input(self):
-        with self.assertRaises(ValueError):
-            networkx_to_sparse([self.check_matrix] * 10)
diff --git a/test/conversion_tests/test_sparse_to_dgl.py b/test/conversion_tests/test_sparse_to_dgl.py
deleted file mode 100644
index 644b2cc..0000000
--- a/test/conversion_tests/test_sparse_to_dgl.py
+++ /dev/null
@@ -1,58 +0,0 @@
-import unittest
-from scipy import sparse
-import numpy as np
-import dgl
-from photonai_graph.GraphConversions import sparse_to_dgl
-
-
-class SparseToDglTest(unittest.TestCase):
-
-    def setUp(self):
-        # create sparse matrices
-        sparse_matrix = sparse.eye(5)
-        sparse_short = sparse.eye(3)
-        sparse_list = [sparse_matrix] * 10
-        self.single_matrix = sparse_matrix
-        self.matrix_list = sparse_list
-        self.sparse_tuple = (sparse_list, sparse_list)
-        # create array with sparse matrices
-        self.np_array = np.array([sparse_matrix, sparse_short, sparse_matrix])
-        # create dense control matrix
-        self.control_matrix = np.eye(5)
-        self.edge_dict = {(1, 0): 1, (2, 0): 1}
-
-    def test_tuple(self):
-        g = sparse_to_dgl(self.sparse_tuple, adjacency_axis=0, feature_axis=1)
-        self.assertEqual(type(g), list)
-
-    def test_tuple_graph(self):
-        g = sparse_to_dgl(self.sparse_tuple, adjacency_axis=0, feature_axis=1)
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
-
-    def test_list(self):
-        g = sparse_to_dgl(self.matrix_list)
-        self.assertEqual(type(g), list)
-
-    def test_list_graph(self):
-        g = sparse_to_dgl(self.matrix_list)
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
-
-    def test_array_wrong_dim(self):
-        with self.assertRaises(Exception):
-            sparse_to_dgl(self.control_matrix)
-
-    def test_np_array(self):
-        g = sparse_to_dgl(self.np_array)
-        self.assertEqual(type(g[0]), dgl.DGLGraph)
-
-    def test_nonsense(self):
-        with self.assertRaises(Exception):
-            sparse_to_dgl(self.edge_dict)
-
-    def test_nonsense_list(self):
-        with self.assertRaises(Exception):
-            sparse_to_dgl([self.edge_dict] * 10)
-
-    def test_nonsense_array(self):
-        with self.assertRaises(Exception):
-            sparse_to_dgl(np.array([self.edge_dict] * 10))
diff --git a/test/conversion_tests/test_sparse_to_networkx.py b/test/conversion_tests/test_sparse_to_networkx.py
deleted file mode 100644
index 9211eb5..0000000
--- a/test/conversion_tests/test_sparse_to_networkx.py
+++ /dev/null
@@ -1,48 +0,0 @@
-import unittest
-from scipy import sparse
-import networkx as nx
-from photonai_graph.GraphConversions import sparse_to_networkx
-
-
-class SparseToNetworkxTest(unittest.TestCase):
-
-    def setUp(self):
-        check_matrix = sparse.csr_matrix([[0, 1, 0, 0, 1],
-                                          [1, 0, 1, 0, 0],
-                                          [0, 1, 0, 1, 0],
-                                          [0, 0, 1, 0, 1],
-                                          [1, 0, 0, 1, 0]])
-        self.single_matrix = check_matrix
-        self.matrix_list = [check_matrix] * 10
-        self.edge_dict = {(1, 0): 1, (2, 0): 1}
-
-    def test_list(self):
-        lst = sparse_to_networkx(self.matrix_list)
-        self.assertEqual(type(lst), list)
-        for itm in lst:
-            self.assertEqual(type(itm), nx.classes.Graph)
-
-    def test_single(self):
-        single = sparse_to_networkx(self.single_matrix)
-        self.assertEqual(type(single), nx.classes.Graph)
-
-    def test_nodes(self):
-        single = sparse_to_networkx(self.single_matrix)
-        self.assertEqual(single.number_of_nodes(), 5)
-
-    def test_edges(self):
-        single = sparse_to_networkx(self.single_matrix)
-        self.assertEqual(single.number_of_edges(), 5)
-
-    def test_adjacency(self):
-        single = sparse_to_networkx(self.single_matrix)
-        smat = nx.adjacency_matrix(single)
-        self.assertTrue((smat != self.single_matrix).nnz == 0)
-
-    def test_nonsense(self):
-        with self.assertRaises(Exception):
-            sparse_to_networkx(self.edge_dict)
-
-    def test_nonsense_list(self):
-        with self.assertRaises(Exception):
-            sparse_to_networkx([self.edge_dict] * 10)
diff --git a/test/io_tests/__init__.py b/test/io_tests/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/test/io_tests/test_load_file_to_networkx.py b/test/io_tests/test_load_file_to_networkx.py
deleted file mode 100644
index d60d36e..0000000
--- a/test/io_tests/test_load_file_to_networkx.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import unittest
-import warnings
-
-import networkx as nx
-import numpy as np
-
-from photonai_graph.GraphIO import save_networkx_to_file, load_file_to_networkx
-
-
-class LoadFileTNetworkxTest(unittest.TestCase):
-
-    def setUp(self):
-        self.graph = nx.cycle_graph(20)
-
-    def test_input_format_wrong(self):
-         in_format = "heavy_weight_edge_list"
-         path = "/spm-data/Scratch/spielwiese_vincent/tmp/"
-         with self.assertRaises(KeyError):
-            load_file_to_networkx(path, input_format=in_format)
-
-    def test_load_list(self):
-        # in_format = "dot"
-        # path = ["/spm-data/Scratch/spielwiese_vincent/tmp/graph_1",
-        #        "/spm-data/Scratch/spielwiese_vincent/tmp/graph_2",
-        #        "/spm-data/Scratch/spielwiese_vincent/tmp/graph_3"]
-        # graphs = load_file_to_networkx(path, in_format)
-        # self.assertEqual(type(graphs), list)
-        warnings.warn('This test has to be reimplemented')
-
-    def test_load_graph(self):
-        # in_format = "dot"
-        # path = ["/spm-data/Scratch/spielwiese_vincent/tmp/graph_1",
-        #        "/spm-data/Scratch/spielwiese_vincent/tmp/graph_2",
-        #        "/spm-data/Scratch/spielwiese_vincent/tmp/graph_3"]
-        # graphs = load_file_to_networkx(path, in_format)
-        # self.assertEqual(type(graphs[0]), nx.classes.MultiGraph)
-        warnings.warn('This test has to be reimplemented')
diff --git a/test/io_tests/test_save_networkx_to_file.py b/test/io_tests/test_save_networkx_to_file.py
deleted file mode 100644
index b812dd9..0000000
--- a/test/io_tests/test_save_networkx_to_file.py
+++ /dev/null
@@ -1,59 +0,0 @@
-import unittest
-import numpy as np
-import networkx as nx
-import os
-
-from photonai_graph.GraphIO import save_networkx_to_file
-
-
-class SaveNetworkxToFileTest(unittest.TestCase):
-
-    def setUp(self):
-        self.graph = nx.cycle_graph(20)
-        self.graphs = [nx.cycle_graph(20)] * 10
-        self.nonsense = np.random.rand(20, 20)
-        self.ids = list(range(11, 21))
-        self.ids_misfit = list(range(5, 11))
-
-    def test_output_format_wrong(self):
-        out_format = "heavy_weight_edge_list"
-        path = "/tmp/"
-        with self.assertRaises(ValueError):
-            save_networkx_to_file(self.graphs, path=path, output_format=out_format)
-
-    def test_ids_length_wrong(self):
-        out_format = "dot"
-        path = "/tmp/"
-        with self.assertRaises(ValueError):
-            save_networkx_to_file(self.graphs, path=path, output_format=out_format,
-                                  ids=self.ids_misfit)
-
-    def test_no_ids(self):
-        out_format = "dot"
-        path = "/tmp/"
-        save_networkx_to_file(self.graphs, path=path, output_format=out_format)
-        self.assertTrue(os.path.exists(path + "graph_0"))
-
-    def test_ids(self):
-        out_format = "dot"
-        path = "/tmp/"
-        save_networkx_to_file(self.graphs, path=path, output_format=out_format, ids=self.ids)
-        self.assertTrue(os.path.exists(path + "graph_11"))
-
-    def test_single_graph(self):
-        out_format = "dot"
-        path = "/tmp/graph25"
-        save_networkx_to_file(self.graph, path=path, output_format=out_format)
-        self.assertTrue(os.path.exists(path))
-
-    def test_nonsense_input(self):
-        out_format = "dot"
-        path = "/tmp/graph25"
-        with self.assertRaises(ValueError):
-            save_networkx_to_file(self.nonsense, path=path, output_format=out_format)
-
-    def test_random_list_input(self):
-        out_format = "dot"
-        path = "/tmp/graph25"
-        with self.assertRaises(ValueError):
-            save_networkx_to_file([self.nonsense] * 20, path=path, output_format=out_format)
diff --git a/test/kernel_tests/test_grakel_transformer.py b/test/kernel_tests/test_grakel_transformer.py
new file mode 100644
index 0000000..f7457ba
--- /dev/null
+++ b/test/kernel_tests/test_grakel_transformer.py
@@ -0,0 +1,35 @@
+import unittest
+import numpy as np
+
+from photonai_graph.GraphKernels.grakel_adapter import GrakelAdapter
+from photonai_graph.GraphKernels.GrakelTransformer import GrakelTransformer
+
+
+class GrakelTransformerTest(unittest.TestCase):
+
+    def setUp(self) -> None:
+        mtrx = np.random.rand(20, 20, 20, 2)
+        mtrx[:, :, :, 0][mtrx[:, :, :, 0] <= 0.9] = 0
+        self.Xrandom4d = mtrx
+        self.Xrandom_missfit = np.random.rand(20, 20, 5, 2)
+        self.y = np.ones(20)
+
+    def test_dummy_function(self):
+        g_adapter = GrakelAdapter()
+        x_trans = g_adapter.transform(self.Xrandom4d)
+        self.assertEqual(type(x_trans), list)
+        gt = GrakelTransformer(transformation="ShortestPath", with_labels=True)
+        gt.fit(x_trans)
+        res = gt.transform(x_trans)
+        self.assertTrue(isinstance(res, np.ndarray))
+
+    def test_unknown_function(self):
+        with self.assertRaises(ValueError):
+            gt = GrakelTransformer(transformation="Dummy")
+
+    def test_unfit_transformer(self):
+        g_adapter = GrakelAdapter()
+        x_trans = g_adapter.transform(self.Xrandom4d)
+        gt = GrakelTransformer(transformation="ShortestPath")
+        with self.assertRaises(ValueError):
+            gt.transform(x_trans)
diff --git a/test/nn_tests/test_gat_classifier.py b/test/nn_tests/test_gat_classifier.py
index c2cdcba..d5012b6 100644
--- a/test/nn_tests/test_gat_classifier.py
+++ b/test/nn_tests/test_gat_classifier.py
@@ -33,12 +33,6 @@ def test_gat_classifier_output_hidden_dim(self):
         output = gat_clf.predict(self.Xrandom4d)
         self.assertEqual(output.shape, self.y.shape)
 
-    def test_gat_classifier_nx_graphs(self):
-        gat_clf = GATClassifierModel(nn_epochs=20)
-        gat_clf.fit(self.X_nx, self.y)
-        output = gat_clf.predict(self.X_nx)
-        self.assertEqual(output.shape, self.y.shape)
-
     def test_gat_classifier_dgl(self):
         gat_clf = GATClassifierModel(nn_epochs=20)
         gat_clf.fit(self.X_dgl, self.y)
diff --git a/test/nn_tests/test_gcn_classifier.py b/test/nn_tests/test_gcn_classifier.py
index 9bba8ab..b979772 100644
--- a/test/nn_tests/test_gcn_classifier.py
+++ b/test/nn_tests/test_gcn_classifier.py
@@ -33,12 +33,6 @@ def test_gcn_classifier_output_hidden_dim(self):
         output = gcn_clf.predict(self.Xrandom4d)
         self.assertTrue(np.array_equal(output.shape, self.y.shape))
 
-    def test_gat_classifier_nx_graphs(self):
-        gat_clf = GCNClassifierModel(nn_epochs=20)
-        gat_clf.fit(self.X_nx, self.y)
-        output = gat_clf.predict(self.X_nx)
-        self.assertTrue(np.array_equal(output.shape, self.y.shape))
-
     def test_gat_classifier_dgl(self):
         gat_clf = GCNClassifierModel(nn_epochs=20)
         gat_clf.fit(self.X_dgl, self.y)
diff --git a/test/utility_tests/test_draw_connectogram.py b/test/utility_tests/test_draw_connectogram.py
index a26ec6a..a64203d 100644
--- a/test/utility_tests/test_draw_connectogram.py
+++ b/test/utility_tests/test_draw_connectogram.py
@@ -11,7 +11,7 @@ class DrawConnectogramTests(unittest.TestCase):
 
     def setUp(self):
         self.cyc_graph = nx.cycle_graph(20)
-        self.weight_graph = dense_to_networkx(np.random.rand(1, 20, 20, 2))
+        self.weight_graph = dense_to_networkx(np.random.rand(1, 20, 20, 2), adjacency_axis=0)
 
     def test_drawing(self):
         draw_connectogram(self.cyc_graph, show=False)
@@ -30,5 +30,4 @@ def test_drawing_weight(self):
             draw_connectogram(self.cyc_graph, weight=0.5, show=False)
 
     def test_drawing_weight_corrected(self):
-        #draw_connectogram(self.weight_graph, weight=0.5, show=False)
-        warnings.warn('This test has to be reimplemented')
+        draw_connectogram(self.weight_graph[0], weight=0.5, show=False)
diff --git a/test/utility_tests/test_individual_fishertransform.py b/test/utility_tests/test_individual_fishertransform.py
index 97bcf43..d01c2bb 100644
--- a/test/utility_tests/test_individual_fishertransform.py
+++ b/test/utility_tests/test_individual_fishertransform.py
@@ -8,6 +8,7 @@ class IndividualFishertransformTest(unittest.TestCase):
     def setUp(self):
         self.m3d = np.random.rand(10, 20, 20)
         self.m4d = np.ones((10, 20, 20, 2))
+        self.m4dnan = np.empty((10, 20, 20, 2)) * np.nan
 
     def test_fishertransform_3d(self):
         with self.assertRaises(ValueError):
@@ -15,4 +16,8 @@ def test_fishertransform_3d(self):
 
     def test_ztransform_4d(self):
         trans_m4d = individual_fishertransform(self.m4d)
-        self.assertEqual(np.shape(trans_m4d), np.shape(self.m4d[:, :, :, 0]))
+        self.assertEqual(np.shape(trans_m4d), np.shape(self.m4d[..., 0, np.newaxis]))
+
+    def test_fishertransform_nan(self):
+        with self.assertRaises(ValueError):
+            individual_fishertransform(self.m4dnan)