From f0b6e3c6f32f5ed330baca4e18be5caf641cfad4 Mon Sep 17 00:00:00 2001
From: Jean-Luc Parouty <Jean-Luc.Parouty@simap.grenoble-inp.fr>
Date: Mon, 10 Oct 2022 13:09:30 +0200
Subject: [PATCH] Update all notebooks (v2.02b3)

---
 AE/01-Prepare-MNIST-dataset.ipynb             |  20 +-
 AE/02-AE-with-MNIST.ipynb                     |  50 +-
 AE/03-AE-with-MNIST-post.ipynb                |  24 +-
 AE/04-ExtAE-with-MNIST.ipynb                  |  56 +-
 AE/05-ExtAE-with-MNIST.ipynb                  |  56 +-
 BHPD/01-DNN-Regression.ipynb                  |  51 +-
 BHPD/02-DNN-Regression-Premium.ipynb          |  49 +-
 BHPD_PyTorch/01-DNN-Regression_PyTorch.ipynb  |   2 +-
 DCGAN/01-DCGAN-Draw-me-a-sheep.ipynb          |  18 +-
 DCGAN/02-WGANGP-Draw-me-a-sheep.ipynb         |  18 +-
 GTSRB/01-Preparation-of-data.ipynb            |  82 +--
 GTSRB/02-First-convolutions.ipynb             |  45 +-
 GTSRB/03-Tracking-and-visualizing.ipynb       |  46 +-
 GTSRB/04-Data-augmentation.ipynb              |  45 +-
 GTSRB/05-Full-convolutions.ipynb              |  34 +-
 GTSRB/07-Show-report.ipynb                    |  12 +-
 IMDB/01-One-hot-encoding.ipynb                |  30 +-
 IMDB/02-Keras-embedding.ipynb                 |  28 +-
 IMDB/03-Prediction.ipynb                      |  10 +-
 IMDB/04-Show-vectors.ipynb                    |  10 +-
 IMDB/05-LSTM-Keras.ipynb                      |  34 +-
 IRIS/01-Simple-Perceptron.ipynb               | 508 +-----------------
 LinearReg/04-Logistic-Regression.ipynb        |  21 +-
 MNIST/01-DNN-MNIST.ipynb                      |  31 +-
 MNIST/02-CNN-MNIST.ipynb                      |  31 +-
 MNIST_PyTorch/01-DNN-MNIST_PyTorch.ipynb      |   2 +-
 Misc/Activation-Functions.ipynb               |  20 +-
 README.ipynb                                  |  14 +-
 README.md                                     |   2 +-
 SYNOP/LADYB1-Ladybug.ipynb                    |  34 +-
 SYNOP/SYNOP1-Preparation-of-data.ipynb        |  32 +-
 SYNOP/SYNOP2-First-predictions.ipynb          |  34 +-
 SYNOP/SYNOP3-12h-predictions.ipynb            |  14 +-
 VAE/01-VAE-with-MNIST.ipynb                   |  32 +-
 VAE/02-VAE-with-MNIST.ipynb                   |  40 +-
 VAE/03-VAE-with-MNIST-post.ipynb              |  20 +-
 VAE/05-About-CelebA.ipynb                     |  18 +-
 VAE/06-Prepare-CelebA-datasets.ipynb          |  32 +-
 VAE/07-Check-CelebA.ipynb                     |  24 +-
 VAE/08-VAE-with-CelebA.ipynb                  |  30 +-
 VAE/09-VAE-with-CelebA-192x160.ipynb          |  30 +-
 VAE/10-VAE-with-CelebA-post.ipynb             |  26 +-
 environments/archives/environment.yml         | 203 -------
 .../archives/fidle_environment_linux.txt      | 199 -------
 .../fidle_environment_linux_gpu_cuda101.txt   | 202 -------
 .../archives/fidle_environment_windows10.txt  | 192 -------
 ...idle_environment_windows10_gpu_cuda101.txt | 194 -------
 environments/fidle-cpu.txt                    |  24 +
 environments/fidle-cpu.yml                    |  15 -
 environments/fidle-gpu.txt                    |  24 +
 environments/fidle-gpu.yml                    |  15 -
 fidle/ci/default.yml                          |   2 +-
 52 files changed, 701 insertions(+), 2084 deletions(-)
 delete mode 100644 environments/archives/environment.yml
 delete mode 100644 environments/archives/fidle_environment_linux.txt
 delete mode 100644 environments/archives/fidle_environment_linux_gpu_cuda101.txt
 delete mode 100644 environments/archives/fidle_environment_windows10.txt
 delete mode 100644 environments/archives/fidle_environment_windows10_gpu_cuda101.txt
 create mode 100644 environments/fidle-cpu.txt
 delete mode 100644 environments/fidle-cpu.yml
 create mode 100644 environments/fidle-gpu.txt
 delete mode 100644 environments/fidle-gpu.yml

diff --git a/AE/01-Prepare-MNIST-dataset.ipynb b/AE/01-Prepare-MNIST-dataset.ipynb
index b54b84c..d8e2366 100644
--- a/AE/01-Prepare-MNIST-dataset.ipynb
+++ b/AE/01-Prepare-MNIST-dataset.ipynb
@@ -44,11 +44,11 @@
     "import modules.MNIST\n",
     "from modules.MNIST     import MNIST\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir='./run/AE1'\n",
-    "datasets_dir = pwk.init('AE1', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('AE1', run_dir)"
    ]
   },
   {
@@ -85,7 +85,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('prepared_dataset', 'scale', 'progress_verbosity')"
+    "fidle.override('prepared_dataset', 'scale', 'progress_verbosity')"
    ]
   },
   {
@@ -127,7 +127,7 @@
     "def noise_it(data):\n",
     "    new_data = np.copy(data)\n",
     "    for i,image in enumerate(new_data):\n",
-    "        pwk.update_progress('Add noise : ',i+1,len(new_data),verbosity=progress_verbosity)\n",
+    "        fidle.utils.update_progress('Add noise : ',i+1,len(new_data),verbosity=progress_verbosity)\n",
     "        image=random_noise(image, mode='gaussian', mean=0, var=0.3)\n",
     "        image=random_noise(image, mode='s&p',      amount=0.2, salt_vs_pepper=0.5)\n",
     "        image=random_noise(image, mode='poisson') \n",
@@ -157,10 +157,10 @@
     "print('Clean dataset (clean_data) : ',clean_data.shape)\n",
     "print('Noisy dataset (noisy_data) : ',noisy_data.shape)\n",
     "\n",
-    "pwk.subtitle(\"Noisy images we'll have in input (or x)\")\n",
-    "pwk.plot_images(noisy_data[:5], None, indices='all', columns=5, x_size=3,y_size=3, interpolation=None, save_as='01-noisy')\n",
-    "pwk.subtitle('Clean images we want to obtain (or y)')\n",
-    "pwk.plot_images(clean_data[:5], None, indices='all', columns=5, x_size=3,y_size=3, interpolation=None, save_as='02-original')\n"
+    "fidle.utils.subtitle(\"Noisy images we'll have in input (or x)\")\n",
+    "fidle.scrawler.images(noisy_data[:5], None, indices='all', columns=5, x_size=3,y_size=3, interpolation=None, save_as='01-noisy')\n",
+    "fidle.utils.subtitle('Clean images we want to obtain (or y)')\n",
+    "fidle.scrawler.images(clean_data[:5], None, indices='all', columns=5, x_size=3,y_size=3, interpolation=None, save_as='02-original')\n"
    ]
   },
   {
@@ -203,7 +203,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/AE/02-AE-with-MNIST.ipynb b/AE/02-AE-with-MNIST.ipynb
index 4ec01cd..906fd79 100644
--- a/AE/02-AE-with-MNIST.ipynb
+++ b/AE/02-AE-with-MNIST.ipynb
@@ -61,11 +61,11 @@
     "from modules.MNIST          import MNIST\n",
     "from modules.ImagesCallback import ImagesCallback\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/AE2'\n",
-    "datasets_dir = pwk.init('AE2', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('AE2', run_dir)"
    ]
   },
   {
@@ -115,8 +115,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('prepared_dataset', 'dataset_seed', 'scale', 'latent_dim')\n",
-    "pwk.override('train_prop', 'batch_size', 'epochs')"
+    "fidle.override('prepared_dataset', 'dataset_seed', 'scale', 'latent_dim')\n",
+    "fidle.override('train_prop', 'batch_size', 'epochs')"
    ]
   },
   {
@@ -235,13 +235,13 @@
    "source": [
     "# ---- Callback : Images\n",
     "#\n",
-    "pwk.mkdir( run_dir + '/images')\n",
+    "fidle.utils.mkdir( run_dir + '/images')\n",
     "filename = run_dir + '/images/image-{epoch:03d}-{i:02d}.jpg'\n",
     "callback_images = ImagesCallback(filename, x=clean_test[:5], encoder=encoder,decoder=decoder)\n",
     "\n",
     "# ---- Callback : Best model\n",
     "#\n",
-    "pwk.mkdir( run_dir + '/models')\n",
+    "fidle.utils.mkdir( run_dir + '/models')\n",
     "filename = run_dir + '/models/best_model.h5'\n",
     "callback_bestmodel = tf.keras.callbacks.ModelCheckpoint(filepath=filename, verbose=0, save_best_only=True)\n",
     "\n",
@@ -285,7 +285,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={'loss':['loss','val_loss']}, save_as='01-history')"
+    "fidle.scrawler.history(history,  plot={'loss':['loss','val_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -308,20 +308,20 @@
     "        img      = io.imread(filename)\n",
     "        imgs.append(img)      \n",
     "\n",
-    "pwk.subtitle('Real images (clean_test) :')\n",
-    "pwk.plot_images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='02-original-real')\n",
+    "fidle.utils.subtitle('Real images (clean_test) :')\n",
+    "fidle.scrawler.images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='02-original-real')\n",
     "\n",
-    "pwk.subtitle('Noisy images (noisy_test) :')\n",
-    "pwk.plot_images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='03-original-noisy')\n",
+    "fidle.utils.subtitle('Noisy images (noisy_test) :')\n",
+    "fidle.scrawler.images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='03-original-noisy')\n",
     "\n",
-    "pwk.subtitle('Evolution during the training period (denoised_test) :')\n",
-    "pwk.plot_images(imgs, None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, y_padding=0.1, save_as='04-learning')\n",
+    "fidle.utils.subtitle('Evolution during the training period (denoised_test) :')\n",
+    "fidle.scrawler.images(imgs, None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, y_padding=0.1, save_as='04-learning')\n",
     "\n",
-    "pwk.subtitle('Noisy images (noisy_test) :')\n",
-    "pwk.plot_images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n",
+    "fidle.utils.subtitle('Noisy images (noisy_test) :')\n",
+    "fidle.scrawler.images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n",
     "\n",
-    "pwk.subtitle('Real images (clean_test) :')\n",
-    "pwk.plot_images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n"
+    "fidle.utils.subtitle('Real images (clean_test) :')\n",
+    "fidle.scrawler.images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n"
    ]
   },
   {
@@ -380,14 +380,14 @@
     "i=random.randint(0,len(denoised_test)-8)\n",
     "j=i+8\n",
     "\n",
-    "pwk.subtitle('Noisy test images (input):')\n",
-    "pwk.plot_images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
+    "fidle.utils.subtitle('Noisy test images (input):')\n",
+    "fidle.scrawler.images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
     "\n",
-    "pwk.subtitle('Denoised images (output):')\n",
-    "pwk.plot_images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
+    "fidle.utils.subtitle('Denoised images (output):')\n",
+    "fidle.scrawler.images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
     "\n",
-    "pwk.subtitle('Real test images :')\n",
-    "pwk.plot_images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
+    "fidle.utils.subtitle('Real test images :')\n",
+    "fidle.scrawler.images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
    ]
   },
   {
@@ -396,7 +396,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/AE/03-AE-with-MNIST-post.ipynb b/AE/03-AE-with-MNIST-post.ipynb
index 3cef862..a01b1d2 100644
--- a/AE/03-AE-with-MNIST-post.ipynb
+++ b/AE/03-AE-with-MNIST-post.ipynb
@@ -50,11 +50,11 @@
     "\n",
     "from modules.MNIST import MNIST\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/AE2'\n",
-    "datasets_dir = pwk.init('AE3', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('AE3', run_dir)"
    ]
   },
   {
@@ -94,7 +94,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('prepared_dataset', 'dataset_seed', 'scale', 'train_prop')"
+    "fidle.override('prepared_dataset', 'dataset_seed', 'scale', 'train_prop')"
    ]
   },
   {
@@ -176,14 +176,14 @@
     "i=random.randint(0,len(denoised_test)-8)\n",
     "j=i+8\n",
     "\n",
-    "pwk.subtitle('Noisy test images (input):')\n",
-    "pwk.plot_images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
+    "fidle.utils.subtitle('Noisy test images (input):')\n",
+    "fidle.scrawler.images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
     "\n",
-    "pwk.subtitle('Denoised images (output):')\n",
-    "pwk.plot_images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
+    "fidle.utils.subtitle('Denoised images (output):')\n",
+    "fidle.scrawler.images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
     "\n",
-    "pwk.subtitle('Real test images :')\n",
-    "pwk.plot_images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
+    "fidle.utils.subtitle('Real test images :')\n",
+    "fidle.scrawler.images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
    ]
   },
   {
@@ -252,7 +252,7 @@
     "fig = plt.figure(figsize=(14, 10))\n",
     "plt.scatter(z[:, 0] , z[:, 1], c=y_show, cmap= 'tab10', alpha=0.5, s=30)\n",
     "plt.colorbar()\n",
-    "pwk.save_fig('08-Latent-space')\n",
+    "fidle.scrawler.save_fig('08-Latent-space')\n",
     "plt.show()"
    ]
   },
@@ -262,7 +262,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/AE/04-ExtAE-with-MNIST.ipynb b/AE/04-ExtAE-with-MNIST.ipynb
index 3b88bab..2e31ed4 100644
--- a/AE/04-ExtAE-with-MNIST.ipynb
+++ b/AE/04-ExtAE-with-MNIST.ipynb
@@ -64,11 +64,11 @@
     "from modules.MNIST          import MNIST\n",
     "from modules.ImagesCallback import ImagesCallback\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/AE4'\n",
-    "datasets_dir = pwk.init('AE4', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('AE4', run_dir)"
    ]
   },
   {
@@ -118,8 +118,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('prepared_dataset', 'dataset_seed', 'scale', 'latent_dim')\n",
-    "pwk.override('train_prop', 'batch_size', 'epochs')"
+    "fidle.override('prepared_dataset', 'dataset_seed', 'scale', 'latent_dim')\n",
+    "fidle.override('train_prop', 'batch_size', 'epochs')"
    ]
   },
   {
@@ -298,13 +298,13 @@
    "source": [
     "# ---- Callback : Images\n",
     "#\n",
-    "pwk.mkdir( run_dir + '/images')\n",
+    "fidle.utils.mkdir( run_dir + '/images')\n",
     "filename = run_dir + '/images/image-{epoch:03d}-{i:02d}.jpg'\n",
     "callback_images = ImagesCallback(filename, x=clean_test[:5], encoder=encoder,decoder=decoder)\n",
     "\n",
     "# ---- Callback : Best model\n",
     "#\n",
-    "pwk.mkdir( run_dir + '/models')\n",
+    "fidle.utils.mkdir( run_dir + '/models')\n",
     "filename = run_dir + '/models/best_model.h5'\n",
     "callback_bestmodel = tf.keras.callbacks.ModelCheckpoint(filepath=filename, verbose=0, save_best_only=True)\n",
     "\n",
@@ -348,7 +348,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={'Loss':['loss', 'ae_loss', 'cnn_loss'],\n",
+    "fidle.scrawler.history(history,  plot={'Loss':['loss', 'ae_loss', 'cnn_loss'],\n",
     "                                 'Validation loss':['val_loss','val_ae_loss', 'val_cnn_loss'], \n",
     "                                 'Accuracy':['cnn_accuracy','val_cnn_accuracy']}, save_as='01-history')"
    ]
@@ -373,20 +373,20 @@
     "        img      = io.imread(filename)\n",
     "        imgs.append(img)      \n",
     "\n",
-    "pwk.subtitle('Real images (clean_test) :')\n",
-    "pwk.plot_images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='02-original-real')\n",
+    "fidle.utils.subtitle('Real images (clean_test) :')\n",
+    "fidle.scrawler.images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='02-original-real')\n",
     "\n",
-    "pwk.subtitle('Noisy images (noisy_test) :')\n",
-    "pwk.plot_images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='03-original-noisy')\n",
+    "fidle.utils.subtitle('Noisy images (noisy_test) :')\n",
+    "fidle.scrawler.images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='03-original-noisy')\n",
     "\n",
-    "pwk.subtitle('Evolution during the training period (denoised_test) :')\n",
-    "pwk.plot_images(imgs, None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, y_padding=0.1, save_as='04-learning')\n",
+    "fidle.utils.subtitle('Evolution during the training period (denoised_test) :')\n",
+    "fidle.scrawler.images(imgs, None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, y_padding=0.1, save_as='04-learning')\n",
     "\n",
-    "pwk.subtitle('Noisy images (noisy_test) :')\n",
-    "pwk.plot_images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n",
+    "fidle.utils.subtitle('Noisy images (noisy_test) :')\n",
+    "fidle.scrawler.images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n",
     "\n",
-    "pwk.subtitle('Real images (clean_test) :')\n",
-    "pwk.plot_images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n"
+    "fidle.utils.subtitle('Real images (clean_test) :')\n",
+    "fidle.scrawler.images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n"
    ]
   },
   {
@@ -450,14 +450,14 @@
     "i=random.randint(0,len(denoised_test)-8)\n",
     "j=i+8\n",
     "\n",
-    "pwk.subtitle('Noisy test images (input):')\n",
-    "pwk.plot_images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
+    "fidle.utils.subtitle('Noisy test images (input):')\n",
+    "fidle.scrawler.images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
     "\n",
-    "pwk.subtitle('Denoised images (output):')\n",
-    "pwk.plot_images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
+    "fidle.utils.subtitle('Denoised images (output):')\n",
+    "fidle.scrawler.images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
     "\n",
-    "pwk.subtitle('Real test images :')\n",
-    "pwk.plot_images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
+    "fidle.utils.subtitle('Real test images :')\n",
+    "fidle.scrawler.images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
    ]
   },
   {
@@ -478,12 +478,12 @@
    "source": [
     "score = model.evaluate(noisy_test, [clean_test, class_test], verbose=0)\n",
     "\n",
-    "pwk.subtitle(\"Accuracy :\")\n",
+    "fidle.utils.subtitle(\"Accuracy :\")\n",
     "print(f'Classification accuracy : {score[3]:4.4f}')\n",
     "\n",
-    "pwk.subtitle(\"Few examples :\")\n",
+    "fidle.utils.subtitle(\"Few examples :\")\n",
     "classid_test  = np.argmax(classcat_test, axis=-1)\n",
-    "pwk.plot_images(noisy_test, class_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=classid_test, save_as='04-predictions')"
+    "fidle.scrawler.images(noisy_test, class_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=classid_test, save_as='04-predictions')"
    ]
   },
   {
@@ -492,7 +492,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/AE/05-ExtAE-with-MNIST.ipynb b/AE/05-ExtAE-with-MNIST.ipynb
index effa77c..a9125af 100644
--- a/AE/05-ExtAE-with-MNIST.ipynb
+++ b/AE/05-ExtAE-with-MNIST.ipynb
@@ -64,11 +64,11 @@
     "from modules.MNIST          import MNIST\n",
     "from modules.ImagesCallback import ImagesCallback\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/AE5'\n",
-    "datasets_dir = pwk.init('AE5', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('AE5', run_dir)"
    ]
   },
   {
@@ -118,8 +118,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('prepared_dataset', 'dataset_seed', 'scale', 'latent_dim')\n",
-    "pwk.override('train_prop', 'batch_size', 'epochs')"
+    "fidle.override('prepared_dataset', 'dataset_seed', 'scale', 'latent_dim')\n",
+    "fidle.override('train_prop', 'batch_size', 'epochs')"
    ]
   },
   {
@@ -329,13 +329,13 @@
    "source": [
     "# ---- Callback : Images\n",
     "#\n",
-    "pwk.mkdir( run_dir + '/images')\n",
+    "fidle.utils.mkdir( run_dir + '/images')\n",
     "filename = run_dir + '/images/image-{epoch:03d}-{i:02d}.jpg'\n",
     "callback_images = ImagesCallback(filename, x=clean_test[:5], encoder=encoder,decoder=decoder)\n",
     "\n",
     "# ---- Callback : Best model\n",
     "#\n",
-    "pwk.mkdir( run_dir + '/models')\n",
+    "fidle.utils.mkdir( run_dir + '/models')\n",
     "filename = run_dir + '/models/best_model.h5'\n",
     "callback_bestmodel = tf.keras.callbacks.ModelCheckpoint(filepath=filename, verbose=0, save_best_only=True)\n",
     "\n",
@@ -379,7 +379,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={'Loss':['loss', 'ae_loss', 'cnn_loss'],\n",
+    "fidle.scrawler.history(history,  plot={'Loss':['loss', 'ae_loss', 'cnn_loss'],\n",
     "                                 'Validation loss':['val_loss','val_ae_loss', 'val_cnn_loss'], \n",
     "                                 'Accuracy':['cnn_accuracy','val_cnn_accuracy']}, save_as='01-history')"
    ]
@@ -404,20 +404,20 @@
     "        img      = io.imread(filename)\n",
     "        imgs.append(img)      \n",
     "\n",
-    "pwk.subtitle('Real images (clean_test) :')\n",
-    "pwk.plot_images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='02-original-real')\n",
+    "fidle.utils.subtitle('Real images (clean_test) :')\n",
+    "fidle.scrawler.images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='02-original-real')\n",
     "\n",
-    "pwk.subtitle('Noisy images (noisy_test) :')\n",
-    "pwk.plot_images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='03-original-noisy')\n",
+    "fidle.utils.subtitle('Noisy images (noisy_test) :')\n",
+    "fidle.scrawler.images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as='03-original-noisy')\n",
     "\n",
-    "pwk.subtitle('Evolution during the training period (denoised_test) :')\n",
-    "pwk.plot_images(imgs, None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, y_padding=0.1, save_as='04-learning')\n",
+    "fidle.utils.subtitle('Evolution during the training period (denoised_test) :')\n",
+    "fidle.scrawler.images(imgs, None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, y_padding=0.1, save_as='04-learning')\n",
     "\n",
-    "pwk.subtitle('Noisy images (noisy_test) :')\n",
-    "pwk.plot_images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n",
+    "fidle.utils.subtitle('Noisy images (noisy_test) :')\n",
+    "fidle.scrawler.images(noisy_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n",
     "\n",
-    "pwk.subtitle('Real images (clean_test) :')\n",
-    "pwk.plot_images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n"
+    "fidle.utils.subtitle('Real images (clean_test) :')\n",
+    "fidle.scrawler.images(clean_test[:5], None, indices='all', columns=5, x_size=2,y_size=2, interpolation=None, save_as=None)\n"
    ]
   },
   {
@@ -481,14 +481,14 @@
     "i=random.randint(0,len(denoised_test)-8)\n",
     "j=i+8\n",
     "\n",
-    "pwk.subtitle('Noisy test images (input):')\n",
-    "pwk.plot_images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
+    "fidle.utils.subtitle('Noisy test images (input):')\n",
+    "fidle.scrawler.images(noisy_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='05-test-noisy')\n",
     "\n",
-    "pwk.subtitle('Denoised images (output):')\n",
-    "pwk.plot_images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
+    "fidle.utils.subtitle('Denoised images (output):')\n",
+    "fidle.scrawler.images(denoised_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='06-test-predict')\n",
     "\n",
-    "pwk.subtitle('Real test images :')\n",
-    "pwk.plot_images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
+    "fidle.utils.subtitle('Real test images :')\n",
+    "fidle.scrawler.images(clean_test[i:j], None, indices='all', columns=8, x_size=2,y_size=2, interpolation=None, save_as='07-test-real')"
    ]
   },
   {
@@ -509,12 +509,12 @@
    "source": [
     "score = model.evaluate(noisy_test, [clean_test, class_test], verbose=0)\n",
     "\n",
-    "pwk.subtitle(\"Accuracy :\")\n",
+    "fidle.utils.subtitle(\"Accuracy :\")\n",
     "print(f'Classification accuracy : {score[3]:4.4f}')\n",
     "\n",
-    "pwk.subtitle(\"Few examples :\")\n",
+    "fidle.utils.subtitle(\"Few examples :\")\n",
     "classid_test  = np.argmax(classcat_test, axis=-1)\n",
-    "pwk.plot_images(noisy_test, class_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=classid_test, save_as='04-predictions')"
+    "fidle.scrawler.images(noisy_test, class_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=classid_test, save_as='04-predictions')"
    ]
   },
   {
@@ -523,7 +523,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/BHPD/01-DNN-Regression.ipynb b/BHPD/01-DNN-Regression.ipynb
index 952c745..c6e704f 100644
--- a/BHPD/01-DNN-Regression.ipynb
+++ b/BHPD/01-DNN-Regression.ipynb
@@ -77,10 +77,10 @@
     "import pandas as pd\n",
     "import os,sys\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('BHPD1')"
+    "# Init Fidle environment\n",
+    "run_id, run_dir, datasets_dir = fidle.init('BHPD1')"
    ]
   },
   {
@@ -115,7 +115,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('fit_verbosity')"
+    "fidle.override('fit_verbosity')"
    ]
   },
   {
@@ -244,19 +244,19 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "  def get_model_v1(shape):\n",
-    "    \n",
-    "    model = keras.models.Sequential()\n",
-    "    model.add(keras.layers.Input(shape, name=\"InputLayer\"))\n",
-    "    model.add(keras.layers.Dense(32, activation='relu', name='Dense_n1'))\n",
-    "    model.add(keras.layers.Dense(64, activation='relu', name='Dense_n2'))\n",
-    "    model.add(keras.layers.Dense(32, activation='relu', name='Dense_n3'))\n",
-    "    model.add(keras.layers.Dense(1, name='Output'))\n",
-    "    \n",
-    "    model.compile(optimizer = 'adam',\n",
-    "                  loss      = 'mse',\n",
-    "                  metrics   = ['mae', 'mse'] )\n",
-    "    return model"
+    "def get_model_v1(shape):\n",
+    "  \n",
+    "  model = keras.models.Sequential()\n",
+    "  model.add(keras.layers.Input(shape, name=\"InputLayer\"))\n",
+    "  model.add(keras.layers.Dense(32, activation='relu', name='Dense_n1'))\n",
+    "  model.add(keras.layers.Dense(64, activation='relu', name='Dense_n2'))\n",
+    "  model.add(keras.layers.Dense(32, activation='relu', name='Dense_n3'))\n",
+    "  model.add(keras.layers.Dense(1, name='Output'))\n",
+    "  \n",
+    "  model.compile(optimizer = 'adam',\n",
+    "                loss      = 'mse',\n",
+    "                metrics   = ['mae', 'mse'] )\n",
+    "  return model"
    ]
   },
   {
@@ -360,9 +360,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, plot={'MSE' :['mse', 'val_mse'],\n",
-    "                                'MAE' :['mae', 'val_mae'],\n",
-    "                                'LOSS':['loss','val_loss']}, save_as='01-history')"
+    "fidle.scrawler.history( history, plot={'MSE' :['mse', 'val_mse'],\n",
+    "                        'MAE' :['mae', 'val_mae'],\n",
+    "                        'LOSS':['loss','val_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -405,7 +405,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -419,7 +419,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -433,7 +433,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.7"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/BHPD/02-DNN-Regression-Premium.ipynb b/BHPD/02-DNN-Regression-Premium.ipynb
index 06049de..4e48b2c 100644
--- a/BHPD/02-DNN-Regression-Premium.ipynb
+++ b/BHPD/02-DNN-Regression-Premium.ipynb
@@ -76,10 +76,10 @@
     "from IPython.display import Markdown\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('BHPD2')"
+    "# Init Fidle environment\n",
+    "run_id, run_dir, datasets_dir = fidle.init('BHPD2')"
    ]
   },
   {
@@ -114,7 +114,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('fit_verbosity')"
+    "fidle.override('fit_verbosity')"
    ]
   },
   {
@@ -239,18 +239,18 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "  def get_model_v1(shape):\n",
-    "    \n",
-    "    model = keras.models.Sequential()\n",
-    "    model.add(keras.layers.Input(shape, name=\"InputLayer\"))\n",
-    "    model.add(keras.layers.Dense(64, activation='relu', name='Dense_n1'))\n",
-    "    model.add(keras.layers.Dense(64, activation='relu', name='Dense_n2'))\n",
-    "    model.add(keras.layers.Dense(1, name='Output'))\n",
-    "    \n",
-    "    model.compile(optimizer = 'rmsprop',\n",
-    "                  loss      = 'mse',\n",
-    "                  metrics   = ['mae', 'mse'] )\n",
-    "    return model"
+    "def get_model_v1(shape):\n",
+    "  \n",
+    "  model = keras.models.Sequential()\n",
+    "  model.add(keras.layers.Input(shape, name=\"InputLayer\"))\n",
+    "  model.add(keras.layers.Dense(64, activation='relu', name='Dense_n1'))\n",
+    "  model.add(keras.layers.Dense(64, activation='relu', name='Dense_n2'))\n",
+    "  model.add(keras.layers.Dense(1, name='Output'))\n",
+    "\n",
+    "  model.compile(optimizer = 'rmsprop',\n",
+    "                loss      = 'mse',\n",
+    "                metrics   = ['mae', 'mse'] )\n",
+    "  return model"
    ]
   },
   {
@@ -361,9 +361,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, plot={'MSE' :['mse', 'val_mse'],\n",
-    "                                'MAE' :['mae', 'val_mae'],\n",
-    "                                'LOSS':['loss','val_loss']}, save_as='01-history')"
+    "fidle.scrawler.history( history, plot={'MSE' :['mse', 'val_mse'],\n",
+    "                        'MAE' :['mae', 'val_mae'],\n",
+    "                        'LOSS':['loss','val_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -448,7 +448,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -462,7 +462,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -476,7 +476,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.7"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/BHPD_PyTorch/01-DNN-Regression_PyTorch.ipynb b/BHPD_PyTorch/01-DNN-Regression_PyTorch.ipynb
index 5ea7cd2..d3e5d4b 100644
--- a/BHPD_PyTorch/01-DNN-Regression_PyTorch.ipynb
+++ b/BHPD_PyTorch/01-DNN-Regression_PyTorch.ipynb
@@ -67,7 +67,7 @@
     "\n",
     "import pandas as pd\n",
     "\n",
-    "sys.path.append('..')\n",
+    "# Init Fidle environment\n",
     "import fidle.pwk as ooo\n",
     "\n",
     "from fidle_pwk_additional import convergence_history_MSELoss\n"
diff --git a/DCGAN/01-DCGAN-Draw-me-a-sheep.ipynb b/DCGAN/01-DCGAN-Draw-me-a-sheep.ipynb
index 91ce1ca..e58707e 100644
--- a/DCGAN/01-DCGAN-Draw-me-a-sheep.ipynb
+++ b/DCGAN/01-DCGAN-Draw-me-a-sheep.ipynb
@@ -60,11 +60,11 @@
     "from modules.models    import DCGAN\n",
     "from modules.callbacks import ImagesCallback\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/SHEEP1.001'                  # Output directory\n",
-    "datasets_dir = pwk.init('SHEEP1', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('SHEEP1', run_dir)"
    ]
   },
   {
@@ -106,7 +106,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'latent_dim', 'epochs', 'batch_size', 'num_img', 'fit_verbosity')"
+    "fidle.override('scale', 'latent_dim', 'epochs', 'batch_size', 'num_img', 'fit_verbosity')"
    ]
   },
   {
@@ -153,7 +153,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(x_data.reshape(-1,28,28), indices=range(72), columns=12, x_size=1, y_size=1, \n",
+    "fidle.scrawler.images(x_data.reshape(-1,28,28), indices=range(72), columns=12, x_size=1, y_size=1, \n",
     "                y_padding=0,spines_alpha=0, save_as='01-Sheeps')"
    ]
   },
@@ -294,7 +294,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={'loss':['d_loss','g_loss']}, save_as='01-history')"
+    "fidle.scrawler.history(history,  plot={'loss':['d_loss','g_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -310,7 +310,7 @@
     "        image    = io.imread(filename)\n",
     "        images.append(image)      \n",
     "\n",
-    "pwk.plot_images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
+    "fidle.scrawler.images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
    ]
   },
   {
@@ -362,7 +362,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
+    "fidle.scrawler.images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
    ]
   },
   {
@@ -371,7 +371,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/DCGAN/02-WGANGP-Draw-me-a-sheep.ipynb b/DCGAN/02-WGANGP-Draw-me-a-sheep.ipynb
index b1a7bb5..71316e5 100644
--- a/DCGAN/02-WGANGP-Draw-me-a-sheep.ipynb
+++ b/DCGAN/02-WGANGP-Draw-me-a-sheep.ipynb
@@ -60,11 +60,11 @@
     "from modules.models    import WGANGP\n",
     "from modules.callbacks import ImagesCallback\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/SHEEP2.001'                  # Output directory\n",
-    "datasets_dir = pwk.init('SHEEP2', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('SHEEP2', run_dir)"
    ]
   },
   {
@@ -107,7 +107,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'latent_dim', 'epochs', 'batch_size', 'num_img', 'fit_verbosity')"
+    "fidle.override('scale', 'latent_dim', 'epochs', 'batch_size', 'num_img', 'fit_verbosity')"
    ]
   },
   {
@@ -154,7 +154,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(x_data.reshape(-1,28,28), indices=range(72), columns=12, x_size=1, y_size=1, \n",
+    "fidle.scrawler.images(x_data.reshape(-1,28,28), indices=range(72), columns=12, x_size=1, y_size=1, \n",
     "                y_padding=0,spines_alpha=0, save_as='01-Sheeps')"
    ]
   },
@@ -297,7 +297,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={'loss':['d_loss','g_loss']}, save_as='01-history')"
+    "fidle.scrawler.history(history,  plot={'loss':['d_loss','g_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -313,7 +313,7 @@
     "        image    = io.imread(filename)\n",
     "        images.append(image)      \n",
     "\n",
-    "pwk.plot_images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
+    "fidle.scrawler.images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
    ]
   },
   {
@@ -365,7 +365,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
+    "fidle.scrawler.images(images, None, indices='all', columns=num_img, x_size=1,y_size=1, interpolation=None, y_padding=0, spines_alpha=0, save_as='04-learning')"
    ]
   },
   {
@@ -374,7 +374,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/GTSRB/01-Preparation-of-data.ipynb b/GTSRB/01-Preparation-of-data.ipynb
index 56eaad9..3f7a7d3 100644
--- a/GTSRB/01-Preparation-of-data.ipynb
+++ b/GTSRB/01-Preparation-of-data.ipynb
@@ -56,10 +56,10 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('GTSRB1')"
+    "# Init Fidle environment\n",
+    "run_id, run_dir, datasets_dir = fidle.init('GTSRB1')"
    ]
   },
   {
@@ -112,7 +112,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'output_dir', 'progress_verbosity')"
+    "fidle.override('scale', 'output_dir', 'progress_verbosity')"
    ]
   },
   {
@@ -182,7 +182,7 @@
     "    for filename in filenames:\n",
     "        image=io.imread(f'{path}/{filename}')\n",
     "        x.append(image)\n",
-    "        pwk.update_progress(name,len(x),len(filenames), verbosity=progress_verbosity)\n",
+    "        fidle.utils.update_progress(name,len(x),len(filenames), verbosity=progress_verbosity)\n",
     "    \n",
     "    # ---- Return\n",
     "    #\n",
@@ -209,7 +209,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono=fidle.Chrono()\n",
+    "\n",
+    "chrono.start()\n",
     "\n",
     "# ---- Read datasets\n",
     "\n",
@@ -219,7 +221,7 @@
     "    \n",
     "# ---- Shuffle train set\n",
     "\n",
-    "x_train, y_train = pwk.shuffle_np_dataset(x_train, y_train)\n",
+    "x_train, y_train = fidle.utils.shuffle_np_dataset(x_train, y_train)\n",
     "\n",
     "# ---- Sort Meta\n",
     "\n",
@@ -227,7 +229,7 @@
     "combined.sort(key=lambda x: x[1])\n",
     "x_meta,y_meta = zip(*combined)\n",
     "\n",
-    "pwk.chrono_show()"
+    "chrono.show()"
    ]
   },
   {
@@ -296,7 +298,7 @@
     "plt.gca().set(title='Sizes in Kpixels - Train=[{:5.2f}, {:5.2f}]'.format(min(train_size),max(train_size)), \n",
     "              ylabel='Population', xlim=[0,30])\n",
     "plt.legend(['Train','Test'])\n",
-    "pwk.save_fig('01-stats-sizes')\n",
+    "fidle.scrawler.save_fig('01-stats-sizes')\n",
     "plt.show()\n",
     "\n",
     "# ------ Statistics / ratio lx/ly\n",
@@ -305,7 +307,7 @@
     "plt.gca().set(title='Ratio lx/ly - Train=[{:5.2f}, {:5.2f}]'.format(min(train_ratio),max(train_ratio)), \n",
     "              ylabel='Population', xlim=[0.8,1.2])\n",
     "plt.legend(['Train','Test'])\n",
-    "pwk.save_fig('02-stats-ratios')\n",
+    "fidle.scrawler.save_fig('02-stats-ratios')\n",
     "plt.show()\n",
     "\n",
     "# ------ Statistics / lx\n",
@@ -314,7 +316,7 @@
     "plt.gca().set(title='Images lx - Train=[{:5.2f}, {:5.2f}]'.format(min(train_lx),max(train_lx)), \n",
     "              ylabel='Population', xlim=[20,150])\n",
     "plt.legend(['Train','Test'])\n",
-    "pwk.save_fig('03-stats-lx')\n",
+    "fidle.scrawler.save_fig('03-stats-lx')\n",
     "plt.show()\n",
     "\n",
     "# ------ Statistics / ly\n",
@@ -323,7 +325,7 @@
     "plt.gca().set(title='Images ly - Train=[{:5.2f}, {:5.2f}]'.format(min(train_ly),max(train_ly)), \n",
     "              ylabel='Population', xlim=[20,150])\n",
     "plt.legend(['Train','Test'])\n",
-    "pwk.save_fig('04-stats-ly')\n",
+    "fidle.scrawler.save_fig('04-stats-ly')\n",
     "plt.show()\n",
     "\n",
     "# ------ Statistics / classId\n",
@@ -331,7 +333,7 @@
     "plt.hist([y_train,y_test], bins=43)\n",
     "plt.gca().set(title='ClassesId', ylabel='Population', xlim=[0,43])\n",
     "plt.legend(['Train','Test'])\n",
-    "pwk.save_fig('05-stats-classes')\n",
+    "fidle.scrawler.save_fig('05-stats-classes')\n",
     "plt.show()"
    ]
   },
@@ -349,8 +351,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(x_meta,y_meta, range(43), columns=8, x_size=2, y_size=2, \n",
-    "                                colorbar=False, y_pred=None, cm='binary', save_as='06-meta-signs')"
+    "fidle.scrawler.images( x_meta,y_meta, range(43), columns=8, x_size=2, y_size=2, \n",
+    "                       colorbar=False, y_pred=None, cm='binary', save_as='06-meta-signs')"
    ]
   },
   {
@@ -369,8 +371,8 @@
     "# ---- Get and show few images\n",
     "\n",
     "samples = [ random.randint(0,len(x_train)-1) for i in range(32)]\n",
-    "pwk.plot_images(x_train,y_train, samples, columns=8, x_size=2, y_size=2, \n",
-    "                colorbar=False, y_pred=None, cm='binary', save_as='07-real-signs')\n"
+    "fidle.scrawler.images( x_train,y_train, samples, columns=8, x_size=2, y_size=2, \n",
+    "                       colorbar=False, y_pred=None, cm='binary', save_as='07-real-signs')\n"
    ]
   },
   {
@@ -451,7 +453,7 @@
     "            \n",
     "        # ---- Add image in list of list\n",
     "        out.append(img)\n",
-    "        pwk.update_progress('Enhancement: ',len(out),len(images))\n",
+    "        fidle.utils.update_progress('Enhancement: ',len(out),len(images))\n",
     "\n",
     "    # ---- Reshape images\n",
     "    #     (-1, width,height,1) for L\n",
@@ -488,20 +490,20 @@
     "datasets['L-LHE']    = images_enhancement( x_samples, width=25, height=25, mode='L-LHE'  )\n",
     "datasets['L-CLAHE']  = images_enhancement( x_samples, width=25, height=25, mode='L-CLAHE'  )\n",
     "\n",
-    "pwk.subtitle('EXPECTED')\n",
+    "fidle.utils.subtitle('EXPECTED')\n",
     "x_expected=[ x_meta[i] for i in y_samples]\n",
-    "pwk.plot_images(x_expected, y_samples, range(12), columns=12, x_size=1, y_size=1,\n",
+    "fidle.scrawler.images(x_expected, y_samples, range(12), columns=12, x_size=1, y_size=1,\n",
     "                colorbar=False, y_pred=None, cm='binary', save_as='08-expected')\n",
     "\n",
-    "pwk.subtitle('ORIGINAL')\n",
-    "pwk.plot_images(x_samples,  y_samples, range(12), columns=12, x_size=1, y_size=1, \n",
+    "fidle.utils.subtitle('ORIGINAL')\n",
+    "fidle.scrawler.images(x_samples,  y_samples, range(12), columns=12, x_size=1, y_size=1, \n",
     "                colorbar=False, y_pred=None, cm='binary', save_as='09-original')\n",
     "\n",
-    "pwk.subtitle('ENHANCED')\n",
+    "fidle.utils.subtitle('ENHANCED')\n",
     "n=10\n",
     "for k,d in datasets.items():\n",
     "    print(\"dataset : {}  min,max=[{:.3f},{:.3f}]  shape={}\".format(k,d.min(),d.max(), d.shape))\n",
-    "    pwk.plot_images(d, y_samples, range(12), columns=12, x_size=1, y_size=1, \n",
+    "    fidle.scrawler.images(d, y_samples, range(12), columns=12, x_size=1, y_size=1, \n",
     "                    colorbar=False, y_pred=None, cm='binary', save_as=f'{n}-enhanced-{k}')\n",
     "    n+=1\n"
    ]
@@ -549,26 +551,26 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono.start()\n",
     "\n",
     "n_train = int( len(x_train)*scale )\n",
     "n_test  = int( len(x_test)*scale )\n",
     "\n",
-    "pwk.subtitle('Parameters :')\n",
+    "fidle.utils.subtitle('Parameters :')\n",
     "print(f'Scale is : {scale}')\n",
     "print(f'x_train length is : {n_train}')\n",
     "print(f'x_test  length is : {n_test}')\n",
     "print(f'output dir is     : {output_dir}\\n')\n",
     "\n",
-    "pwk.subtitle('Running...')\n",
+    "fidle.utils.subtitle('Running...')\n",
     "\n",
-    "pwk.mkdir(output_dir)\n",
+    "fidle.utils.mkdir(output_dir)\n",
     "\n",
     "for s in [24, 48]:\n",
     "    for m in ['RGB', 'RGB-HE', 'L', 'L-LHE']:\n",
     "        # ---- A nice dataset name\n",
     "        filename = f'{output_dir}/set-{s}x{s}-{m}.h5'\n",
-    "        pwk.subtitle(f'Dataset : {filename}')\n",
+    "        fidle.utils.subtitle(f'Dataset : {filename}')\n",
     "        \n",
     "        # ---- Enhancement\n",
     "        #      Note : x_train is a numpy array of python objects (images with <> sizes)\n",
@@ -584,7 +586,7 @@
     "\n",
     "x_train_new,x_test_new=0,0\n",
     "\n",
-    "pwk.chrono_show()"
+    "chrono.show()"
    ]
   },
   {
@@ -600,7 +602,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono.start()\n",
     "\n",
     "dataset='set-48x48-L'\n",
     "samples=range(24)\n",
@@ -610,11 +612,11 @@
     "    y_tmp = f['y_train'][:]\n",
     "    print(\"dataset loaded from h5 file.\")\n",
     "\n",
-    "pwk.plot_images(x_tmp,y_tmp, samples, columns=8, x_size=2, y_size=2, \n",
+    "fidle.scrawler.images(x_tmp,y_tmp, samples, columns=8, x_size=2, y_size=2, \n",
     "                colorbar=False, y_pred=None, cm='binary', save_as='16-enhanced_images')\n",
     "x_tmp,y_tmp=0,0\n",
     "\n",
-    "pwk.chrono_show()"
+    "chrono.show()"
    ]
   },
   {
@@ -623,7 +625,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -636,11 +638,8 @@
   }
  ],
  "metadata": {
-  "interpreter": {
-   "hash": "8e38643e33497db9a306e3f311fa98cb1e65371278ca73ee4ea0c76aa5a4f387"
-  },
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -654,7 +653,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.7"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/GTSRB/02-First-convolutions.ipynb b/GTSRB/02-First-convolutions.ipynb
index 1fa325f..426d516 100644
--- a/GTSRB/02-First-convolutions.ipynb
+++ b/GTSRB/02-First-convolutions.ipynb
@@ -50,11 +50,10 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
-    "run_dir = './run/GTSRB2.001'\n",
-    "datasets_dir = pwk.init('GTSRB2', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('GTSRB2')"
    ]
   },
   {
@@ -96,7 +95,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('enhanced_dir', 'dataset_name', 'batch_size', 'epochs', 'scale', 'fit_verbosity')"
+    "fidle.override('enhanced_dir', 'dataset_name', 'batch_size', 'epochs', 'scale', 'fit_verbosity')"
    ]
   },
   {
@@ -121,7 +120,8 @@
     "        dataset_name : dataset name, without .h5\n",
     "    Returns:    x_train,y_train, x_test,y_test data, x_meta,y_meta'''\n",
     "    # ---- Read dataset\n",
-    "    pwk.chrono_start()\n",
+    "    chrono=fidle.Chrono()\n",
+    "    chrono.start()\n",
     "    filename = f'{enhanced_dir}/{dataset_name}.h5'\n",
     "    with  h5py.File(filename,'r') as f:\n",
     "        x_train = f['x_train'][:]\n",
@@ -132,11 +132,11 @@
     "        y_meta  = f['y_meta'][:]\n",
     "    print(x_train.shape, y_train.shape)\n",
     "    # ---- Shuffle\n",
-    "    x_train,y_train=pwk.shuffle_np_dataset(x_train,y_train)\n",
+    "    x_train,y_train=fidle.utils.shuffle_np_dataset(x_train,y_train)\n",
     "\n",
     "    # ---- done\n",
-    "    duration = pwk.chrono_stop(hdelay=True)\n",
-    "    size     = pwk.hsize(os.path.getsize(filename))\n",
+    "    duration = chrono.get_delay()\n",
+    "    size     = fidle.utils.hsize(os.path.getsize(filename))\n",
     "    print(f'Dataset \"{dataset_name}\" is loaded and shuffled. ({size} in {duration})')\n",
     "    return x_train,y_train, x_test,y_test, x_meta,y_meta\n",
     "\n",
@@ -146,7 +146,7 @@
     "\n",
     "# ---- Rescale \n",
     "#\n",
-    "x_train,y_train, x_test,y_test = pwk.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)"
+    "x_train,y_train, x_test,y_test = fidle.utils.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)"
    ]
   },
   {
@@ -168,8 +168,8 @@
     "print(\"x_test  : \", x_test.shape)\n",
     "print(\"y_test  : \", y_test.shape)\n",
     "\n",
-    "pwk.plot_images(x_train, y_train, range(12), columns=6,  x_size=2, y_size=2, save_as='01-dataset-medium')\n",
-    "pwk.plot_images(x_train, y_train, range(36), columns=12, x_size=1, y_size=1, save_as='02-dataset-small')"
+    "fidle.scrawler.images(x_train, y_train, range(12), columns=6,  x_size=2, y_size=2, save_as='01-dataset-medium')\n",
+    "fidle.scrawler.images(x_train, y_train, range(36), columns=12, x_size=1, y_size=1, save_as='02-dataset-small')"
    ]
   },
   {
@@ -317,10 +317,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono=fidle.Chrono()\n",
+    "chrono.start()\n",
     "\n",
     "# ---- Shuffle train data\n",
-    "x_train,y_train=pwk.shuffle_np_dataset(x_train,y_train)\n",
+    "x_train,y_train=fidle.utils.shuffle_np_dataset(x_train,y_train)\n",
     "\n",
     "# ---- Train\n",
     "history = model.fit(  x_train, y_train,\n",
@@ -329,7 +330,7 @@
     "                      verbose         = fit_verbosity,\n",
     "                      validation_data = (x_test, y_test))\n",
     "\n",
-    "pwk.chrono_show()"
+    "chrono.show()"
    ]
   },
   {
@@ -367,7 +368,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -395,11 +396,8 @@
   }
  ],
  "metadata": {
-  "interpreter": {
-   "hash": "8e38643e33497db9a306e3f311fa98cb1e65371278ca73ee4ea0c76aa5a4f387"
-  },
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -413,7 +411,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.7"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/GTSRB/03-Tracking-and-visualizing.ipynb b/GTSRB/03-Tracking-and-visualizing.ipynb
index abd3ea0..cc2f686 100644
--- a/GTSRB/03-Tracking-and-visualizing.ipynb
+++ b/GTSRB/03-Tracking-and-visualizing.ipynb
@@ -50,11 +50,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/GTSRB3.001'\n",
-    "datasets_dir = pwk.init('GTSRB3', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('GTSRB3', run_dir)"
    ]
   },
   {
@@ -96,7 +96,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('enhanced_dir', 'dataset_name', 'batch_size', 'epochs', 'scale', 'fit_verbosity')"
+    "fidle.override('enhanced_dir', 'dataset_name', 'batch_size', 'epochs', 'scale', 'fit_verbosity')"
    ]
   },
   {
@@ -122,7 +122,8 @@
     "        dataset_name : dataset name, without .h5\n",
     "    Returns:    x_train,y_train, x_test,y_test data, x_meta,y_meta'''\n",
     "    # ---- Read dataset\n",
-    "    pwk.chrono_start()\n",
+    "    chrono=fidle.Chrono()\n",
+    "    chrono.start()\n",
     "    filename = f'{enhanced_dir}/{dataset_name}.h5'\n",
     "    with  h5py.File(filename,'r') as f:\n",
     "        x_train = f['x_train'][:]\n",
@@ -133,11 +134,11 @@
     "        y_meta  = f['y_meta'][:]\n",
     "    print(x_train.shape, y_train.shape)\n",
     "    # ---- Shuffle\n",
-    "    x_train,y_train=pwk.shuffle_np_dataset(x_train,y_train)\n",
+    "    x_train,y_train=fidle.utils.shuffle_np_dataset(x_train,y_train)\n",
     "\n",
     "    # ---- done\n",
-    "    duration = pwk.chrono_stop(hdelay=True)\n",
-    "    size     = pwk.hsize(os.path.getsize(filename))\n",
+    "    duration = chrono.get_delay()\n",
+    "    size     = fidle.utils.hsize(os.path.getsize(filename))\n",
     "    print(f'Dataset \"{dataset_name}\" is loaded and shuffled. ({size} in {duration})')\n",
     "    return x_train,y_train, x_test,y_test, x_meta,y_meta\n",
     "\n",
@@ -147,7 +148,7 @@
     "\n",
     "# ---- Rescale \n",
     "#\n",
-    "x_train,y_train, x_test,y_test = pwk.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)"
+    "x_train,y_train, x_test,y_test = fidle.utils.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)"
    ]
   },
   {
@@ -169,8 +170,8 @@
     "print(\"x_test  : \", x_test.shape)\n",
     "print(\"y_test  : \", y_test.shape)\n",
     "\n",
-    "pwk.plot_images(x_train, y_train, range(12), columns=6,  x_size=2, y_size=2, save_as='01-dataset-medium')\n",
-    "pwk.plot_images(x_train, y_train, range(36), columns=12, x_size=1, y_size=1, save_as='02-dataset-small')"
+    "fidle.scrawler.images(x_train, y_train, range(12), columns=6,  x_size=2, y_size=2, save_as='01-dataset-medium')\n",
+    "fidle.scrawler.images(x_train, y_train, range(36), columns=12, x_size=1, y_size=1, save_as='02-dataset-small')"
    ]
   },
   {
@@ -233,11 +234,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.mkdir(run_dir + '/models')\n",
-    "pwk.mkdir(run_dir + '/logs')\n",
+    "fidle.utils.mkdir(run_dir + '/models')\n",
+    "fidle.utils.mkdir(run_dir + '/logs')\n",
     "\n",
     "# ---- Callback tensorboard\n",
-    "log_dir = run_dir + \"/logs/tb_\" + pwk.tag_now()\n",
+    "log_dir = run_dir + \"/logs/tb_\" + Chrono.tag_now()\n",
     "tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)\n",
     "\n",
     "# ---- Callback ModelCheckpoint - Save best model\n",
@@ -306,10 +307,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono=fidle.Chrono()\n",
+    "chrono.start()\n",
     "\n",
     "# ---- Shuffle train data\n",
-    "x_train,y_train=pwk.shuffle_np_dataset(x_train,y_train)\n",
+    "x_train,y_train=fidle.utils.shuffle_np_dataset(x_train,y_train)\n",
     "\n",
     "# ---- Train\n",
     "# Note: To be faster in our example, we can take only 2000 values\n",
@@ -323,7 +325,7 @@
     "\n",
     "model.save(f'{run_dir}/models/last-model.h5')\n",
     "\n",
-    "pwk.chrono_show()"
+    "chrono.show()"
    ]
   },
   {
@@ -369,7 +371,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, save_as='03-history')"
+    "fidle.scrawler.history(history, save_as='03-history')"
    ]
   },
   {
@@ -388,7 +390,7 @@
     "y_sigmoid = model.predict(x_test)\n",
     "y_pred    = np.argmax(y_sigmoid, axis=-1)\n",
     "\n",
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(43), figsize=(16, 16),normalize=False, save_as='04-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(43), figsize=(16, 16),normalize=False, save_as='04-confusion-matrix')"
    ]
   },
   {
@@ -482,7 +484,7 @@
     "plt.ylim((0,1))\n",
     "plt.xlabel('Class')\n",
     "plt.title('Trafic Sign prediction')\n",
-    "pwk.save_fig('05-prediction-proba')\n",
+    "fidle.scrawler.save_fig('05-prediction-proba')\n",
     "plt.show()\n",
     "\n",
     "# ---- Predict class\n",
@@ -492,7 +494,7 @@
     "# ---- Show result\n",
     "#\n",
     "print(\"\\nThe image :               Prediction :            Real stuff:\")\n",
-    "pwk.plot_images([x,x_meta[p], x_meta[y]], [p,p,y], range(3),  columns=3,  x_size=3, y_size=2, save_as='06-prediction-images')\n",
+    "fidle.scrawler.images([x,x_meta[p], x_meta[y]], [p,p,y], range(3),  columns=3,  x_size=3, y_size=2, save_as='06-prediction-images')\n",
     "\n",
     "if p==y:\n",
     "    print(\"YEEES ! that's right!\")\n",
@@ -506,7 +508,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/GTSRB/04-Data-augmentation.ipynb b/GTSRB/04-Data-augmentation.ipynb
index 2a5fa3f..bc9d39a 100644
--- a/GTSRB/04-Data-augmentation.ipynb
+++ b/GTSRB/04-Data-augmentation.ipynb
@@ -48,11 +48,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/GTSRB4.001'\n",
-    "datasets_dir = pwk.init('GTSRB4', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('GTSRB4', run_dir)"
    ]
   },
   {
@@ -93,7 +93,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('enhanced_dir', 'dataset_name', 'batch_size', 'epochs', 'scale', 'fit_verbosity')"
+    "fidle.override('enhanced_dir', 'dataset_name', 'batch_size', 'epochs', 'scale', 'fit_verbosity')"
    ]
   },
   {
@@ -119,7 +119,8 @@
     "        dataset_name : dataset name, without .h5\n",
     "    Returns:    x_train,y_train, x_test,y_test data, x_meta,y_meta'''\n",
     "    # ---- Read dataset\n",
-    "    pwk.chrono_start()\n",
+    "    chrono=fidle.Chrono()\n",
+    "    chrono.start()\n",
     "    filename = f'{enhanced_dir}/{dataset_name}.h5'\n",
     "    with  h5py.File(filename,'r') as f:\n",
     "        x_train = f['x_train'][:]\n",
@@ -130,11 +131,11 @@
     "        y_meta  = f['y_meta'][:]\n",
     "    print(x_train.shape, y_train.shape)\n",
     "    # ---- Shuffle\n",
-    "    x_train,y_train=pwk.shuffle_np_dataset(x_train,y_train)\n",
+    "    x_train,y_train=fidle.utils.shuffle_np_dataset(x_train,y_train)\n",
     "\n",
     "    # ---- done\n",
-    "    duration = pwk.chrono_stop(hdelay=True)\n",
-    "    size     = pwk.hsize(os.path.getsize(filename))\n",
+    "    duration = chrono.get_delay()\n",
+    "    size     = fidle.utils.hsize(os.path.getsize(filename))\n",
     "    print(f'Dataset \"{dataset_name}\" is loaded and shuffled. ({size} in {duration})')\n",
     "    return x_train,y_train, x_test,y_test, x_meta,y_meta\n",
     "\n",
@@ -144,7 +145,7 @@
     "\n",
     "# ---- Rescale \n",
     "#\n",
-    "x_train,y_train, x_test,y_test = pwk.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)"
+    "x_train,y_train, x_test,y_test = fidle.utils.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)"
    ]
   },
   {
@@ -199,11 +200,11 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.mkdir(run_dir + '/models')\n",
-    "pwk.mkdir(run_dir + '/logs')\n",
+    "fidle.utils.mkdir(run_dir + '/models')\n",
+    "fidle.utils.mkdir(run_dir + '/logs')\n",
     "\n",
     "# ---- Callback tensorboard\n",
-    "log_dir = run_dir + \"/logs/tb_\" + pwk.tag_now()\n",
+    "log_dir = run_dir + \"/logs/tb_\" + Chrono.tag_now()\n",
     "tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)\n",
     "\n",
     "# ---- Callback ModelCheckpoint - Save best model\n",
@@ -294,7 +295,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono=fidle.Chrono()\n",
+    "chrono.start()\n",
     "\n",
     "history = model.fit(  datagen.flow(x_train, y_train, batch_size=batch_size),\n",
     "                      steps_per_epoch = int(x_train.shape[0]/batch_size),\n",
@@ -305,7 +307,7 @@
     "\n",
     "model.save(f'{run_dir}/models/last-model.h5')\n",
     "\n",
-    "pwk.chrono_show()"
+    "chrono.show()"
    ]
   },
   {
@@ -351,7 +353,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, save_as='01-history')"
+    "fidle.scrawler.history(history, save_as='01-history')"
    ]
   },
   {
@@ -415,7 +417,7 @@
     "y_pred    = np.argmax(y_sigmoid, axis=-1)\n",
     "\n",
     "cmap = plt.get_cmap('Oranges')\n",
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(43), figsize=(16, 16),normalize=False, cmap=cmap, save_as='02-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(43), figsize=(16, 16),normalize=False, cmap=cmap, save_as='02-confusion-matrix')"
    ]
   },
   {
@@ -424,7 +426,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -453,7 +455,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -467,7 +469,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.5"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/GTSRB/05-Full-convolutions.ipynb b/GTSRB/05-Full-convolutions.ipynb
index a9e727e..25d6c98 100644
--- a/GTSRB/05-Full-convolutions.ipynb
+++ b/GTSRB/05-Full-convolutions.ipynb
@@ -43,16 +43,12 @@
     "import sys,os,time,json\n",
     "import random\n",
     "from IPython.display import display\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "import fidle\n",
     "\n",
     "VERSION='1.6'\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as ooo\n",
-    "\n",
-    "run_dir = './run/GTSRB5'\n",
-    "datasets_dir = pwk.init('GTSRB5', run_dir)"
+    "# Init Fidle environment\n",
+    "run_id, run_dir, datasets_dir = fidle.init('GTSRB5')"
    ]
   },
   {
@@ -117,7 +113,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('enhanced_dir', 'datasets', 'models', 'batch_size', 'epochs', 'scale', 'with_datagen', 'fit_verbosity')"
+    "fidle.override('enhanced_dir', 'datasets', 'models', 'batch_size', 'epochs', 'scale', 'with_datagen', 'fit_verbosity')"
    ]
   },
   {
@@ -197,7 +193,7 @@
     "        y_test  = f['y_test'][:]\n",
     "\n",
     "    # ---- Shuffle\n",
-    "    x_train,y_train=pwk.shuffle_np_dataset(x_train,y_train)\n",
+    "    x_train,y_train=fidle.utils.shuffle_np_dataset(x_train,y_train)\n",
     "\n",
     "    # ---- done\n",
     "    return x_train,y_train,x_test,y_test,size"
@@ -343,7 +339,7 @@
     "        output['Size'].append(d_size)\n",
     "        \n",
     "        # ---- Rescale\n",
-    "        x_train,y_train,x_test,y_test = pwk.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)\n",
+    "        x_train,y_train,x_test,y_test = fidle.utils.rescale_dataset(x_train,y_train,x_test,y_test, scale=scale)\n",
     "        \n",
     "        # ---- Get the shape\n",
     "        (n,lx,ly,lz) = x_train.shape\n",
@@ -393,7 +389,7 @@
     "                output[m_name+'_Duration'].append(duration)\n",
     "                print(f\"Accuracy={accuracy: 7.2f}    Duration={duration: 7.2f}\")\n",
     "            except:\n",
-    "                raise\n",
+    "                print('An error occured for :',m_name)\n",
     "                output[m_name+'_Accuracy'].append('0')\n",
     "                output[m_name+'_Duration'].append('999')\n",
     "                print('-')\n",
@@ -413,7 +409,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.chrono_start()\n",
+    "chrono=fidle.Chrono()\n",
+    "chrono.start()\n",
     "\n",
     "print('\\n---- Run','-'*50)\n",
     "\n",
@@ -456,7 +453,7 @@
     "\n",
     "print('\\nReport saved as ',report_name)\n",
     "\n",
-    "pwk.chrono_show()\n",
+    "chrono.show()\n",
     "print('-'*59)\n"
    ]
   },
@@ -473,7 +470,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -487,7 +484,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -501,7 +498,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.5"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/GTSRB/07-Show-report.ipynb b/GTSRB/07-Show-report.ipynb
index b33f89b..1cc3da1 100644
--- a/GTSRB/07-Show-report.ipynb
+++ b/GTSRB/07-Show-report.ipynb
@@ -35,11 +35,11 @@
     "from pathlib import Path\n",
     "from IPython.display import display, Markdown\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/GTSRB7'\n",
-    "datasets_dir = pwk.init('GTSRB7', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('GTSRB7', run_dir)"
    ]
   },
   {
@@ -72,7 +72,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('report_dir')"
+    "fidle.override('report_dir')"
    ]
   },
   {
@@ -99,7 +99,7 @@
     "    output      = dict_report['output']\n",
     "    description = dict_report['description']\n",
     "    # ---- about\n",
-    "    pwk.subtitle(f'Report : {Path(file).stem}')\n",
+    "    fidle.utils.subtitle(f'Report : {Path(file).stem}')\n",
     "    print(    \"Desc.  : \",description,'\\n')\n",
     "    # ---- Create a pandas\n",
     "    report       = pd.DataFrame (output)\n",
@@ -140,7 +140,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/IMDB/01-One-hot-encoding.ipynb b/IMDB/01-One-hot-encoding.ipynb
index 15b5393..5fd95fc 100644
--- a/IMDB/01-One-hot-encoding.ipynb
+++ b/IMDB/01-One-hot-encoding.ipynb
@@ -55,11 +55,11 @@
     "import os,sys,h5py,json\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/IMDB1'\n",
-    "datasets_dir = pwk.init('IMDB1', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('IMDB1', run_dir)"
    ]
   },
   {
@@ -100,7 +100,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('vocab_size', 'hide_most_frequently', 'batch_size', 'epochs', 'fit_verbosity')"
+    "fidle.override('vocab_size', 'hide_most_frequently', 'batch_size', 'epochs', 'fit_verbosity')"
    ]
   },
   {
@@ -240,8 +240,8 @@
     "\n",
     "# ---- About\n",
     "#\n",
-    "print(\"Max(x_train,x_test)  : \", pwk.rmax([x_train,x_test]) )\n",
-    "print(\"Min(x_train,x_test)  : \", pwk.rmin([x_train,x_test]) )\n",
+    "print(\"Max(x_train,x_test)  : \", fidle.utils.rmax([x_train,x_test]) )\n",
+    "print(\"Min(x_train,x_test)  : \", fidle.utils.rmin([x_train,x_test]) )\n",
     "print(\"x_train : {}  y_train : {}\".format(x_train.shape, y_train.shape))\n",
     "print(\"x_test  : {}  y_test  : {}\".format(x_test.shape,  y_test.shape))"
    ]
@@ -321,9 +321,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Review example :')\n",
+    "fidle.utils.subtitle('Review example :')\n",
     "print(x_train[12])\n",
-    "pwk.subtitle('After translation :')\n",
+    "fidle.utils.subtitle('After translation :')\n",
     "print(dataset2text(x_train[12]))"
    ]
   },
@@ -345,7 +345,7 @@
     "plt.hist(sizes, bins=400)\n",
     "plt.gca().set(title='Distribution of reviews by size - [{:5.2f}, {:5.2f}]'.format(min(sizes),max(sizes)), \n",
     "              xlabel='Size', ylabel='Density', xlim=[0,1500])\n",
-    "pwk.save_fig('01-stats-sizes')\n",
+    "fidle.scrawler.save_fig('01-stats-sizes')\n",
     "plt.show()"
    ]
   },
@@ -360,7 +360,7 @@
     "plt.hist(unk, bins=100)\n",
     "plt.gca().set(title='Percent of unknown words - [{:5.2f}, {:5.2f}]'.format(min(unk),max(unk)), \n",
     "              xlabel='# unknown', ylabel='Density', xlim=[0,30])\n",
-    "pwk.save_fig('02-stats-unknown')\n",
+    "fidle.scrawler.save_fig('02-stats-unknown')\n",
     "plt.show()"
    ]
   },
@@ -530,7 +530,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, save_as='02-history')"
+    "fidle.scrawler.history(history, save_as='02-history')"
    ]
   },
   {
@@ -555,7 +555,7 @@
     "print('x_test / accuracy  : {:5.4f}'.format(score[1]))\n",
     "\n",
     "values=[score[1], 1-score[1]]\n",
-    "pwk.plot_donut(values,[\"Accuracy\",\"Errors\"], title=\"#### Accuracy donut is :\", save_as='03-donut')\n",
+    "fidle.scrawler.donut(values,[\"Accuracy\",\"Errors\"], title=\"#### Accuracy donut is :\", save_as='03-donut')\n",
     "\n",
     "# ---- Confusion matrix\n",
     "\n",
@@ -565,8 +565,8 @@
     "y_pred[ y_sigmoid< 0.5 ] = 0\n",
     "y_pred[ y_sigmoid>=0.5 ] = 1    \n",
     "\n",
-    "pwk.display_confusion_matrix(y_test,y_pred,labels=range(2))\n",
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(2), figsize=(8, 8),normalize=False, save_as='04-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix_txt(y_test,y_pred,labels=range(2))\n",
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(2), figsize=(8, 8),normalize=False, save_as='04-confusion-matrix')"
    ]
   },
   {
@@ -575,7 +575,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/IMDB/02-Keras-embedding.ipynb b/IMDB/02-Keras-embedding.ipynb
index 544a9c4..c08156c 100644
--- a/IMDB/02-Keras-embedding.ipynb
+++ b/IMDB/02-Keras-embedding.ipynb
@@ -53,11 +53,11 @@
     "import os,sys,h5py,json\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/IMDB2'\n",
-    "datasets_dir = pwk.init('IMDB2', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('IMDB2', run_dir)"
    ]
   },
   {
@@ -106,8 +106,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('vocab_size', 'hide_most_frequently', 'review_len', 'dense_vector_size')\n",
-    "pwk.override('batch_size', 'epochs', 'output_dir', 'fit_verbosity')"
+    "fidle.override('vocab_size', 'hide_most_frequently', 'review_len', 'dense_vector_size')\n",
+    "fidle.override('batch_size', 'epochs', 'output_dir', 'fit_verbosity')"
    ]
   },
   {
@@ -142,8 +142,8 @@
     "\n",
     "# ---- About\n",
     "#\n",
-    "print(\"Max(x_train,x_test)  : \", pwk.rmax([x_train,x_test]) )\n",
-    "print(\"Min(x_train,x_test)  : \", pwk.rmin([x_train,x_test]) )\n",
+    "print(\"Max(x_train,x_test)  : \", fidle.utils.rmax([x_train,x_test]) )\n",
+    "print(\"Min(x_train,x_test)  : \", fidle.utils.rmin([x_train,x_test]) )\n",
     "print(\"x_train : {}  y_train : {}\".format(x_train.shape, y_train.shape))\n",
     "print(\"x_test  : {}  y_test  : {}\".format(x_test.shape,  y_test.shape))"
    ]
@@ -204,7 +204,7 @@
     "                                                     padding = 'post',\n",
     "                                                     maxlen  = review_len)\n",
     "\n",
-    "pwk.subtitle('After padding :')\n",
+    "fidle.utils.subtitle('After padding :')\n",
     "print(x_train[12])"
    ]
   },
@@ -223,7 +223,7 @@
    "source": [
     "# ---- Write dataset in a h5 file, could be usefull\n",
     "#\n",
-    "pwk.mkdir(output_dir)\n",
+    "fidle.utils.mkdir(output_dir)\n",
     "\n",
     "with h5py.File(f'{output_dir}/dataset_imdb.h5', 'w') as f:\n",
     "    f.create_dataset(\"x_train\",    data=x_train)\n",
@@ -349,7 +349,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, save_as='02-history')"
+    "fidle.scrawler.history(history, save_as='02-history')"
    ]
   },
   {
@@ -374,7 +374,7 @@
     "print('x_test / accuracy  : {:5.4f}'.format(score[1]))\n",
     "\n",
     "values=[score[1], 1-score[1]]\n",
-    "pwk.plot_donut(values,[\"Accuracy\",\"Errors\"], title=\"#### Accuracy donut is :\", save_as='03-donut')\n",
+    "fidle.scrawler.donut(values,[\"Accuracy\",\"Errors\"], title=\"#### Accuracy donut is :\", save_as='03-donut')\n",
     "\n",
     "# ---- Confusion matrix\n",
     "\n",
@@ -384,8 +384,8 @@
     "y_pred[ y_sigmoid< 0.5 ] = 0\n",
     "y_pred[ y_sigmoid>=0.5 ] = 1    \n",
     "\n",
-    "pwk.display_confusion_matrix(y_test,y_pred,labels=range(2))\n",
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(2), figsize=(8, 8),normalize=False, save_as='04-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix_txt(y_test,y_pred,labels=range(2))\n",
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(2), figsize=(8, 8),normalize=False, save_as='04-confusion-matrix')"
    ]
   },
   {
@@ -394,7 +394,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/IMDB/03-Prediction.ipynb b/IMDB/03-Prediction.ipynb
index 095dd79..56cdd99 100644
--- a/IMDB/03-Prediction.ipynb
+++ b/IMDB/03-Prediction.ipynb
@@ -48,11 +48,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/IMDB2'\n",
-    "datasets_dir = pwk.init('IMDB3', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('IMDB3', run_dir)"
    ]
   },
   {
@@ -91,7 +91,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('vocab_size', 'review_len', 'dictionaries_dir')"
+    "fidle.override('vocab_size', 'review_len', 'dictionaries_dir')"
    ]
   },
   {
@@ -260,7 +260,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/IMDB/04-Show-vectors.ipynb b/IMDB/04-Show-vectors.ipynb
index a8db009..168d87d 100644
--- a/IMDB/04-Show-vectors.ipynb
+++ b/IMDB/04-Show-vectors.ipynb
@@ -47,11 +47,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/IMDB2'\n",
-    "datasets_dir = pwk.init('IMDB4')"
+    "run_id, run_dir, datasets_dir = fidle.init('IMDB4')"
    ]
   },
   {
@@ -90,7 +90,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('vocab_size', 'review_len', 'dictionaries_dir')"
+    "fidle.override('vocab_size', 'review_len', 'dictionaries_dir')"
    ]
   },
   {
@@ -237,7 +237,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/IMDB/05-LSTM-Keras.ipynb b/IMDB/05-LSTM-Keras.ipynb
index 8d2daea..7775121 100644
--- a/IMDB/05-LSTM-Keras.ipynb
+++ b/IMDB/05-LSTM-Keras.ipynb
@@ -52,11 +52,11 @@
     "import os,sys,h5py,json\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/IMDB5'\n",
-    "datasets_dir = pwk.init('IMDB5', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('IMDB5', run_dir)"
    ]
   },
   {
@@ -105,8 +105,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('vocab_size', 'hide_most_frequently', 'review_len', 'dense_vector_size')\n",
-    "pwk.override('batch_size', 'epochs', 'fit_verbosity', 'scale')"
+    "fidle.override('vocab_size', 'hide_most_frequently', 'review_len', 'dense_vector_size')\n",
+    "fidle.override('batch_size', 'epochs', 'fit_verbosity', 'scale')"
    ]
   },
   {
@@ -150,8 +150,8 @@
     "\n",
     "# ---- About\n",
     "#\n",
-    "print(\"Max(x_train,x_test)  : \", pwk.rmax([x_train,x_test]) )\n",
-    "print(\"Min(x_train,x_test)  : \", pwk.rmin([x_train,x_test]) )\n",
+    "print(\"Max(x_train,x_test)  : \", fidle.utils.rmax([x_train,x_test]) )\n",
+    "print(\"Min(x_train,x_test)  : \", fidle.utils.rmin([x_train,x_test]) )\n",
     "print(\"x_train : {}  y_train : {}\".format(x_train.shape, y_train.shape))\n",
     "print(\"x_test  : {}  y_test  : {}\".format(x_test.shape,  y_test.shape))"
    ]
@@ -169,7 +169,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "print(\"  Max(x_train,x_test)  : \", pwk.rmax([x_train,x_test]) )\n",
+    "print(\"  Max(x_train,x_test)  : \", fidle.utils.rmax([x_train,x_test]) )\n",
     "print(\"  x_train : {}  y_train : {}\".format(x_train.shape, y_train.shape))\n",
     "print(\"  x_test  : {}  y_test  : {}\".format(x_test.shape,  y_test.shape))\n",
     "\n",
@@ -230,9 +230,9 @@
    "source": [
     "print('\\nDictionary size     : ', len(word_index))\n",
     "for k in range(440,455):print(f'{k:2d} : {index_word[k]}' )\n",
-    "pwk.subtitle('Review example :')\n",
+    "fidle.utils.subtitle('Review example :')\n",
     "print(x_train[12])\n",
-    "pwk.subtitle('After translation :')\n",
+    "fidle.utils.subtitle('After translation :')\n",
     "print(dataset2text(x_train[12]))"
    ]
   },
@@ -262,9 +262,9 @@
     "                                                     padding = 'post',\n",
     "                                                     maxlen  = review_len)\n",
     "\n",
-    "pwk.subtitle('After padding :')\n",
+    "fidle.utils.subtitle('After padding :')\n",
     "print(x_train[12])\n",
-    "pwk.subtitle('In real words :')\n",
+    "fidle.utils.subtitle('In real words :')\n",
     "print(dataset2text(x_train[12]))"
    ]
   },
@@ -375,7 +375,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, save_as='02-history')"
+    "fidle.scrawler.history(history, save_as='02-history')"
    ]
   },
   {
@@ -401,7 +401,7 @@
     "print('x_test / accuracy  : {:5.4f}'.format(score[1]))\n",
     "\n",
     "values=[score[1], 1-score[1]]\n",
-    "pwk.plot_donut(values,[\"Accuracy\",\"Errors\"], title=\"#### Accuracy donut is :\", save_as='03-donut')\n",
+    "fidle.scrawler.donut(values,[\"Accuracy\",\"Errors\"], title=\"#### Accuracy donut is :\", save_as='03-donut')\n",
     "\n",
     "# ---- Confusion matrix\n",
     "\n",
@@ -411,8 +411,8 @@
     "y_pred[ y_sigmoid< 0.5 ] = 0\n",
     "y_pred[ y_sigmoid>=0.5 ] = 1    \n",
     "\n",
-    "pwk.display_confusion_matrix(y_test,y_pred,labels=range(2))\n",
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(2), figsize=(8, 8),normalize=False, save_as='04-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix_txt(y_test,y_pred,labels=range(2))\n",
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(2), figsize=(8, 8),normalize=False, save_as='04-confusion-matrix')"
    ]
   },
   {
@@ -421,7 +421,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/IRIS/01-Simple-Perceptron.ipynb b/IRIS/01-Simple-Perceptron.ipynb
index 89531f4..aacbfe2 100644
--- a/IRIS/01-Simple-Perceptron.ipynb
+++ b/IRIS/01-Simple-Perceptron.ipynb
@@ -26,96 +26,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 1,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<style>\n",
-       "\n",
-       "div.warn {    \n",
-       "    background-color: #fcf2f2;\n",
-       "    border-color: #dFb5b4;\n",
-       "    border-left: 5px solid #dfb5b4;\n",
-       "    padding: 0.5em;\n",
-       "    font-weight: bold;\n",
-       "    font-size: 1.1em;;\n",
-       "    }\n",
-       "\n",
-       "\n",
-       "\n",
-       "div.nota {    \n",
-       "    background-color: #DAFFDE;\n",
-       "    border-left: 5px solid #92CC99;\n",
-       "    padding: 0.5em;\n",
-       "    }\n",
-       "\n",
-       "div.todo:before { content:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1My44OTEyIiBoZWlnaHQ9IjE0My4zOTAyIiB2aWV3Qm94PSIwIDAgNTMuODkxMiAxNDMuMzkwMiI+PHRpdGxlPjAwLUJvYi10b2RvPC90aXRsZT48cGF0aCBkPSJNMjMuNDU2OCwxMTQuMzAxNmExLjgwNjMsMS44MDYzLDAsMSwxLDEuODE1NywxLjgyNEExLjgyMDksMS44MjA5LDAsMCwxLDIzLjQ1NjgsMTE0LjMwMTZabS0xMC42NjEyLDEuODIyQTEuODI3MiwxLjgyNzIsMCwxLDAsMTAuOTgsMTE0LjMsMS44MiwxLjgyLDAsMCwwLDEyLjc5NTYsMTE2LjEyMzZabS03LjcwNyw0LjU4NzR2LTVzLjQ4NjMtOS4xMjIzLDguMDIxNS0xMS45Njc1YTE5LjIwODIsMTkuMjA4MiwwLDAsMSw2LjA0ODYtMS4yNDU0LDE5LjE3NzgsMTkuMTc3OCwwLDAsMSw2LjA0ODcsMS4yNDc1YzcuNTM1MSwyLjgzNDcsOC4wMTc0LDExLjk2NzQsOC4wMTc0LDExLjk2NzR2NS4wMjM0bC4wMDQyLDcuNjgydjIuNGMuMDE2Ny4xOTkyLjAzMzYuMzkyMS4wMzM2LjU4NzEsMCwuMjEzOC0uMDE2OC40MTA5LS4wMzM2LjYzMzJ2LjA1ODdoLS4wMDg0YTguMzcxOSw4LjM3MTksMCwwLDEtNy4zNzM4LDcuNjU0N3MtLjk5NTMsMy42MzgtNi42OTMzLDMuNjM4LTYuNjkzNC0zLjYzOC02LjY5MzQtMy42MzhhOC4zNyw4LjM3LDAsMCwxLTcuMzcxNi03LjY1NDdINS4wODQzdi0uMDU4N2MtLjAxODktLjIyLS4wMjk0LS40MTk0LS4wMjk0LS42MzMyLDAtLjE5MjkuMDE2Ny0uMzgzNy4wMjk0LS41ODcxdi0yLjRtMTguMDkzNy00LjA0YTEuMTU2NSwxLjE1NjUsMCwxLDAtMi4zMTI2LDAsMS4xNTY0LDEuMTU2NCwwLDEsMCwyLjMxMjYsMFptNC4wODM0LDBhMS4xNTk1LDEuMTU5NSwwLDEsMC0xLjE2MzYsMS4xN0ExLjE3NSwxLjE3NSwwLDAsMCwyNy4yNjE0LDEyNC4zNzc5Wk05LjM3MzksMTE0LjYzNWMwLDMuMTA5MywyLjQxMzIsMy4zMSwyLjQxMzIsMy4zMWExMzMuOTI0MywxMzMuOTI0MywwLDAsMCwxNC43MzQ4LDBzMi40MTExLS4xOTI5LDIuNDExMS0zLjMxYTguMDc3Myw4LjA3NzMsMCwwLDAtMi40MTExLTUuNTUxOWMtNC41LTMuNTAzMy05LjkxMjYtMy41MDMzLTE0Ljc0MTEsMEE4LjA4NTEsOC4wODUxLDAsMCwwLDkuMzczOSwxMTQuNjM1WiIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjMzLjE0MzYiIGN5PSIxMjQuNTM0IiByPSIzLjgzNjMiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48cmVjdCB4PSIzNS42NjU5IiB5PSIxMTIuOTYyNSIgd2lkdGg9IjIuMDc3IiBoZWlnaHQ9IjEwLjU0NTgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIxLjYgMjQxLjExMjEpIHJvdGF0ZSgtMTU1Ljc0NikiIHN0eWxlPSJmaWxsOiMwMTAxMDEiLz48Y2lyY2xlIGN4PSIzOC44NzA0IiBjeT0iMTEzLjQyNzkiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxjaXJjbGUgY3g9IjUuMjI0OCIgY3k9IjEyNC41MzQiIHI9IjMuODM2MyIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxyZWN0IHg9IjEuNDE2NCIgeT0iMTI0LjYzMDEiIHdpZHRoPSIyLjA3NyIgaGVpZ2h0PSIxMC41NDU4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0LjkwOTcgMjU5LjgwNikgcm90YXRlKC0xODApIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PGNpcmNsZSBjeD0iMi40MDkxIiBjeT0iMTM3LjA5OTYiIHI9IjIuNDA4NSIgc3R5bGU9ImZpbGw6IzAxMDEwMSIvPjxwYXRoIGQ9Ik0xOC4wNTExLDEwMC4xMDY2aC0uMDE0NlYxMDIuNjFoMi4zdi0yLjQyNzlhMi40MjI5LDIuNDIyOSwwLDEsMC0yLjI4NTQtLjA3NTVaIiBzdHlsZT0iZmlsbDojMDEwMTAxIi8+PHBhdGggZD0iTTM5LjQyMTQsMjcuMjU4djEuMDVBMTEuOTQ1MiwxMS45NDUyLDAsMCwwLDQ0LjU5NTQsNS43OWEuMjQ0OS4yNDQ5LDAsMCwxLS4wMjM1LS40MjI3TDQ2Ljc1LDMuOTUxNWEuMzg5Mi4zODkyLDAsMCwxLC40MjYyLDAsMTQuODQ0MiwxNC44NDQyLDAsMCwxLTcuNzU0MywyNy4yNTkxdjEuMDY3YS40NS40NSwwLDAsMS0uNzA0Ny4zNzU4bC0zLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsMC0uNzUxNmwzLjg0MTktMi41MWEuNDUuNDUsMCwwLDEsLjY5NDYuMzc1OFpNNDMuMjMsMi41ODkyLDM5LjM4NzguMDc5NGEuNDUuNDUsMCwwLDAtLjcwNDYuMzc1OHYxLjA2N2ExNC44NDQyLDE0Ljg0NDIsMCwwLDAtNy43NTQzLDI3LjI1OTEuMzg5LjM4OSwwLDAsMCwuNDI2MSwwbDIuMTc3Ny0xLjQxOTNhLjI0NS4yNDUsMCwwLDAtLjAyMzUtLjQyMjgsMTEuOTQ1MSwxMS45NDUxLDAsMCwxLDUuMTc0LTIyLjUxNDZ2MS4wNWEuNDUuNDUsMCwwLDAsLjcwNDYuMzc1OGwzLjg1NTMtMi41MWEuNDUuNDUsMCwwLDAsMC0uNzUxNlpNMzkuMDUyMywxNC4yNDU4YTIuMTIwNiwyLjEyMDYsMCwxLDAsMi4xMjA2LDIuMTIwNmgwQTIuMTI0LDIuMTI0LDAsMCwwLDM5LjA1MjMsMTQuMjQ1OFptNi4wNzMyLTQuNzc4MS44MjU0LjgyNTVhMS4wNTY4LDEuMDU2OCwwLDAsMSwuMTE3NSwxLjM0MjFsLS44MDIsMS4xNDQyYTcuMTAxOCw3LjEwMTgsMCwwLDEsLjcxMTQsMS43MTEybDEuMzc1Ny4yNDE2YTEuMDU2OSwxLjA1NjksMCwwLDEsLjg3NTcsMS4wNHYxLjE2NDNhMS4wNTY5LDEuMDU2OSwwLDAsMS0uODc1NywxLjA0bC0xLjM3MjQuMjQxNkE3LjExLDcuMTEsMCwwLDEsNDUuMjcsMTkuOTNsLjgwMTksMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLS4xMTc0LDEuMzQyMmwtLjgyODguODQ4OWExLjA1NywxLjA1NywwLDAsMS0xLjM0MjEuMTE3NGwtMS4xNDQyLS44MDE5YTcuMTMzOCw3LjEzMzgsMCwwLDEtMS43MTEzLjcxMTNsLS4yNDE2LDEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLTEuMDQuODc1N0gzOC40Njg0YTEuMDU2OCwxLjA1NjgsMCwwLDEtMS4wNC0uODc1N2wtLjI0MTYtMS4zNzI0YTcuMTM1NSw3LjEzNTUsMCwwLDEtMS43MTEzLS43MTEzbC0xLjE0NDEuODAxOWExLjA1NzEsMS4wNTcxLDAsMCwxLTEuMzQyMi0uMTE3NGwtLjgzNTUtLjgyNTVhMS4wNTcsMS4wNTcsMCwwLDEtLjExNzQtMS4zNDIxbC44MDE5LTEuMTQ0MmE3LjEyMSw3LjEyMSwwLDAsMS0uNzExMy0xLjcxMTJsLTEuMzcyNC0uMjQxNmExLjA1NjksMS4wNTY5LDAsMCwxLS44NzU3LTEuMDRWMTUuNzgyNmExLjA1NjksMS4wNTY5LDAsMCwxLC44NzU3LTEuMDRsMS4zNzU3LS4yNDE2YTcuMTEsNy4xMSwwLDAsMSwuNzExNC0xLjcxMTJsLS44MDItMS4xNDQyYTEuMDU3LDEuMDU3LDAsMCwxLC4xMTc1LTEuMzQyMmwuODI1NC0uODI1NEExLjA1NjgsMS4wNTY4LDAsMCwxLDM0LjMyNDUsOS4zNmwxLjE0NDIuODAxOUE3LjEzNTUsNy4xMzU1LDAsMCwxLDM3LjE4LDkuNDUxbC4yNDE2LTEuMzcyNGExLjA1NjgsMS4wNTY4LDAsMCwxLDEuMDQtLjg3NTdoMS4xNjc3YTEuMDU2OSwxLjA1NjksMCwwLDEsMS4wNC44NzU3bC4yNDE2LDEuMzcyNGE3LjEyNSw3LjEyNSwwLDAsMSwxLjcxMTIuNzExM0w0My43NjY2LDkuMzZBMS4wNTY5LDEuMDU2OSwwLDAsMSw0NS4xMjU1LDkuNDY3N1ptLTIuMDMsNi44OTg3QTQuMDQzMyw0LjA0MzMsMCwxLDAsMzkuMDUyMywyMC40MWgwQTQuMDQ2NSw0LjA0NjUsMCwwLDAsNDMuMDk1NSwxNi4zNjY0WiIgc3R5bGU9ImZpbGw6I2UxMjIyOSIvPjxwb2x5Z29uIHBvaW50cz0iMzkuNDEzIDM0Ljc1NyAzOS41MzcgMzQuNzU3IDM5LjY3NSAzNC43NTcgMzkuNjc1IDEwOS41MSAzOS41MzcgMTA5LjUxIDM5LjQxMyAxMDkuNTEgMzkuNDEzIDM0Ljc1NyAzOS40MTMgMzQuNzU3IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojOTk5O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwO3N0cm9rZS13aWR0aDowLjMwODg1NDQ1MDU2MDE2MThweDtmaWxsLXJ1bGU6ZXZlbm9kZCIvPjwvc3ZnPg==);\n",
-       "    float:left;\n",
-       "    margin-right:20px;\n",
-       "    margin-top:-20px;\n",
-       "    margin-bottom:20px;\n",
-       "}\n",
-       "div.todo{\n",
-       "    font-weight: bold;\n",
-       "    font-size: 1.1em;\n",
-       "    margin-top:40px;\n",
-       "}\n",
-       "div.todo ul{\n",
-       "    margin: 0.2em;\n",
-       "}\n",
-       "div.todo li{\n",
-       "    margin-left:60px;\n",
-       "    margin-top:0;\n",
-       "    margin-bottom:0;\n",
-       "}\n",
-       "\n",
-       "div .comment{\n",
-       "    font-size:0.8em;\n",
-       "    color:#696969;\n",
-       "}\n",
-       "\n",
-       "\n",
-       "\n",
-       "</style>\n",
-       "\n"
-      ],
-      "text/plain": [
-       "<IPython.core.display.HTML object>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "data": {
-      "text/markdown": [
-       "**FIDLE 2020 - Practical Work Module**"
-      ],
-      "text/plain": [
-       "<IPython.core.display.Markdown object>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "Version              : 0.6.1 DEV\n",
-      "Notebook id          : PER57\n",
-      "Run time             : Wednesday 16 December 2020, 21:01:59\n",
-      "TensorFlow version   : 2.0.0\n",
-      "Keras version        : 2.2.4-tf\n",
-      "Datasets dir         : ~/datasets/fidle\n",
-      "Update keras cache   : False\n",
-      "Save figs            : True\n",
-      "Path figs            : ./run/figs\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "import numpy as np\n",
     "from sklearn.datasets     import load_iris\n",
@@ -126,10 +39,10 @@
     "\n",
     "import os,sys\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('PER57')"
+    "# Init Fidle environment\n",
+    "run_id, run_dir, datasets_dir = fidle.init('PER57')"
    ]
   },
   {
@@ -155,136 +68,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 2,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>Length (x1)</th>\n",
-       "      <th>Width (x2)</th>\n",
-       "      <th>Setosa {0,1} (y)</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>1.4</td>\n",
-       "      <td>0.2</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>1.4</td>\n",
-       "      <td>0.2</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>1.3</td>\n",
-       "      <td>0.2</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>1.5</td>\n",
-       "      <td>0.2</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>1.4</td>\n",
-       "      <td>0.2</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>...</th>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "      <td>...</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>145</th>\n",
-       "      <td>5.2</td>\n",
-       "      <td>2.3</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>146</th>\n",
-       "      <td>5.0</td>\n",
-       "      <td>1.9</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>147</th>\n",
-       "      <td>5.2</td>\n",
-       "      <td>2.0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>148</th>\n",
-       "      <td>5.4</td>\n",
-       "      <td>2.3</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>149</th>\n",
-       "      <td>5.1</td>\n",
-       "      <td>1.8</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>150 rows × 3 columns</p>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "     Length (x1)  Width (x2)  Setosa {0,1} (y)\n",
-       "0            1.4         0.2                 1\n",
-       "1            1.4         0.2                 1\n",
-       "2            1.3         0.2                 1\n",
-       "3            1.5         0.2                 1\n",
-       "4            1.4         0.2                 1\n",
-       "..           ...         ...               ...\n",
-       "145          5.2         2.3                 0\n",
-       "146          5.0         1.9                 0\n",
-       "147          5.2         2.0                 0\n",
-       "148          5.4         2.3                 0\n",
-       "149          5.1         1.8                 0\n",
-       "\n",
-       "[150 rows x 3 columns]"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "x shape : (150, 2)\n",
-      "y shape : (150,)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "x0,y0 = load_iris(return_X_y=True)\n",
     "\n",
@@ -310,22 +96,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 3,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "x_train shape : (120, 2)\n",
-      "y_train shape : (120,)\n",
-      "x_test shape  : (30, 2)\n",
-      "y_test shape  : (30,)\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "x,y = pwk.shuffle_np_dataset(x, y)\n",
+    "x,y = fidle.utils.shuffle_np_dataset(x, y)\n",
     "    \n",
     "n=int(len(x)*0.8)\n",
     "x_train = x[:n]\n",
@@ -348,48 +123,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 4,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "-- Epoch 1\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 120, Avg. loss: 0.176917\n",
-      "Total training time: 0.00 seconds.\n",
-      "-- Epoch 2\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 240, Avg. loss: 0.000000\n",
-      "Total training time: 0.00 seconds.\n",
-      "-- Epoch 3\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 360, Avg. loss: 0.000000\n",
-      "Total training time: 0.00 seconds.\n",
-      "-- Epoch 4\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 480, Avg. loss: 0.000000\n",
-      "Total training time: 0.00 seconds.\n",
-      "-- Epoch 5\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 600, Avg. loss: 0.000000\n",
-      "Total training time: 0.00 seconds.\n",
-      "-- Epoch 6\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 720, Avg. loss: 0.000000\n",
-      "Total training time: 0.00 seconds.\n",
-      "-- Epoch 7\n",
-      "Norm: 1.56, NNZs: 2, Bias: 3.000000, T: 840, Avg. loss: 0.000000\n",
-      "Total training time: 0.00 seconds.\n",
-      "Convergence after 7 epochs took 0.00 seconds\n"
-     ]
-    },
-    {
-     "data": {
-      "text/plain": [
-       "Perceptron(max_iter=100, random_state=82, tol=0.01, verbose=1)"
-      ]
-     },
-     "execution_count": 4,
-     "metadata": {},
-     "output_type": "execute_result"
-    }
-   ],
+   "outputs": [],
    "source": [
     "pct = Perceptron(max_iter=100, random_state=82, tol=0.01, verbose=1)\n",
     "pct.fit(x_train, y_train)"
@@ -404,169 +140,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div>\n",
-       "<style scoped>\n",
-       "    .dataframe tbody tr th:only-of-type {\n",
-       "        vertical-align: middle;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe tbody tr th {\n",
-       "        vertical-align: top;\n",
-       "    }\n",
-       "\n",
-       "    .dataframe thead th {\n",
-       "        text-align: right;\n",
-       "    }\n",
-       "</style>\n",
-       "<table border=\"1\" class=\"dataframe\">\n",
-       "  <thead>\n",
-       "    <tr style=\"text-align: right;\">\n",
-       "      <th></th>\n",
-       "      <th>Length (x1)</th>\n",
-       "      <th>Width (x2)</th>\n",
-       "      <th>y_test</th>\n",
-       "      <th>y_pred</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>1.2</td>\n",
-       "      <td>0.2</td>\n",
-       "      <td>1</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>5.6</td>\n",
-       "      <td>2.4</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>4.3</td>\n",
-       "      <td>1.3</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>4.3</td>\n",
-       "      <td>1.3</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>5.2</td>\n",
-       "      <td>2.0</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>5</th>\n",
-       "      <td>5.1</td>\n",
-       "      <td>2.0</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>6</th>\n",
-       "      <td>4.0</td>\n",
-       "      <td>1.2</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>7</th>\n",
-       "      <td>1.5</td>\n",
-       "      <td>0.4</td>\n",
-       "      <td>1</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>8</th>\n",
-       "      <td>4.5</td>\n",
-       "      <td>1.5</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>9</th>\n",
-       "      <td>1.5</td>\n",
-       "      <td>0.4</td>\n",
-       "      <td>1</td>\n",
-       "      <td>1</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>10</th>\n",
-       "      <td>5.1</td>\n",
-       "      <td>1.6</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>11</th>\n",
-       "      <td>3.3</td>\n",
-       "      <td>1.0</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>12</th>\n",
-       "      <td>5.8</td>\n",
-       "      <td>2.2</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>13</th>\n",
-       "      <td>4.8</td>\n",
-       "      <td>1.8</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>14</th>\n",
-       "      <td>4.7</td>\n",
-       "      <td>1.6</td>\n",
-       "      <td>0</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "</div>"
-      ],
-      "text/plain": [
-       "    Length (x1)  Width (x2)  y_test  y_pred\n",
-       "0           1.2         0.2       1       1\n",
-       "1           5.6         2.4       0       0\n",
-       "2           4.3         1.3       0       0\n",
-       "3           4.3         1.3       0       0\n",
-       "4           5.2         2.0       0       0\n",
-       "5           5.1         2.0       0       0\n",
-       "6           4.0         1.2       0       0\n",
-       "7           1.5         0.4       1       1\n",
-       "8           4.5         1.5       0       0\n",
-       "9           1.5         0.4       1       1\n",
-       "10          5.1         1.6       0       0\n",
-       "11          3.3         1.0       0       0\n",
-       "12          5.8         2.2       0       0\n",
-       "13          4.8         1.8       0       0\n",
-       "14          4.7         1.6       0       0"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    }
-   ],
+   "outputs": [],
    "source": [
     "y_pred = pct.predict(x_test) \n",
     "\n",
@@ -583,34 +159,9 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "data": {
-      "text/html": [
-       "<div class=\"comment\">Saved: ./run/figs/PER57-01-perceptron-iris</div>"
-      ],
-      "text/plain": [
-       "<IPython.core.display.HTML object>"
-      ]
-     },
-     "metadata": {},
-     "output_type": "display_data"
-    },
-    {
-     "data": {
-      "image/png": "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66+/3u/j5OfnByAay7XXXsv06dMpKIiOXl1JBMNB/TRrvbuExPI9XHa7tX3sQ54XR27ZFk7rZQ3Llu3Vcziciz6fgJNu/tM2bwv7DluTLCo8RiHsz3C//+DvUKex+1jrNPD/egN13yJA9erVmTt3Lna7nWeeeaZ4mEIIEZ52ZWbj8DR4omF3ZtUMMebk5PDOO+9w4403Mnz4cGbNmlVqv6vePqUU8+fPB6Bly5YAdO/eHaUU5513HgCjR49myJAhTJ06lSZNmtCkSRMADh48yOWXX06tWrWoVasWF110Uanlrw4cOMCll15K7dq1qVatGmeccQb/+c9/XF7Dxo0b+eGHHxgyZEi5uN955x169+5NUlISZ5xxBkuXLi1us2LFCpRSfPrpp5x99tkkJCTw2WefobXmqaee4tRTTyU5OZmOHTsyd+7cUufcsGEDZ511FklJSXTp0oV169aVi2vQoEFkZmZGzc9hSQTDRcfuMGk69L0QkqpZM3OTqlmfT5ru/aLIvYdA/2vAngIFhVbvXEGh9Xn/a+D+F2HEDRBXpictLs7afs9UePR1KEiFX4+WPsavR63tD78J9voV77fXhwmvwiPT4cLLys8wVsraPnV2YK43UPctAvTo0YOHHnoIrTWjRo3i2LFjoQ5JCOHCgeM5ngdogJ+OV81ktvnz59O8eXM6derE1VdfzVtvveVzr9j69esBWLJkCb/88gsLF/61FNfKlSvZunUrS5YsYdmyZZw4cYL+/fuTlJTEypUr+d///kejRo244IILOHHiBACGYXDixAm+/PJLtm3bxvPPP88pp5zi8vyrV6+mdevWFba59957uf3229myZQsDBw7k0ksv5eDB0uvX3nfffUyZMoXvv/+++OfnrFmzePnll9m+fTvjx4/npptu4pNPPgEgOzubiy66iFatWrFx40aefPJJxo0bV+7cCQkJdO7cmZUrV/p0P8OW1lo+fPgYO3asHjt2rBYiFPLy8nT37t11x44d9e7du0MdjhBRb/v27ZV634LvM7z+qAp9+/bVTz/9tNZaa4fDoZs3b67nz59fvH/v3r0a0Bs2bCj1PkC///77btuMGjVK161bV588ebJ426xZs3Tr1q21w+Eo3lZQUKBr166t582bp7XWumPHjnrSpEleX8Mdd9yh+/btW2pbUUxTpkwp3lZYWKjbtGmjH3zwQa211l9++aUGSl1vVlaWTkpK0qtWrSp3jgsvvFBrrfWrr76qa9asqY8fP168f86cORrQX375Zan3/eMf/9AjR470+lqCwcP3qsu8RmoNR5pg1dXdsQXenQ4Z+//altYcrhgLbTt7rmcsqkR8fDwffvghderUITExMdThCCFciLOp4gkintoF2u7du1mzZg3vvvsuYA33XnXVVcycOZNhw4YF5BwdOnQo9TNo06ZN7N27l9TU1FLtTpw4wY8//gjAHXfcwc0338ySJUsYMGAA//jHPzjrrLNcniMnJ4ekpKQK951zzjnF/7bZbPTo0YPt27eXatOtW7fif2/fvp2TJ0/yt7/9rVTJzvz8fFq0aAFYJdo6depESkpKhecpKTk5mZycyF6arIgkgpGkorq6J0/A6sXw9eeBq6v78dvw3znlt2fsh2fuh3P6gMqyqpgUPZtnt4MjC758Cw72soaoRZVISyud8Ofk5JCcHNlL5AgRbZqmJrPv2Am3w8MKaJYa+P+7M2fOpLCwkGbNmhVv085JgAcOHKBp06bYnOvOFm0H3yZUVK9evdTnDoeDzp07V/jMX+3atQG4/vrrGTx4MJ9++ilffPEF5557LuPHj2fSpEkVnqNu3bps3rzZ65jcxehwPtP+8ccfl7ovYP2BDaXvhSeZmZnFCWSkk2cEI0Ww6uru2FJxElgkKQHUcff1jH9YY/UYiir1+++/c8UVV/CPf/zDpx9gQoiq16Z2dTx19tkUtK5d3X0jHxUUFDB79myeeOIJtmzZUvzx7bff0qlTJ9544w0A6tWrB8Avv/xS/N4tW7aUOlZCglWXvtBTBSega9eu7N69m7p169K6detSH0WJIECTJk0YM2YM7733Ho8++igzZsxwecwuXbqwc+fO4iSupLVr1xb/W2vN+vXradvW9WhUu3btSExMZP/+/eXia968eXGb9PT0UmsEljxPSd999x1du3Z1fUMiiCSCkSJYdXXfne5+vze1iBWwOvLq+0aanJwcli5dymeffcb06R6+bkKIoEpJiKNHWi3sqnwJeAXYFfRIq0VKQmAH5j755BOOHj3KjTfeSIcOHUp9XH755bz++us4HA6Sk5Pp2bMnU6dOZdu2bXz99dflJkbUr1+f5ORkPvvsMw4dOuR2gtpVV11FgwYNuPTSS1m5ciV79+5l1apV3H333cUzh++44w6WLFnCnj172LJlC0uWLKFdu3Yuj9m/f39OnjzJ1q1by+2bPn068+fPZ+fOndx5553s37+fsWPHujxWamoq48aNY9y4cbz++uvs3r2bLVu28MorrxQno1deeSVxcXFcd911bNu2jc8//5zHHnus3LH27dvHwYMHGTRokMvzRRJJBCNFsOrqlnwmsCLe1CK22SD/uH9xCI/S0tJ49dVXARg3bhw7d+4McURCiJIapiQxoEU9WtasVvwsYJxN0bJmNQa0qEfDlIqff/PHrFmz6N+/P3XqlK/3PmLECPbv388XX3wBwOuvvw5Yy8PcdNNNTJkypVT7uLg4XnzxRWbOnElaWhqXXnqpy/NWq1aNVatW0apVK0aMGMEZZ5zBqFGj+P3336lVqxZgDc/edttttGvXjoEDB9KgQQNmz57t8ph16tRh6NChvP322+X2Pfnkkzz77LOceeaZLFmyhA8++KB4GRtXJk+ezKRJk5g2bRrt27dn4MCBLFiwoHiZnJSUFBYtWsSuXbvo2rUr48aNY+rUqeWO8+677zJo0KDinsRIp2RIyTeGYWgA0zSDe+IbLsTzatFYvXWvLfbjPH9zv793V889gmAtKTP68crHIbw2atQo3nrrLbp168bXX39d/LyLEMJ/O3bscDvkKKrWtm3b6N+/P7t376ZGjRrs27ePli1bsmHDhlKTQYIlNzeXNm3a8O6771a6YktV8fC96vIXt/QIRopwqavrbQ3hQNUsFh69+OKLNGvWjI0bN5b7i14IISJZ+/btmTZtGnv37g11KADs37+fBx98MOySQH9IIhgpglVXN81DV7c3tYgdDohPdd9GBEzNmjV56623UErx2GOPsWHDhlCHJIQQAXPNNddw5plnhjoMAE477TRuuummUIcRULJ8TKQYNNRaIsbdc4KBqKt7xVhriRhXDh6CBuWfPSlFA30iv75vJOnXrx/jxo0jOzvb7cPXQggRyVq0aCGrJASY9AhGimDV1W3bGS692vX+k3mgU93XMz6tlywqHQJTp07l5ZdfLre+lxBCCOGK9AhGkqK6up8vtGYH5+ZYzwSec77VExioyiIXXwWt28N/psPBErOIGzeHy0tUFlm90JodbLdZCWB8qtUTKElgSJRcLf/48ePs3r2bLl26hDAiIaKD1rrU/y8hwo0/vaSSCEaa+mlw1a3WR1Vq2xke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\n",
-      "text/plain": [
-       "<Figure size 720x432 with 1 Axes>"
-      ]
-     },
-     "metadata": {
-      "needs_background": "light"
-     },
-     "output_type": "display_data"
-    }
-   ],
+   "outputs": [],
    "source": [
     "def plot_perceptron(x_train,y_train,x_test,y_test):\n",
     "    a = -pct.coef_[0][0] / pct.coef_[0][1]\n",
@@ -635,7 +186,7 @@
     "    axs.legend(loc=\"lower right\", fontsize=14)\n",
     "    axs.set_xlim(box[0],box[1])\n",
     "    axs.set_ylim(box[2],box[3])\n",
-    "    pwk.save_fig('01-perceptron-iris')\n",
+    "    fidle.scrawler.save_fig('01-perceptron-iris')\n",
     "    plt.show()\n",
     "    \n",
     "plot_perceptron(x_train,y_train, x_test,y_test)"
@@ -643,21 +194,11 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 7,
+   "execution_count": null,
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "End time is : Wednesday 16 December 2020, 21:02:00\n",
-      "Duration is : 00:00:01 537ms\n",
-      "This notebook ends here\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -671,7 +212,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -685,7 +226,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.7.9"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/LinearReg/04-Logistic-Regression.ipynb b/LinearReg/04-Logistic-Regression.ipynb
index 6507e31..e86c631 100644
--- a/LinearReg/04-Logistic-Regression.ipynb
+++ b/LinearReg/04-Logistic-Regression.ipynb
@@ -84,10 +84,10 @@
     "# import os\n",
     "import sys\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('LOGR1')"
+    "# Init Fidle environment\n",
+    "run_id, run_dir, datasets_dir = fidle.init('LOGR1')"
    ]
   },
   {
@@ -316,9 +316,9 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.display_md('**This is what we know :**')\n",
+    "fidle.utils.display_md('**This is what we know :**')\n",
     "plot_data(x_train, y_train)\n",
-    "pwk.display_md('**This is what we want to classify :**')\n",
+    "fidle.utils.display_md('**This is what we want to classify :**')\n",
     "plot_data(x_test,  y_test, colors=(\"gray\",\"gray\"), legend=False)"
    ]
   },
@@ -465,7 +465,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -479,7 +479,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3 (ipykernel)",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -493,7 +493,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.9.7"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/MNIST/01-DNN-MNIST.ipynb b/MNIST/01-DNN-MNIST.ipynb
index d6125a5..7ad1e4a 100644
--- a/MNIST/01-DNN-MNIST.ipynb
+++ b/MNIST/01-DNN-MNIST.ipynb
@@ -53,10 +53,10 @@
     "import sys,os\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('MNIST1')"
+    "run_id, run_dir, datasets_dir = fidle.init('MNIST1')"
    ]
   },
   {
@@ -88,7 +88,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('fit_verbosity')"
+    "fidle.override('fit_verbosity')"
    ]
   },
   {
@@ -149,8 +149,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(x_train, y_train, [27],  x_size=5,y_size=5, colorbar=True, save_as='01-one-digit')\n",
-    "pwk.plot_images(x_train, y_train, range(5,41), columns=12, save_as='02-many-digits')"
+    "fidle.scrawler.images(x_train, y_train, [27],  x_size=5,y_size=5, colorbar=True, save_as='01-one-digit')\n",
+    "fidle.scrawler.images(x_train, y_train, range(5,41), columns=12, save_as='02-many-digits')"
    ]
   },
   {
@@ -243,7 +243,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, figsize=(6,4), save_as='03-history')"
+    "fidle.scrawler.history(history, figsize=(6,4), save_as='03-history')"
    ]
   },
   {
@@ -264,7 +264,7 @@
     "y_sigmoid = model.predict(x_test)\n",
     "y_pred    = np.argmax(y_sigmoid, axis=-1)\n",
     "\n",
-    "pwk.plot_images(x_test, y_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=y_pred, save_as='04-predictions')"
+    "fidle.scrawler.images(x_test, y_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=y_pred, save_as='04-predictions')"
    ]
   },
   {
@@ -282,7 +282,7 @@
    "source": [
     "errors=[ i for i in range(len(x_test)) if y_pred[i]!=y_test[i] ]\n",
     "errors=errors[:min(24,len(errors))]\n",
-    "pwk.plot_images(x_test, y_test, errors[:15], columns=6, x_size=2, y_size=2, y_pred=y_pred, save_as='05-some-errors')"
+    "fidle.scrawler.images(x_test, y_test, errors[:15], columns=6, x_size=2, y_size=2, y_pred=y_pred, save_as='05-some-errors')"
    ]
   },
   {
@@ -291,7 +291,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(10),normalize=True, save_as='06-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(10),normalize=True, save_as='06-confusion-matrix')"
    ]
   },
   {
@@ -300,7 +300,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -328,7 +328,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -342,7 +342,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.7.9"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/MNIST/02-CNN-MNIST.ipynb b/MNIST/02-CNN-MNIST.ipynb
index 380970a..db913b6 100644
--- a/MNIST/02-CNN-MNIST.ipynb
+++ b/MNIST/02-CNN-MNIST.ipynb
@@ -53,10 +53,10 @@
     "import sys,os\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('MNIST1')"
+    "run_id, run_dir, datasets_dir = fidle.init('MNIST1')"
    ]
   },
   {
@@ -88,7 +88,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('fit_verbosity')"
+    "fidle.override('fit_verbosity')"
    ]
   },
   {
@@ -152,8 +152,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_images(x_train, y_train, [27],  x_size=5,y_size=5, colorbar=True, save_as='01-one-digit')\n",
-    "pwk.plot_images(x_train, y_train, range(5,41), columns=12, save_as='02-many-digits')"
+    "fidle.scrawler.images(x_train, y_train, [27],  x_size=5,y_size=5, colorbar=True, save_as='01-one-digit')\n",
+    "fidle.scrawler.images(x_train, y_train, range(5,41), columns=12, save_as='02-many-digits')"
    ]
   },
   {
@@ -263,7 +263,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history, figsize=(6,4), save_as='03-history')"
+    "fidle.scrawler.history(history, figsize=(6,4), save_as='03-history')"
    ]
   },
   {
@@ -284,7 +284,7 @@
     "y_sigmoid = model.predict(x_test)\n",
     "y_pred    = np.argmax(y_sigmoid, axis=-1)\n",
     "\n",
-    "pwk.plot_images(x_test, y_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=y_pred, save_as='04-predictions')"
+    "fidle.scrawler.images(x_test, y_test, range(0,200), columns=12, x_size=1, y_size=1, y_pred=y_pred, save_as='04-predictions')"
    ]
   },
   {
@@ -302,7 +302,7 @@
    "source": [
     "errors=[ i for i in range(len(x_test)) if y_pred[i]!=y_test[i] ]\n",
     "errors=errors[:min(24,len(errors))]\n",
-    "pwk.plot_images(x_test, y_test, errors[:15], columns=6, x_size=2, y_size=2, y_pred=y_pred, save_as='05-some-errors')"
+    "fidle.scrawler.images(x_test, y_test, errors[:15], columns=6, x_size=2, y_size=2, y_pred=y_pred, save_as='05-some-errors')"
    ]
   },
   {
@@ -311,7 +311,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_confusion_matrix(y_test,y_pred,range(10),normalize=True, save_as='06-confusion-matrix')"
+    "fidle.scrawler.confusion_matrix(y_test,y_pred,range(10),normalize=True, save_as='06-confusion-matrix')"
    ]
   },
   {
@@ -320,7 +320,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
@@ -348,7 +348,7 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 3",
+   "display_name": "Python 3.9.2 ('fidle-env')",
    "language": "python",
    "name": "python3"
   },
@@ -362,7 +362,12 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.8.5"
+   "version": "3.9.2"
+  },
+  "vscode": {
+   "interpreter": {
+    "hash": "b3929042cc22c1274d74e3e946c52b845b57cb6d84f2d591ffe0519b38e4896d"
+   }
   }
  },
  "nbformat": 4,
diff --git a/MNIST_PyTorch/01-DNN-MNIST_PyTorch.ipynb b/MNIST_PyTorch/01-DNN-MNIST_PyTorch.ipynb
index 7906a6c..8cc6134 100644
--- a/MNIST_PyTorch/01-DNN-MNIST_PyTorch.ipynb
+++ b/MNIST_PyTorch/01-DNN-MNIST_PyTorch.ipynb
@@ -56,7 +56,7 @@
     "import matplotlib.pyplot as plt\n",
     "import sys,os\n",
     "\n",
-    "sys.path.append('..')\n",
+    "# Init Fidle environment\n",
     "import fidle.pwk as ooo\n",
     "\n",
     "from fidle_pwk_additional import convergence_history_CrossEntropyLoss"
diff --git a/Misc/Activation-Functions.ipynb b/Misc/Activation-Functions.ipynb
index 282b2fe..45a3f03 100644
--- a/Misc/Activation-Functions.ipynb
+++ b/Misc/Activation-Functions.ipynb
@@ -37,10 +37,10 @@
     "from math import e as E\n",
     "import sys\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
-    "datasets_dir = pwk.init('ACTF1')"
+    "run_id, run_dir, datasets_dir = fidle.init('ACTF1')"
    ]
   },
   {
@@ -115,7 +115,7 @@
     "ax.plot(z, derivative(heaviside, z),  linewidth=3, alpha=0.6, label=\"dHeaviside/dx\")\n",
     "# ax.plot(z, sign(z),                  label=\"Heaviside\")\n",
     "ax.set_title(\"Heaviside\")\n",
-    "pwk.save_fig('Heaviside')\n",
+    "fidle.scrawler.save_fig('Heaviside')\n",
     "plt.show()\n",
     "\n",
     "\n",
@@ -130,7 +130,7 @@
     "ax.plot(z, sigmoid(z),             label=\"Sigmoid\")\n",
     "ax.plot(z, derivative(sigmoid, z), linewidth=3, alpha=0.6, label=\"dSigmoid/dx\")\n",
     "ax.set_title(\"Logit\")\n",
-    "pwk.save_fig('Logit')\n",
+    "fidle.scrawler.save_fig('Logit')\n",
     "plt.show()\n",
     "\n",
     "# ----- Tanh\n",
@@ -144,7 +144,7 @@
     "ax.plot(z, tanh(z),             label=\"Tanh\")\n",
     "ax.plot(z, derivative(tanh, z), linewidth=3, alpha=0.6, label=\"dTanh/dx\")\n",
     "ax.set_title(\"Tanh\")\n",
-    "pwk.save_fig('Tanh')\n",
+    "fidle.scrawler.save_fig('Tanh')\n",
     "plt.show()\n",
     "\n",
     "# ----- Relu\n",
@@ -158,7 +158,7 @@
     "ax.plot(z, relu(z),             label=\"ReLU\")\n",
     "ax.plot(z, derivative(relu, z), linewidth=3, alpha=0.6, label=\"dReLU/dx\")\n",
     "ax.set_title(\"ReLU\")\n",
-    "pwk.save_fig('ReLU')\n",
+    "fidle.scrawler.save_fig('ReLU')\n",
     "plt.show()\n",
     "\n",
     "# ----- Leaky Relu\n",
@@ -172,7 +172,7 @@
     "ax.plot(z, leaky_relu(z),              label=\"Leaky ReLU\")\n",
     "ax.plot(z, derivative( leaky_relu, z), linewidth=3, alpha=0.6, label=\"dLeakyReLU/dx\")\n",
     "ax.set_title(\"Leaky ReLU (α=0.05)\")\n",
-    "pwk.save_fig('LeakyReLU')\n",
+    "fidle.scrawler.save_fig('LeakyReLU')\n",
     "plt.show()\n",
     "\n",
     "# ----- Elu\n",
@@ -186,7 +186,7 @@
     "ax.plot(z, elu(z),              label=\"ReLU\")\n",
     "ax.plot(z, derivative( elu, z), linewidth=3, alpha=0.6, label=\"dExpReLU/dx\")\n",
     "ax.set_title(\"ELU (α=1)\")\n",
-    "pwk.save_fig('ELU')\n",
+    "fidle.scrawler.save_fig('ELU')\n",
     "plt.show()\n",
     "\n",
     "# ----- Selu\n",
@@ -200,7 +200,7 @@
     "ax.plot(z, selu(z),              label=\"SeLU\")\n",
     "ax.plot(z, derivative( selu, z), linewidth=3, alpha=0.6, label=\"dSeLU/dx\")\n",
     "ax.set_title(\"ELU (SELU)\")\n",
-    "pwk.save_fig('SeLU')\n",
+    "fidle.scrawler.save_fig('SeLU')\n",
     "plt.show()\n",
     "\n"
    ]
diff --git a/README.ipynb b/README.ipynb
index 775dc5d..ed7a936 100644
--- a/README.ipynb
+++ b/README.ipynb
@@ -3,13 +3,13 @@
   {
    "cell_type": "code",
    "execution_count": 1,
-   "id": "a2ed5c3c",
+   "id": "a6392f98",
    "metadata": {
     "execution": {
-     "iopub.execute_input": "2022-10-07T14:36:11.174082Z",
-     "iopub.status.busy": "2022-10-07T14:36:11.173271Z",
-     "iopub.status.idle": "2022-10-07T14:36:11.184854Z",
-     "shell.execute_reply": "2022-10-07T14:36:11.184061Z"
+     "iopub.execute_input": "2022-10-10T11:07:39.161206Z",
+     "iopub.status.busy": "2022-10-10T11:07:39.160393Z",
+     "iopub.status.idle": "2022-10-10T11:07:39.172452Z",
+     "shell.execute_reply": "2022-10-10T11:07:39.171611Z"
     },
     "jupyter": {
      "source_hidden": true
@@ -52,7 +52,7 @@
        "For more information, you can contact us at :  \n",
        "[<img width=\"200px\" style=\"vertical-align:middle\" src=\"fidle/img/00-Mail_contact.svg\"></img>](#top)\n",
        "\n",
-       "Current Version : <!-- VERSION_BEGIN -->2.02b2<!-- VERSION_END -->\n",
+       "Current Version : <!-- VERSION_BEGIN -->2.02b3<!-- VERSION_END -->\n",
        "\n",
        "\n",
        "## Course materials\n",
@@ -226,7 +226,7 @@
     "from IPython.display import display,Markdown\n",
     "display(Markdown(open('README.md', 'r').read()))\n",
     "#\n",
-    "# This README is visible under Jupiter Lab ;-)# Automatically generated on : 07/10/22 16:36:10"
+    "# This README is visible under Jupiter Lab ;-)# Automatically generated on : 10/10/22 13:07:38"
    ]
   }
  ],
diff --git a/README.md b/README.md
index 52214bb..ef4f47e 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ For more information, see **https://fidle.cnrs.fr** :
 For more information, you can contact us at :  
 [<img width="200px" style="vertical-align:middle" src="fidle/img/00-Mail_contact.svg"></img>](#top)
 
-Current Version : <!-- VERSION_BEGIN -->2.02b2<!-- VERSION_END -->
+Current Version : <!-- VERSION_BEGIN -->2.02b3<!-- VERSION_END -->
 
 
 ## Course materials
diff --git a/SYNOP/LADYB1-Ladybug.ipynb b/SYNOP/LADYB1-Ladybug.ipynb
index 6f6be84..77cc5c9 100644
--- a/SYNOP/LADYB1-Ladybug.ipynb
+++ b/SYNOP/LADYB1-Ladybug.ipynb
@@ -46,11 +46,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/LADYB1'\n",
-    "datasets_dir = pwk.init('LADYB1', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('LADYB1', run_dir)"
    ]
   },
   {
@@ -98,7 +98,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'train_prop', 'sequence_len', 'predict_len', 'batch_size', 'epochs')"
+    "fidle.override('scale', 'train_prop', 'sequence_len', 'predict_len', 'batch_size', 'epochs')"
    ]
   },
   {
@@ -190,7 +190,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_2d_serie(x_train[:1000], figsize=(12,12), lw=1,ms=4,save_as='01-dataset')"
+    "fidle.scrawler.serie_2d(x_train[:1000], figsize=(12,12), lw=1,ms=4,save_as='01-dataset')"
    ]
   },
   {
@@ -203,7 +203,7 @@
     "i = random.randint(0,len(x_test)-k1-k2)\n",
     "j = i+k1\n",
     "\n",
-    "pwk.plot_2d_segment( x_test[i:j+k2], x_test[j:j+k2],ms=6, save_as='02-objectives')"
+    "fidle.scrawler.segment_2d( x_test[i:j+k2], x_test[j:j+k2],ms=6, save_as='02-objectives')"
    ]
   },
   {
@@ -226,7 +226,7 @@
     "\n",
     "# ---- About\n",
     "#\n",
-    "pwk.subtitle('About the splitting of our dataset :')\n",
+    "fidle.utils.subtitle('About the splitting of our dataset :')\n",
     "\n",
     "x,y=train_generator[0]\n",
     "print(f'Number of batch trains available : ', len(train_generator))\n",
@@ -234,10 +234,10 @@
     "print('batch y shape : ',y.shape)\n",
     "\n",
     "x,y=train_generator[0]\n",
-    "pwk.subtitle('What a batch looks like (x) :')\n",
-    "pwk.np_print(x[0] )\n",
-    "pwk.subtitle('What a batch looks like (y) :')\n",
-    "pwk.np_print(y[0])"
+    "fidle.utils.subtitle('What a batch looks like (x) :')\n",
+    "fidle.utils.np_print(x[0] )\n",
+    "fidle.utils.subtitle('What a batch looks like (y) :')\n",
+    "fidle.utils.np_print(y[0])"
    ]
   },
   {
@@ -336,7 +336,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,plot={'loss':['loss','val_loss'], 'mae':['mae','val_mae']}, save_as='03-history')"
+    "fidle.scrawler.history(history,plot={'loss':['loss','val_loss'], 'mae':['mae','val_mae']}, save_as='03-history')"
    ]
   },
   {
@@ -388,8 +388,8 @@
     "print('sequence true shape :',sequence_true.shape)\n",
     "print('sequence pred shape :',sequence_pred.shape)\n",
     "\n",
-    "pwk.plot_2d_segment(sequence_true, sequence_pred)\n",
-    "pwk.plot_multivariate_serie(sequence_true, predictions=sequence_pred, labels=['Axis=0', 'Axis=1'],save_as='04-one-step-prediction')"
+    "fidle.scrawler.segment_2d(sequence_true, sequence_pred)\n",
+    "fidle.scrawler.multivariate_serie(sequence_true, predictions=sequence_pred, labels=['Axis=0', 'Axis=1'],save_as='04-one-step-prediction')"
    ]
   },
   {
@@ -447,8 +447,8 @@
    "source": [
     "sequence_true, sequence_pred = get_prediction(x_test, loaded_model, iterations=5)\n",
     "\n",
-    "pwk.plot_2d_segment(sequence_true, sequence_pred, ms=8, save_as='02-prediction-norm')\n",
-    "pwk.plot_multivariate_serie(sequence_true, predictions=sequence_pred, hide_ticks=True, labels=['Axis=0', 'Axis=1'],save_as='02-prediction-norm')"
+    "fidle.scrawler.segment_2d(sequence_true, sequence_pred, ms=8, save_as='02-prediction-norm')\n",
+    "fidle.scrawler.multivariate_serie(sequence_true, predictions=sequence_pred, hide_ticks=True, labels=['Axis=0', 'Axis=1'],save_as='02-prediction-norm')"
    ]
   },
   {
@@ -457,7 +457,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/SYNOP/SYNOP1-Preparation-of-data.ipynb b/SYNOP/SYNOP1-Preparation-of-data.ipynb
index 081e533..b8ac7f6 100644
--- a/SYNOP/SYNOP1-Preparation-of-data.ipynb
+++ b/SYNOP/SYNOP1-Preparation-of-data.ipynb
@@ -52,11 +52,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/SYNOP'\n",
-    "datasets_dir = pwk.init('SYNOP1', run_dir)\n",
+    "run_id, run_dir, datasets_dir = fidle.init('SYNOP1', run_dir)\n",
     "\n",
     "pd.set_option('display.max_rows',200)"
    ]
@@ -96,7 +96,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('output_dir')"
+    "fidle.override('output_dir')"
    ]
   },
   {
@@ -153,7 +153,7 @@
    "outputs": [],
    "source": [
     "df = pd.read_csv(f'{datasets_dir}/SYNOP/{data_filename}', header=0, sep=';')\n",
-    "pwk.subtitle('Raw data :')\n",
+    "fidle.utils.subtitle('Raw data :')\n",
     "display(df.tail(10))\n",
     "\n",
     "# ---- Get the columns name as descriptions\n",
@@ -173,7 +173,7 @@
     "#\n",
     "df_desc=pd.DataFrame({'Code':synop_codes, 'Description':synop_desc, 'Na':columns_na})\n",
     "\n",
-    "pwk.subtitle('List of columns :')\n",
+    "fidle.utils.subtitle('List of columns :')\n",
     "display(df_desc.style.set_properties(**{'text-align': 'left'}))\n",
     "\n",
     "print('Shape is : ', df.shape)"
@@ -202,7 +202,7 @@
     "\n",
     "# ---- Show all of that\n",
     "\n",
-    "pwk.subtitle('Our selected columns :')\n",
+    "fidle.utils.subtitle('Our selected columns :')\n",
     "display(df.head(20))"
    ]
   },
@@ -220,7 +220,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Few statistics :')\n",
+    "fidle.utils.subtitle('Few statistics :')\n",
     "display(df.describe().style.format('{:.2f}'))\n",
     "\n",
     "# ---- 'per' column is constant, we can drop it\n",
@@ -235,7 +235,7 @@
     "\n",
     "# ---- Show all of that\n",
     "#\n",
-    "pwk.subtitle('Do we have na values ?')\n",
+    "fidle.utils.subtitle('Do we have na values ?')\n",
     "df_desc=pd.DataFrame({'Columns':dataset_cols, 'Description':dataset_desc, 'Na':dataset_na})\n",
     "display(df_desc.style.set_properties(**{'text-align': 'left'}))"
    ]
@@ -262,7 +262,7 @@
     "# ---- Before : Lines with NaN\n",
     "\n",
     "na_rows=df.isna().any(axis=1)\n",
-    "pwk.subtitle('Before :')\n",
+    "fidle.utils.subtitle('Before :')\n",
     "display( df[na_rows].head(10) )\n",
     "\n",
     "# ---- Nice interpolation for plugging holes\n",
@@ -271,7 +271,7 @@
     "\n",
     "# ---- After\n",
     "\n",
-    "pwk.subtitle('After :')\n",
+    "fidle.utils.subtitle('After :')\n",
     "display(df[na_rows].head(10))\n"
    ]
   },
@@ -298,10 +298,10 @@
     "# ---- Show all of that\n",
     "#\n",
     "df_desc=pd.DataFrame({'Columns':dataset_cols, 'Description':dataset_desc, 'Na':dataset_na})\n",
-    "pwk.subtitle('Dataset columns :')\n",
+    "fidle.utils.subtitle('Dataset columns :')\n",
     "display(df_desc.style.set_properties(**{'text-align': 'left'}))\n",
     "\n",
-    "pwk.subtitle('Have a look :')\n",
+    "fidle.utils.subtitle('Have a look :')\n",
     "display(df.tail(20))\n",
     "print('Shape is : ', df.shape)"
    ]
@@ -321,7 +321,7 @@
    "source": [
     "i=random.randint(0,len(df)-240)\n",
     "df.iloc[i:i+240].plot(subplots=True, fontsize=12, figsize=(16,20))\n",
-    "pwk.save_fig('01-one-month')\n",
+    "fidle.scrawler.save_fig('01-one-month')\n",
     "plt.show()"
    ]
   },
@@ -340,7 +340,7 @@
    "source": [
     "# ---- Save it\n",
     "#\n",
-    "pwk.mkdir(output_dir)\n",
+    "fidle.utils.mkdir(output_dir)\n",
     "\n",
     "filedata = f'{output_dir}/{dataset_filename}'\n",
     "filedesc = f'{output_dir}/{description_filename}'\n",
@@ -361,7 +361,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/SYNOP/SYNOP2-First-predictions.ipynb b/SYNOP/SYNOP2-First-predictions.ipynb
index c4fc1e8..83b8b58 100644
--- a/SYNOP/SYNOP2-First-predictions.ipynb
+++ b/SYNOP/SYNOP2-First-predictions.ipynb
@@ -49,11 +49,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/SYNOP'\n",
-    "datasets_dir = pwk.init('SYNOP2', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('SYNOP2', run_dir)"
    ]
   },
   {
@@ -100,7 +100,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'train_prop', 'sequence_len', 'batch_size', 'epochs', 'fit_verbosity')"
+    "fidle.override('scale', 'train_prop', 'sequence_len', 'batch_size', 'epochs', 'fit_verbosity')"
    ]
   },
   {
@@ -129,7 +129,7 @@
     "# ---- Train / Test\n",
     "dataset_train = df.loc[ :train_len-1, features ]\n",
     "dataset_test  = df.loc[train_len:,    features ]\n",
-    "pwk.subtitle('Train dataset example :')\n",
+    "fidle.utils.subtitle('Train dataset example :')\n",
     "display(dataset_train.head(15))\n",
     "\n",
     "# ---- Normalize, and convert to numpy array\n",
@@ -139,13 +139,13 @@
     "dataset_train = (dataset_train - mean) / std\n",
     "dataset_test  = (dataset_test  - mean) / std\n",
     "\n",
-    "pwk.subtitle('After normalization :')\n",
+    "fidle.utils.subtitle('After normalization :')\n",
     "display(dataset_train.describe().style.format(\"{0:.2f}\"))\n",
     "\n",
     "dataset_train = dataset_train.to_numpy()\n",
     "dataset_test  = dataset_test.to_numpy()\n",
     "\n",
-    "pwk.subtitle('Shapes :')\n",
+    "fidle.utils.subtitle('Shapes :')\n",
     "print('Dataset       : ',df.shape)\n",
     "print('Train dataset : ',dataset_train.shape)\n",
     "print('Test  dataset : ',dataset_test.shape)\n"
@@ -171,7 +171,7 @@
     "\n",
     "# ---- About\n",
     "\n",
-    "pwk.subtitle('About the splitting of our dataset :')\n",
+    "fidle.utils.subtitle('About the splitting of our dataset :')\n",
     "\n",
     "x,y=train_generator[0]\n",
     "print(f'Nombre de train batchs disponibles : ', len(train_generator))\n",
@@ -179,10 +179,10 @@
     "print('batch y shape : ',y.shape)\n",
     "\n",
     "x,y=train_generator[0]\n",
-    "pwk.subtitle('What a batch looks like (x[0]) :')\n",
-    "pwk.np_print(x[0] )\n",
-    "pwk.subtitle('What a batch looks like (y[0]) :')\n",
-    "pwk.np_print(y[0])"
+    "fidle.utils.subtitle('What a batch looks like (x[0]) :')\n",
+    "fidle.utils.np_print(x[0] )\n",
+    "fidle.utils.subtitle('What a batch looks like (y[0]) :')\n",
+    "fidle.utils.np_print(y[0])"
    ]
   },
   {
@@ -227,7 +227,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.mkdir(run_dir)\n",
+    "fidle.utils.mkdir(run_dir)\n",
     "save_dir = f'{run_dir}/best_model.h5'\n",
     "bestmodel_callback = tf.keras.callbacks.ModelCheckpoint(filepath=save_dir, verbose=0, save_best_only=True)"
    ]
@@ -282,7 +282,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,plot={'loss':['loss','val_loss'], 'mae':['mae','val_mae']}, save_as='01-history')"
+    "fidle.scrawler.history(history,plot={'loss':['loss','val_loss'], 'mae':['mae','val_mae']}, save_as='01-history')"
    ]
   },
   {
@@ -330,7 +330,7 @@
     "pred = loaded_model.predict( np.array([sequence]) )\n",
     "\n",
     "# ---- Show result\n",
-    "pwk.plot_multivariate_serie(sequence_true, predictions=pred, labels=features, save_as='02-prediction-norm')\n"
+    "fidle.scrawler.multivariate_serie(sequence_true, predictions=pred, labels=features, save_as='02-prediction-norm')\n"
    ]
   },
   {
@@ -373,7 +373,7 @@
     "# ---- Show it\n",
     "feat=11\n",
     "\n",
-    "pwk.plot_multivariate_serie(sequence_true, predictions=pred, labels=features, only_features=[feat],width=14, height=8, save_as='03-prediction')\n",
+    "fidle.scrawler.multivariate_serie(sequence_true, predictions=pred, labels=features, only_features=[feat],width=14, height=8, save_as='03-prediction')\n",
     "\n",
     "delta_deg=abs(sequence_true[-1][feat]-pred[-1][feat])\n",
     "print(f'Gap between prediction and reality : {delta_deg:.2f} °C')\n"
@@ -385,7 +385,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/SYNOP/SYNOP3-12h-predictions.ipynb b/SYNOP/SYNOP3-12h-predictions.ipynb
index cd0f27f..682d6e8 100644
--- a/SYNOP/SYNOP3-12h-predictions.ipynb
+++ b/SYNOP/SYNOP3-12h-predictions.ipynb
@@ -47,11 +47,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/SYNOP'\n",
-    "datasets_dir = pwk.init('SYNOP3', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('SYNOP3', run_dir)"
    ]
   },
   {
@@ -97,7 +97,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('iterations', 'scale', 'train_prop', 'sequence_len')"
+    "fidle.override('iterations', 'scale', 'train_prop', 'sequence_len')"
    ]
   },
   {
@@ -198,7 +198,7 @@
     "       \n",
     "# ---- Show result\n",
     "\n",
-    "pwk.plot_multivariate_serie(sequence_true, predictions=pred, labels=features, save_as='01-prediction-norm')\n"
+    "fidle.scrawler.multivariate_serie(sequence_true, predictions=pred, labels=features, save_as='01-prediction-norm')\n"
    ]
   },
   {
@@ -271,7 +271,7 @@
     "\n",
     "feat=11\n",
     "\n",
-    "pwk.plot_multivariate_serie(sequence_true, predictions=pred, labels=features,\n",
+    "fidle.scrawler.multivariate_serie(sequence_true, predictions=pred, labels=features,\n",
     "                            only_features=[feat],width=14, height=8, save_as='02-prediction')"
    ]
   },
@@ -281,7 +281,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/01-VAE-with-MNIST.ipynb b/VAE/01-VAE-with-MNIST.ipynb
index 317eda6..4ca25fc 100644
--- a/VAE/01-VAE-with-MNIST.ipynb
+++ b/VAE/01-VAE-with-MNIST.ipynb
@@ -54,11 +54,11 @@
     "from modules.datagen   import MNIST\n",
     "\n",
     "import sys\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/VAE1.001'\n",
-    "datasets_dir = pwk.init('VAE1', run_dir)\n"
+    "run_id, run_dir, datasets_dir = fidle.init('VAE1', run_dir)\n"
    ]
   },
   {
@@ -109,7 +109,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('latent_dim', 'loss_weights', 'scale', 'seed', 'batch_size', 'epochs', 'fit_verbosity')"
+    "fidle.override('latent_dim', 'loss_weights', 'scale', 'seed', 'batch_size', 'epochs', 'fit_verbosity')"
    ]
   },
   {
@@ -129,7 +129,7 @@
    "source": [
     "x_data, y_data, _,_ = MNIST.get_data(seed=seed, scale=scale, train_prop=1 )\n",
     "\n",
-    "pwk.plot_images(x_data[:20], None, indices='all', columns=10, x_size=1,y_size=1,y_padding=0, save_as='01-original')"
+    "fidle.scrawler.images(x_data[:20], None, indices='all', columns=10, x_size=1,y_size=1,y_padding=0, save_as='01-original')"
    ]
   },
   {
@@ -285,7 +285,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='history')"
+    "fidle.scrawler.history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='history')"
    ]
   },
   {
@@ -306,14 +306,14 @@
    "source": [
     "images_z, images_r = callback_images.get_images( range(0,epochs,2) )\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n",
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n",
     "\n",
-    "pwk.subtitle('Encoded/decoded images')\n",
-    "pwk.plot_images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-reconstruct')\n",
+    "fidle.utils.subtitle('Encoded/decoded images')\n",
+    "fidle.scrawler.images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-reconstruct')\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
    ]
   },
   {
@@ -329,8 +329,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Generated images from latent space')\n",
-    "pwk.plot_images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-generated')"
+    "fidle.utils.subtitle('Generated images from latent space')\n",
+    "fidle.scrawler.images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-generated')"
    ]
   },
   {
@@ -361,7 +361,7 @@
     "decoder = vae.get_layer('decoder')\n",
     "\n",
     "img = decoder( np.array([[-1,.1]]))\n",
-    "pwk.plot_images(np.array(img), x_size=2,y_size=2, save_as='04-example')\n"
+    "fidle.scrawler.images(np.array(img), x_size=2,y_size=2, save_as='04-example')\n"
    ]
   },
   {
@@ -370,7 +370,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/02-VAE-with-MNIST.ipynb b/VAE/02-VAE-with-MNIST.ipynb
index 920a611..f1e43cc 100644
--- a/VAE/02-VAE-with-MNIST.ipynb
+++ b/VAE/02-VAE-with-MNIST.ipynb
@@ -58,11 +58,11 @@
     "from modules.callbacks import ImagesCallback, BestModelCallback\n",
     "from modules.datagen   import MNIST\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/VAE2.001'\n",
-    "datasets_dir = pwk.init('VAE2', run_dir)\n",
+    "run_id, run_dir, datasets_dir = fidle.init('VAE2', run_dir)\n",
     "\n",
     "VAE.about()"
    ]
@@ -115,7 +115,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('latent_dim', 'loss_weights', 'scale', 'seed', 'batch_size', 'epochs', 'fit_verbosity')"
+    "fidle.override('latent_dim', 'loss_weights', 'scale', 'seed', 'batch_size', 'epochs', 'fit_verbosity')"
    ]
   },
   {
@@ -135,7 +135,7 @@
    "source": [
     "x_data, y_data, _,_ = MNIST.get_data(seed=seed, scale=scale, train_prop=1 )\n",
     "\n",
-    "pwk.plot_images(x_data[:20], None, indices='all', columns=10, x_size=1,y_size=1,y_padding=0, save_as='01-original')"
+    "fidle.scrawler.images(x_data[:20], None, indices='all', columns=10, x_size=1,y_size=1,y_padding=0, save_as='01-original')"
    ]
   },
   {
@@ -281,7 +281,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='history')"
+    "fidle.scrawler.history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='history')"
    ]
   },
   {
@@ -302,14 +302,14 @@
    "source": [
     "images_z, images_r = callback_images.get_images( range(0,epochs,2) )\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-original')\n",
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-original')\n",
     "\n",
-    "pwk.subtitle('Encoded/decoded images')\n",
-    "pwk.plot_images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-reconstruct')\n",
+    "fidle.utils.subtitle('Encoded/decoded images')\n",
+    "fidle.scrawler.images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-reconstruct')\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_data[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
    ]
   },
   {
@@ -325,8 +325,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Generated images from latent space')\n",
-    "pwk.plot_images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='04-encoded')"
+    "fidle.utils.subtitle('Generated images from latent space')\n",
+    "fidle.scrawler.images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='04-encoded')"
    ]
   },
   {
@@ -378,8 +378,8 @@
     "# ---- Show it\n",
     "\n",
     "labels=[ str(np.round(z[i],1)) for i in range(10) ]\n",
-    "pwk.plot_images(x_show,    None, indices='all', columns=10, x_size=2,y_size=2, save_as='05-original')\n",
-    "pwk.plot_images(x_reconst, labels  , indices='all', columns=10, x_size=2,y_size=2, save_as='06-reconstruct')\n"
+    "fidle.scrawler.images(x_show,    None, indices='all', columns=10, x_size=2,y_size=2, save_as='05-original')\n",
+    "fidle.scrawler.images(x_reconst, labels  , indices='all', columns=10, x_size=2,y_size=2, save_as='06-reconstruct')\n"
    ]
   },
   {
@@ -410,7 +410,7 @@
     "fig = plt.figure(figsize=(14, 10))\n",
     "plt.scatter(z[:, 0] , z[:, 1], c=y_show, cmap= 'tab10', alpha=0.5, s=30)\n",
     "plt.colorbar()\n",
-    "pwk.save_fig('07-Latent-space')\n",
+    "fidle.scrawler.save_fig('07-Latent-space')\n",
     "plt.show()"
    ]
   },
@@ -443,13 +443,13 @@
     "fig = plt.figure(figsize=(10, 8))\n",
     "plt.scatter(z[:, 0] , z[:, 1], c=y_show, cmap= 'tab10', alpha=0.5, s=20)\n",
     "plt.scatter(grid[:, 0] , grid[:, 1], c = 'black', s=60, linewidth=2, marker='+', alpha=1)\n",
-    "pwk.save_fig('08-Latent-grid')\n",
+    "fidle.scrawler.save_fig('08-Latent-grid')\n",
     "plt.show()\n",
     "\n",
     "# ---- Plot grid corresponding images\n",
     "\n",
     "x_reconst = vae.decoder.predict([grid])\n",
-    "pwk.plot_images(x_reconst, indices='all', columns=grid_size, x_size=0.5,y_size=0.5, y_padding=0,spines_alpha=0.1, save_as='09-Latent-morphing')\n",
+    "fidle.scrawler.images(x_reconst, indices='all', columns=grid_size, x_size=0.5,y_size=0.5, y_padding=0,spines_alpha=0.1, save_as='09-Latent-morphing')\n",
     "\n"
    ]
   },
@@ -459,7 +459,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/03-VAE-with-MNIST-post.ipynb b/VAE/03-VAE-with-MNIST-post.ipynb
index 24e9753..f07f842 100644
--- a/VAE/03-VAE-with-MNIST-post.ipynb
+++ b/VAE/03-VAE-with-MNIST-post.ipynb
@@ -57,11 +57,11 @@
     "import matplotlib.pyplot as plt\n",
     "\n",
     "import sys\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/VAE2.001'\n",
-    "datasets_dir = pwk.init('VAE3', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('VAE3', run_dir)"
    ]
   },
   {
@@ -94,7 +94,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'seed')"
+    "fidle.override('scale', 'seed')"
    ]
   },
   {
@@ -155,8 +155,8 @@
     "# ---- Show it\n",
     "\n",
     "labels=[ str(np.round(z[i],1)) for i in range(10) ]\n",
-    "pwk.plot_images(x_show,    labels, indices='all', columns=10, x_size=2,y_size=2, save_as='01-original')\n",
-    "pwk.plot_images(x_reconst, None  , indices='all', columns=10, x_size=2,y_size=2, save_as='02-reconstruct')\n"
+    "fidle.scrawler.images(x_show,    labels, indices='all', columns=10, x_size=2,y_size=2, save_as='01-original')\n",
+    "fidle.scrawler.images(x_reconst, None  , indices='all', columns=10, x_size=2,y_size=2, save_as='02-reconstruct')\n"
    ]
   },
   {
@@ -187,7 +187,7 @@
     "fig = plt.figure(figsize=(14, 10))\n",
     "plt.scatter(z[:, 0] , z[:, 1], c=y_show, cmap= 'tab10', alpha=0.5, s=30)\n",
     "plt.colorbar()\n",
-    "pwk.save_fig('03-Latent-space')\n",
+    "fidle.scrawler.save_fig('03-Latent-space')\n",
     "plt.show()"
    ]
   },
@@ -220,13 +220,13 @@
     "fig = plt.figure(figsize=(12, 10))\n",
     "plt.scatter(z[:, 0] , z[:, 1], c=y_show, cmap= 'tab10', alpha=0.5, s=20)\n",
     "plt.scatter(grid[:, 0] , grid[:, 1], c = 'black', s=60, linewidth=2, marker='+', alpha=1)\n",
-    "pwk.save_fig('04-Latent-grid')\n",
+    "fidle.scrawler.save_fig('04-Latent-grid')\n",
     "plt.show()\n",
     "\n",
     "# ---- Plot grid corresponding images\n",
     "\n",
     "x_reconst = vae.decoder.predict([grid])\n",
-    "pwk.plot_images(x_reconst, indices='all', columns=grid_size, x_size=0.5,y_size=0.5, y_padding=0,spines_alpha=0.1, save_as='05-Latent-morphing')\n",
+    "fidle.scrawler.images(x_reconst, indices='all', columns=grid_size, x_size=0.5,y_size=0.5, y_padding=0,spines_alpha=0.1, save_as='05-Latent-morphing')\n",
     "\n"
    ]
   },
@@ -236,7 +236,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/05-About-CelebA.ipynb b/VAE/05-About-CelebA.ipynb
index 259b2a6..9d3e42c 100644
--- a/VAE/05-About-CelebA.ipynb
+++ b/VAE/05-About-CelebA.ipynb
@@ -42,11 +42,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir='./run/VAE5'\n",
-    "datasets_dir = pwk.init('VAE5', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('VAE5', run_dir)"
    ]
   },
   {
@@ -78,7 +78,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('progress_verbosity')"
+    "fidle.override('progress_verbosity')"
    ]
   },
   {
@@ -137,7 +137,7 @@
     "for filename in filenames:\n",
     "    image=io.imread(filename)\n",
     "    x.append(image)\n",
-    "    pwk.update_progress(f\"{nb_images} images :\",len(x),nb_images, verbosity=progress_verbosity)\n",
+    "    fidle.utils.update_progress(f\"{nb_images} images :\",len(x),nb_images, verbosity=progress_verbosity)\n",
     "x_data=np.array(x)\n",
     "x=None\n",
     "    \n",
@@ -149,9 +149,9 @@
     "pwk.display_md('<br>**Note :** Estimation for **200.000** normalized images : ')\n",
     "x_data=x_data/255\n",
     "k=200000/nb_images\n",
-    "print(f'Charging time : {k*duration:.2f} s or {pwk.hdelay(k*duration)}')\n",
+    "print(f'Charging time : {k*duration:.2f} s or {fidle.utils.hdelay(k*duration)}')\n",
     "print(f'Numpy type    : {x_data.dtype}')\n",
-    "print(f'Memory size   : {pwk.hsize(k*x_data.nbytes)}')"
+    "print(f'Memory size   : {fidle.utils.hsize(k*x_data.nbytes)}')"
    ]
   },
   {
@@ -201,7 +201,7 @@
    "outputs": [],
    "source": [
     "samples = [ random.randint(0,len(x_data)-1) for i in range(32)]\n",
-    "pwk.plot_images(x_data, indices=samples, columns=8, x_size=2, y_size=2, save_as='01-celebA')"
+    "fidle.scrawler.images(x_data, indices=samples, columns=8, x_size=2, y_size=2, save_as='01-celebA')"
    ]
   },
   {
@@ -226,7 +226,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/06-Prepare-CelebA-datasets.ipynb b/VAE/06-Prepare-CelebA-datasets.ipynb
index 29a9bbf..3c267bc 100644
--- a/VAE/06-Prepare-CelebA-datasets.ipynb
+++ b/VAE/06-Prepare-CelebA-datasets.ipynb
@@ -50,11 +50,11 @@
     "\n",
     "from importlib import reload\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir='./run/VAE6'\n",
-    "datasets_dir = pwk.init('VAE6', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('VAE6', run_dir)"
    ]
   },
   {
@@ -140,8 +140,8 @@
    "source": [
     "# ---- Used for continous integration - Just forget these lines\n",
     "#\n",
-    "pwk.override('progress_verbosity', 'scale', 'seed', )\n",
-    "pwk.override('cluster_size', 'image_size', 'output_dir', 'exit_if_exist')"
+    "fidle.override('progress_verbosity', 'scale', 'seed', )\n",
+    "fidle.override('cluster_size', 'image_size', 'output_dir', 'exit_if_exist')"
    ]
   },
   {
@@ -239,7 +239,7 @@
     "    if exit_if_exist and os.path.isfile(f'{cluster_dir}/images-000.npy'):\n",
     "        print('\\n*** Oups. There are already clusters in the target folder!\\n')\n",
     "        return 0,0\n",
-    "    pwk.mkdir(cluster_dir)\n",
+    "    fidle.utils.mkdir(cluster_dir)\n",
     "\n",
     "    # ---- Rescale\n",
     "    #\n",
@@ -247,7 +247,7 @@
     "    dataset = dataset_desc[:n]\n",
     "    cluster_size = int(cluster_size*scale)\n",
     "    print('Rescaled.')\n",
-    "    pwk.subtitle('Parameters :')\n",
+    "    fidle.utils.subtitle('Parameters :')\n",
     "    print(f'Scale is : {scale}')\n",
     "    print(f'Image size is     : {image_size}')\n",
     "    print(f'dataset length is : {n}')\n",
@@ -257,7 +257,7 @@
     "    \n",
     "    # ---- Read and save clusters\n",
     "    #\n",
-    "    pwk.subtitle('Running...')\n",
+    "    fidle.utils.subtitle('Running...')\n",
     "    imgs, desc, cluster_id = [],[],0\n",
     "    #\n",
     "    for i,row in dataset.iterrows():\n",
@@ -276,7 +276,7 @@
     "        #\n",
     "        # ---- Progress bar\n",
     "        #\n",
-    "        pwk.update_progress(f'Cluster {cluster_id:03d} :',len(imgs),\n",
+    "        fidle.utils.update_progress(f'Cluster {cluster_id:03d} :',len(imgs),\n",
     "                            cluster_size, verbosity=verbosity)\n",
     "        #\n",
     "        # ---- Save cluster if full\n",
@@ -324,13 +324,13 @@
     "directory = pathlib.Path(cluster_dir)\n",
     "s=sum(f.stat().st_size for f in directory.glob('**/*') if f.is_file())\n",
     "\n",
-    "pwk.subtitle('Ressources :')\n",
-    "print('Duration     : ',pwk.hdelay(duration))\n",
-    "print('Size         : ',pwk.hsize(s))\n",
+    "fidle.utils.subtitle('Ressources :')\n",
+    "print('Duration     : ',fidle.utils.hdelay(duration))\n",
+    "print('Size         : ',fidle.utils.hsize(s))\n",
     "\n",
-    "pwk.subtitle('Estimation with scale=1 :')\n",
-    "print('Duration     : ',pwk.hdelay(duration*(1/scale)))\n",
-    "print('Size         : ',pwk.hsize(s*(1/scale)))\n"
+    "fidle.utils.subtitle('Estimation with scale=1 :')\n",
+    "print('Duration     : ',fidle.utils.hdelay(duration*(1/scale)))\n",
+    "print('Size         : ',fidle.utils.hsize(s*(1/scale)))\n"
    ]
   },
   {
@@ -339,7 +339,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/07-Check-CelebA.ipynb b/VAE/07-Check-CelebA.ipynb
index f71089e..d0227ba 100644
--- a/VAE/07-Check-CelebA.ipynb
+++ b/VAE/07-Check-CelebA.ipynb
@@ -45,11 +45,11 @@
     "\n",
     "from modules.datagen import DataGenerator\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir='./run/VAE7'\n",
-    "datasets_dir = pwk.init('VAE7', run_dir)"
+    "run_id, run_dir, datasets_dir = fidle.init('VAE7', run_dir)"
    ]
   },
   {
@@ -92,7 +92,7 @@
    "source": [
     "# ---- Used for continous integration - Just forget this line\n",
     "#\n",
-    "pwk.override('image_size', 'enhanced_dir', 'progress_verbosity')"
+    "fidle.override('image_size', 'enhanced_dir', 'progress_verbosity')"
    ]
   },
   {
@@ -141,7 +141,7 @@
     "\n",
     "# ---- Reload all clusters\n",
     "#\n",
-    "pwk.subtitle('Reload all clusters...')\n",
+    "fidle.utils.subtitle('Reload all clusters...')\n",
     "for cluster_name in clusters_name:  \n",
     "    \n",
     "    # ---- Reload images and normalize\n",
@@ -168,19 +168,19 @@
     "    \n",
     "    # ---- To appear professional\n",
     "    \n",
-    "    pwk.update_progress('Load clusters :',i,imax, redraw=True, verbosity=progress_verbosity)\n",
+    "    fidle.utils.update_progress('Load clusters :',i,imax, redraw=True, verbosity=progress_verbosity)\n",
     "\n",
     "d=pwk.chrono_stop()\n",
     "\n",
-    "pwk.subtitle('Few stats :')\n",
-    "print(f'Loading time      : {d:.2f} s or {pwk.hdelay(d)}')\n",
+    "fidle.utils.subtitle('Few stats :')\n",
+    "print(f'Loading time      : {d:.2f} s or {fidle.utils.hdelay(d)}')\n",
     "print(f'Number of cluster : {i}')\n",
     "print(f'Number of images  : {n1}')\n",
     "print(f'Number of desc.   : {n2}')\n",
-    "print(f'Total size of img : {pwk.hsize(s)}')\n",
+    "print(f'Total size of img : {fidle.utils.hsize(s)}')\n",
     "\n",
-    "pwk.subtitle('Have a look (1 image/ cluster)...')\n",
-    "pwk.plot_images(imgs,desc,x_size=2,y_size=2,fontsize=8,columns=7,y_padding=2.5, save_as='01-images_and_desc')"
+    "fidle.utils.subtitle('Have a look (1 image/ cluster)...')\n",
+    "fidle.scrawler.images(imgs,desc,x_size=2,y_size=2,fontsize=8,columns=7,y_padding=2.5, save_as='01-images_and_desc')"
    ]
   },
   {
@@ -232,7 +232,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/08-VAE-with-CelebA.ipynb b/VAE/08-VAE-with-CelebA.ipynb
index f46e507..e9bfa05 100644
--- a/VAE/08-VAE-with-CelebA.ipynb
+++ b/VAE/08-VAE-with-CelebA.ipynb
@@ -54,11 +54,11 @@
     "from modules.callbacks import ImagesCallback, BestModelCallback\n",
     "from modules.datagen   import DataGenerator\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/VAE8.001'\n",
-    "datasets_dir = pwk.init('VAE8', run_dir)\n",
+    "run_id, run_dir, datasets_dir = fidle.init('VAE8', run_dir)\n",
     "\n",
     "VAE.about()\n",
     "DataGenerator.about()"
@@ -145,8 +145,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'image_size', 'enhanced_dir', 'latent_dim', 'loss_weights')\n",
-    "pwk.override('batch_size', 'epochs', 'fit_verbosity')"
+    "fidle.override('scale', 'image_size', 'enhanced_dir', 'latent_dim', 'loss_weights')\n",
+    "fidle.override('batch_size', 'epochs', 'fit_verbosity')"
    ]
   },
   {
@@ -358,7 +358,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='01-history')"
+    "fidle.scrawler.history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -376,14 +376,14 @@
    "source": [
     "images_z, images_r = callback_images.get_images( range(0,epochs,2) )\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-original')\n",
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-original')\n",
     "\n",
-    "pwk.subtitle('Encoded/decoded images')\n",
-    "pwk.plot_images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-reconstruct')\n",
+    "fidle.utils.subtitle('Encoded/decoded images')\n",
+    "fidle.scrawler.images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-reconstruct')\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
    ]
   },
   {
@@ -399,8 +399,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Generated images from latent space')\n",
-    "pwk.plot_images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='04-encoded')"
+    "fidle.utils.subtitle('Generated images from latent space')\n",
+    "fidle.scrawler.images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='04-encoded')"
    ]
   },
   {
@@ -409,7 +409,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/09-VAE-with-CelebA-192x160.ipynb b/VAE/09-VAE-with-CelebA-192x160.ipynb
index 2ac969a..b97c49e 100644
--- a/VAE/09-VAE-with-CelebA-192x160.ipynb
+++ b/VAE/09-VAE-with-CelebA-192x160.ipynb
@@ -54,11 +54,11 @@
     "from modules.callbacks import ImagesCallback, BestModelCallback\n",
     "from modules.datagen   import DataGenerator\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/VAE9'\n",
-    "datasets_dir = pwk.init('VAE9', run_dir)\n",
+    "run_id, run_dir, datasets_dir = fidle.init('VAE9', run_dir)\n",
     "\n",
     "VAE.about()\n",
     "DataGenerator.about()"
@@ -135,8 +135,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.override('scale', 'image_size', 'enhanced_dir', 'latent_dim', 'loss_weights')\n",
-    "pwk.override('batch_size', 'epochs', 'fit_verbosity')"
+    "fidle.override('scale', 'image_size', 'enhanced_dir', 'latent_dim', 'loss_weights')\n",
+    "fidle.override('batch_size', 'epochs', 'fit_verbosity')"
    ]
   },
   {
@@ -368,7 +368,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.plot_history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='01-history')"
+    "fidle.scrawler.history(history,  plot={\"Loss\":['loss','r_loss', 'kl_loss']}, save_as='01-history')"
    ]
   },
   {
@@ -386,14 +386,14 @@
    "source": [
     "images_z, images_r = callback_images.get_images( range(0,epochs,2) )\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-original')\n",
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as='02-original')\n",
     "\n",
-    "pwk.subtitle('Encoded/decoded images')\n",
-    "pwk.plot_images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-reconstruct')\n",
+    "fidle.utils.subtitle('Encoded/decoded images')\n",
+    "fidle.scrawler.images(images_z, None, indices='all', columns=5, x_size=2,y_size=2, save_as='03-reconstruct')\n",
     "\n",
-    "pwk.subtitle('Original images :')\n",
-    "pwk.plot_images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
+    "fidle.utils.subtitle('Original images :')\n",
+    "fidle.scrawler.images(x_draw[:5], None, indices='all', columns=5, x_size=2,y_size=2, save_as=None)\n"
    ]
   },
   {
@@ -409,8 +409,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Generated images from latent space')\n",
-    "pwk.plot_images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='04-encoded')"
+    "fidle.utils.subtitle('Generated images from latent space')\n",
+    "fidle.scrawler.images(images_r, None, indices='all', columns=5, x_size=2,y_size=2, save_as='04-encoded')"
    ]
   },
   {
@@ -419,7 +419,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/VAE/10-VAE-with-CelebA-post.ipynb b/VAE/10-VAE-with-CelebA-post.ipynb
index 21c92ea..8c6b5da 100644
--- a/VAE/10-VAE-with-CelebA-post.ipynb
+++ b/VAE/10-VAE-with-CelebA-post.ipynb
@@ -57,11 +57,11 @@
     "from modules.datagen import DataGenerator\n",
     "from modules.models  import VAE\n",
     "\n",
-    "sys.path.append('..')\n",
-    "import fidle.pwk as pwk\n",
+    "# Init Fidle environment\n",
+    "import fidle\n",
     "\n",
     "run_dir = './run/VAE8.001'\n",
-    "datasets_dir = pwk.init('VAE10', run_dir)\n",
+    "run_id, run_dir, datasets_dir = fidle.init('VAE10', run_dir)\n",
     "\n",
     "VAE.about()"
    ]
@@ -107,7 +107,7 @@
    "source": [
     "# ---- Used for continous integration - Just forget this line\n",
     "#\n",
-    "pwk.override('image_size', 'enhanced_dir')"
+    "fidle.override('image_size', 'enhanced_dir')"
    ]
   },
   {
@@ -185,8 +185,8 @@
     "\n",
     "# ---- Just show it\n",
     "\n",
-    "pwk.plot_images(x_data[:10],    None, columns=10, x_size=1.5,y_size=1.5, spines_alpha=0.1, save_as='01-original')\n",
-    "pwk.plot_images(y_reconst[:10], None, columns=10, x_size=1.5,y_size=1.5, spines_alpha=0.1, save_as='02-reconstruct')\n"
+    "fidle.scrawler.images(x_data[:10],    None, columns=10, x_size=1.5,y_size=1.5, spines_alpha=0.1, save_as='01-original')\n",
+    "fidle.scrawler.images(y_reconst[:10], None, columns=10, x_size=1.5,y_size=1.5, spines_alpha=0.1, save_as='02-reconstruct')\n"
    ]
   },
   {
@@ -216,7 +216,7 @@
     "    ax.text(0.5, -0.2, str(i), fontsize=14, ha='center', transform=ax.transAxes)\n",
     "    ax.plot(x,norm.pdf(x))\n",
     "\n",
-    "pwk.save_fig('03-latent-space')\n",
+    "fidle.scrawler.save_fig('03-latent-space')\n",
     "plt.show()"
    ]
   },
@@ -238,7 +238,7 @@
     "z_new = np.random.normal( loc=0,scale=0.7,size=(n_new,z_dim) )\n",
     "x_new = vae.decoder.predict(z_new)\n",
     "\n",
-    "pwk.plot_images(x_new, None, columns=6, x_size=2,y_size=2.4, spines_alpha=0,y_padding=0, save_as='04-new-faces')"
+    "fidle.scrawler.images(x_new, None, columns=6, x_size=2,y_size=2.4, spines_alpha=0,y_padding=0, save_as='04-new-faces')"
    ]
   },
   {
@@ -255,10 +255,10 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.subtitle('Dataset description file (csv) :')\n",
+    "fidle.utils.subtitle('Dataset description file (csv) :')\n",
     "display(dataset_desc.head())\n",
     "\n",
-    "pwk.subtitle('Defined attributes :')\n",
+    "fidle.utils.subtitle('Defined attributes :')\n",
     "for i,v in enumerate(dataset_desc.columns):\n",
     "    print(f'{v:24}', end='')\n",
     "    if (i+1) % 4 == 0 :print('')"
@@ -328,7 +328,7 @@
     "\n",
     "z_images = np.array( [z11,z12,z21] )\n",
     "x_images = vae.decoder.predict( z_images, verbose=0 )\n",
-    "pwk.plot_images(x_images,labels,columns=3,x_size=3,y_size=3,spines_alpha=0, save_as='05-predictable')"
+    "fidle.scrawler.images(x_images,labels,columns=3,x_size=3,y_size=3,spines_alpha=0, save_as='05-predictable')"
    ]
   },
   {
@@ -355,7 +355,7 @@
     "        z.append( z11+di*i+dj*j )\n",
     "\n",
     "x_images = vae.decoder.predict( np.array(z) )\n",
-    "pwk.plot_images(x_images,columns=n,x_size=2,y_size=2.4,y_padding=0,spines_alpha=0, save_as='06-morphing')"
+    "fidle.scrawler.images(x_images,columns=n,x_size=2,y_size=2.4,y_padding=0,spines_alpha=0, save_as='06-morphing')"
    ]
   },
   {
@@ -364,7 +364,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "pwk.end()"
+    "fidle.end()"
    ]
   },
   {
diff --git a/environments/archives/environment.yml b/environments/archives/environment.yml
deleted file mode 100644
index 168168f..0000000
--- a/environments/archives/environment.yml
+++ /dev/null
@@ -1,203 +0,0 @@
-name: fidle
-channels:
-  - pytorch
-  - defaults
-dependencies:
-  - _libgcc_mutex=0.1
-  - _tflow_select=2.1.0
-  - absl-py=0.11.0
-  - aiohttp=3.6.3
-  - argon2-cffi=20.1.0
-  - astunparse=1.6.3
-  - async-timeout=3.0.1
-  - async_generator=1.10
-  - attrs=20.3.0
-  - backcall=0.2.0
-  - blas=1.0
-  - bleach=3.2.2
-  - blinker=1.4
-  - blosc=1.20.1
-  - brotli=1.0.9
-  - brotlipy=0.7.0
-  - brunsli=0.1
-  - bzip2=1.0.8
-  - c-ares=1.17.1
-  - ca-certificates=2021.1.19
-  - cachetools=4.2.1
-  - certifi=2020.12.5
-  - cffi=1.14.4
-  - chardet=3.0.4
-  - charls=2.1.0
-  - click=7.1.2
-  - cloudpickle=1.6.0
-  - cryptography=3.3.1
-  - cudatoolkit=10.1.243
-  - cudnn=7.6.5
-  - cupti=10.1.168
-  - cycler=0.10.0
-  - cytoolz=0.11.0
-  - dask-core=2021.1.1
-  - dbus=1.13.18
-  - decorator=4.4.2
-  - defusedxml=0.6.0
-  - entrypoints=0.3
-  - expat=2.2.10
-  - fontconfig=2.13.0
-  - freetype=2.10.4
-  - gast=0.3.3
-  - giflib=5.1.4
-  - glib=2.66.1
-  - google-auth=1.24.0
-  - google-auth-oauthlib=0.4.2
-  - google-pasta=0.2.0
-  - grpcio=1.31.0
-  - gst-plugins-base=1.14.0
-  - gstreamer=1.14.0
-  - h5py=2.10.0
-  - hdf5=1.10.6
-  - icu=58.2
-  - idna=2.10
-  - imagecodecs=2021.1.11
-  - imageio=2.9.0
-  - importlib-metadata=2.0.0
-  - importlib_metadata=2.0.0
-  - intel-openmp=2020.2
-  - ipykernel=5.3.4
-  - ipython=7.19.0
-  - ipython_genutils=0.2.0
-  - jedi=0.18.0
-  - jinja2=2.11.2
-  - joblib=1.0.0
-  - jpeg=9b
-  - json5=0.9.5
-  - jsonschema=3.2.0
-  - jupyter_client=6.1.7
-  - jupyter_core=4.7.0
-  - jupyterlab=2.2.6
-  - jupyterlab_pygments=0.1.2
-  - jupyterlab_server=1.2.0
-  - jxrlib=1.1
-  - keras-preprocessing=1.1.0
-  - kiwisolver=1.3.0
-  - lcms2=2.11
-  - ld_impl_linux-64=2.33.1
-  - lerc=2.2.1
-  - libaec=1.0.4
-  - libdeflate=1.7
-  - libedit=3.1.20191231
-  - libffi=3.3
-  - libgcc-ng=9.1.0
-  - libgfortran-ng=7.3.0
-  - libpng=1.6.37
-  - libprotobuf=3.13.0.1
-  - libsodium=1.0.18
-  - libstdcxx-ng=9.1.0
-  - libtiff=4.1.0
-  - libuuid=1.0.3
-  - libuv=1.40.0
-  - libwebp=1.0.1
-  - libxcb=1.14
-  - libxml2=2.9.10
-  - libzopfli=1.0.3
-  - lz4-c=1.9.3
-  - markdown=3.3.3
-  - markupsafe=1.1.1
-  - matplotlib=3.3.2
-  - matplotlib-base=3.3.2
-  - mistune=0.8.4
-  - mkl=2020.2
-  - mkl-service=2.3.0
-  - mkl_fft=1.2.0
-  - mkl_random=1.1.1
-  - multidict=4.7.6
-  - nbclient=0.5.1
-  - nbconvert=6.0.7
-  - nbformat=5.1.2
-  - ncurses=6.2
-  - nest-asyncio=1.4.3
-  - networkx=2.5
-  - ninja=1.10.2
-  - notebook=6.2.0
-  - numpy=1.19.2
-  - numpy-base=1.19.2
-  - oauthlib=3.1.0
-  - olefile=0.46
-  - openjpeg=2.3.0
-  - openssl=1.1.1i
-  - opt_einsum=3.1.0
-  - packaging=20.8
-  - pandas=1.2.1
-  - pandoc=2.11
-  - pandocfilters=1.4.3
-  - parso=0.8.1
-  - pcre=8.44
-  - pexpect=4.8.0
-  - pickleshare=0.7.5
-  - pillow=8.1.0
-  - pip=20.3.3
-  - prometheus_client=0.9.0
-  - prompt-toolkit=3.0.8
-  - protobuf=3.13.0.1
-  - ptyprocess=0.7.0
-  - pyasn1=0.4.8
-  - pyasn1-modules=0.2.8
-  - pycparser=2.20
-  - pygments=2.7.4
-  - pyjwt=1.7.1
-  - pyopenssl=20.0.1
-  - pyparsing=2.4.7
-  - pyqt=5.9.2
-  - pyrsistent=0.17.3
-  - pysocks=1.7.1
-  - python=3.8.5
-  - python-dateutil=2.8.1
-  - pytorch=1.7.1
-  - pytz=2020.5
-  - pywavelets=1.1.1
-  - pyyaml=5.4.1
-  - pyzmq=20.0.0
-  - qt=5.9.7
-  - readline=8.0
-  - requests=2.25.1
-  - requests-oauthlib=1.3.0
-  - rsa=4.7
-  - scikit-image=0.17.2
-  - scikit-learn=0.23.2
-  - scipy=1.5.2
-  - send2trash=1.5.0
-  - setuptools=52.0.0
-  - sip=4.19.13
-  - six=1.15.0
-  - snappy=1.1.8
-  - sqlite=3.33.0
-  - tensorboard=2.3.0
-  - tensorboard-plugin-wit=1.6.0
-  - tensorflow=2.2.0
-  - tensorflow-base=2.2.0
-  - tensorflow-estimator=2.2.0
-  - tensorflow-gpu=2.2.0
-  - termcolor=1.1.0
-  - terminado=0.9.2
-  - testpath=0.4.4
-  - threadpoolctl=2.1.0
-  - tifffile=2021.1.14
-  - tk=8.6.10
-  - toolz=0.11.1
-  - torchvision=0.8.2
-  - tornado=6.1
-  - traitlets=5.0.5
-  - typing_extensions=3.7.4.3
-  - urllib3=1.26.2
-  - wcwidth=0.2.5
-  - webencodings=0.5.1
-  - werkzeug=1.0.1
-  - wheel=0.36.2
-  - wrapt=1.12.1
-  - xz=5.2.5
-  - yaml=0.2.5
-  - yarl=1.6.3
-  - zeromq=4.3.3
-  - zfp=0.5.5
-  - zipp=3.4.0
-  - zlib=1.2.11
-  - zstd=1.4.5
diff --git a/environments/archives/fidle_environment_linux.txt b/environments/archives/fidle_environment_linux.txt
deleted file mode 100644
index 814ed8f..0000000
--- a/environments/archives/fidle_environment_linux.txt
+++ /dev/null
@@ -1,199 +0,0 @@
-# This file may be used to create an environment using:
-# $ conda create --name <env> --file <this file>
-# platform: linux-64
-@EXPLICIT
-https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda
-https://repo.anaconda.com/pkgs/main/linux-64/_tflow_select-2.3.0-mkl.conda
-https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-mkl.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2021.1.19-h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/intel-openmp-2020.2-254.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.33.1-h53a641e_7.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libgfortran-ng-7.3.0-hdf63c60_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-9.1.0-hdf63c60_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pandoc-2.11-hb0f4dca_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-9.1.0-hdf63c60_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl-2020.2-256.conda
-https://repo.anaconda.com/pkgs/main/linux-64/brotli-1.0.9-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/c-ares-1.17.1-h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/charls-2.1.0-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cudatoolkit-11.0.221-h6bb024c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/expat-2.2.10-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/giflib-5.1.4-h14c3975_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/icu-58.2-he6710b0_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jpeg-9b-h024ee3a_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jxrlib-1.1-h7b6447c_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/lerc-2.2.1-h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libaec-1.0.4-he6710b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libdeflate-1.7-h27cfd23_5.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.3-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libsodium-1.0.18-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.0.3-h1bed415_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libuv-1.40.0-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.14-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libzopfli-1.0.3-he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.3-h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.2-he6710b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/openssl-1.1.1i-h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pcre-8.44-he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/snappy-1.1.8-he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/xz-5.2.5-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/yaml-0.2.5-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zfp-0.5.5-h2531618_4.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.11-h7b6447c_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/brunsli-0.1-h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/glib-2.66.1-h92f7085_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/hdf5-1.10.6-hb1b8bf9_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20191231-h14c3975_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libpng-1.6.37-hbc83047_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libprotobuf-3.14.0-h8c45485_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libxml2-2.9.10-hb55368b_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/readline-8.1-h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.10-hbc83047_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zeromq-4.3.3-he6710b0_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zstd-1.4.5-h9ceee32_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/blosc-1.20.1-hd408876_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.10.4-h5ab3b9f_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/gstreamer-1.14.0-h28cd5cc_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libtiff-4.1.0-h2733197_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.33.0-h62c20be_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/fontconfig-2.13.0-h9420a91_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/gst-plugins-base-1.14.0-h8213a91_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/lcms2-2.11-h396b838_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libwebp-1.0.1-h8e7db2f_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/openjpeg-2.3.0-h05c96fa_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/python-3.8.5-h7579374_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/async-timeout-3.0.1-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/async_generator-1.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/attrs-20.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/backcall-0.2.0-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/blinker-1.4-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/cachetools-4.2.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/certifi-2020.12.5-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/chardet-3.0.4-py38h06a4308_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/click-7.1.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/cloudpickle-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/decorator-4.4.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/defusedxml-0.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/entrypoints-0.3-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/gast-0.3.3-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/idna-2.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/ipython_genutils-0.2.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.3.1-py38h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/markupsafe-1.1.1-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mistune-0.8.4-py38h7b6447c_1000.conda
-https://repo.anaconda.com/pkgs/main/linux-64/multidict-4.7.6-py38h7b6447c_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nest-asyncio-1.4.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ninja-1.10.2-py38hff7bd54_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/olefile-0.46-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pandocfilters-1.4.3-py38h06a4308_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pickleshare-0.7.5-pyhd3eb1b0_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/prometheus_client-0.9.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/ptyprocess-0.7.0-pyhd3eb1b0_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-0.4.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pycparser-2.20-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyparsing-2.4.7-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/pyrsistent-0.17.3-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pysocks-1.7.1-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pytz-2021.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyyaml-5.4.1-py38h27cfd23_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyzmq-20.0.0-py38h2531618_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/qt-5.9.7-h5867ecd_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/send2trash-1.5.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/sip-4.19.13-py38he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/six-1.15.0-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/termcolor-1.1.0-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/testpath-0.4.4-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.1.0-pyh5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/toolz-0.11.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.1-py38h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/typing_extensions-3.7.4.3-pyh06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/wcwidth-0.2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/webencodings-0.5.1-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/werkzeug-1.0.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/wheel-0.36.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/wrapt-1.12.1-py38h7b6447c_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/zipp-3.4.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/absl-py-0.11.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cffi-1.14.4-py38h261ae71_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cycler-0.10.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cytoolz-0.11.0-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/dask-core-2021.1.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-pasta-0.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib-metadata-2.0.0-py_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.17.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl-service-2.3.0-py38he904b0f_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/packaging-20.9-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pexpect-4.8.0-pyhd3eb1b0_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pillow-8.1.0-py38he98fc37_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-modules-0.2.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyqt-5.9.2-py38h05f1152_4.conda
-https://repo.anaconda.com/pkgs/main/noarch/python-dateutil-2.8.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/rsa-4.7-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/setuptools-52.0.0-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/terminado-0.9.2-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/traitlets-5.0.5-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/yarl-1.6.3-py38h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/aiohttp-3.6.3-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/argon2-cffi-20.1.0-py38h7b6447c_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/bleach-3.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/brotlipy-0.7.0-py38h27cfd23_1003.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cryptography-3.3.1-py38h3c74f83_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/grpcio-1.31.0-py38hf8bcb03_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-2.0.0-1.conda
-https://repo.anaconda.com/pkgs/main/noarch/jinja2-2.11.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/joblib-1.0.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-4.7.1-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/markdown-3.3.3-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/networkx-2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.19.2-py38hfa32c7d_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pip-20.3.3-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/protobuf-3.14.0-py38h2531618_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/pygments-2.7.4-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-plugin-wit-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-1.24.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jsonschema-3.2.0-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyter_client-6.1.7-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_pygments-0.1.2-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/prompt-toolkit-3.0.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyjwt-1.7.1-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyopenssl-20.0.1-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ipython-7.20.0-py38hb070fc8_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbformat-5.1.2-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/oauthlib-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/urllib3-1.26.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ipykernel-5.3.4-py38h5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbclient-0.5.1-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-2.25.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-6.0.7-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-oauthlib-1.3.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-oauthlib-0.4.2-pyhd3eb1b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/notebook-6.2.0-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_server-1.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab-2.2.6-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/h5py-2.10.0-py38hd6299e0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/imagecodecs-2021.1.11-py38h581e88b_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-3.3.2-h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.3.2-py38h817c723_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl_fft-1.2.0-py38h23d657b_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl_random-1.1.1-py38h0573a6f_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.19.2-py38h54aff64_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/imageio-2.9.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/opt_einsum-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pandas-1.2.1-py38ha9443f7_0.conda
-https://conda.anaconda.org/pytorch/linux-64/pytorch-1.7.1-py3.8_cuda11.0.221_cudnn8.0.5_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/pywavelets-1.1.1-py38h7b6447c_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.5.2-py38h0b6359f_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-2.3.0-pyh4dce500_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tifffile-2021.1.14-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/keras-preprocessing-1.1.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/scikit-image-0.17.2-py38hdf5156a_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-0.23.2-py38h0573a6f_0.conda
-https://conda.anaconda.org/pytorch/linux-64/torchvision-0.8.2-py38_cu110.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/tensorflow-base-2.2.0-mkl_py38h5059a2d_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorflow-estimator-2.2.0-pyh208ff02_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/tensorflow-2.2.0-mkl_py38h6d3daf0_0.conda
diff --git a/environments/archives/fidle_environment_linux_gpu_cuda101.txt b/environments/archives/fidle_environment_linux_gpu_cuda101.txt
deleted file mode 100644
index 9a7689b..0000000
--- a/environments/archives/fidle_environment_linux_gpu_cuda101.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-# This file may be used to create an environment using:
-# $ conda create --name <env> --file <this file>
-# platform: linux-64
-@EXPLICIT
-https://repo.anaconda.com/pkgs/main/linux-64/_libgcc_mutex-0.1-main.conda
-https://repo.anaconda.com/pkgs/main/linux-64/_tflow_select-2.1.0-gpu.conda
-https://repo.anaconda.com/pkgs/main/linux-64/blas-1.0-mkl.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ca-certificates-2021.1.19-h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cudatoolkit-10.1.243-h6bb024c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/intel-openmp-2020.2-254.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ld_impl_linux-64-2.33.1-h53a641e_7.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libgfortran-ng-7.3.0-hdf63c60_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libstdcxx-ng-9.1.0-hdf63c60_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pandoc-2.11-hb0f4dca_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cudnn-7.6.5-cuda10.1_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cupti-10.1.168-0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libgcc-ng-9.1.0-hdf63c60_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl-2020.2-256.conda
-https://repo.anaconda.com/pkgs/main/linux-64/brotli-1.0.9-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/bzip2-1.0.8-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/c-ares-1.17.1-h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/charls-2.1.0-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/expat-2.2.10-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/giflib-5.1.4-h14c3975_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/icu-58.2-he6710b0_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jpeg-9b-h024ee3a_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jxrlib-1.1-h7b6447c_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/lerc-2.2.1-h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libaec-1.0.4-he6710b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libdeflate-1.7-h27cfd23_5.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libffi-3.3-he6710b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libsodium-1.0.18-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libuuid-1.0.3-h1bed415_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libuv-1.40.0-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libxcb-1.14-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libzopfli-1.0.3-he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/lz4-c-1.9.3-h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ncurses-6.2-he6710b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/openssl-1.1.1i-h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pcre-8.44-he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/snappy-1.1.8-he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/xz-5.2.5-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/yaml-0.2.5-h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zfp-0.5.5-h2531618_4.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zlib-1.2.11-h7b6447c_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/brunsli-0.1-h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/glib-2.66.1-h92f7085_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/hdf5-1.10.6-hb1b8bf9_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libedit-3.1.20191231-h14c3975_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libpng-1.6.37-hbc83047_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libprotobuf-3.14.0-h8c45485_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libxml2-2.9.10-hb55368b_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/readline-8.1-h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/tk-8.6.10-hbc83047_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zeromq-4.3.3-he6710b0_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/zstd-1.4.5-h9ceee32_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/blosc-1.20.1-hd408876_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/dbus-1.13.18-hb2f20db_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/freetype-2.10.4-h5ab3b9f_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/gstreamer-1.14.0-h28cd5cc_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libtiff-4.1.0-h2733197_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/sqlite-3.33.0-h62c20be_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/fontconfig-2.13.0-h9420a91_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/gst-plugins-base-1.14.0-h8213a91_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/lcms2-2.11-h396b838_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/libwebp-1.0.1-h8e7db2f_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/openjpeg-2.3.0-h05c96fa_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/python-3.8.5-h7579374_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/async-timeout-3.0.1-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/async_generator-1.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/attrs-20.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/backcall-0.2.0-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/blinker-1.4-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/cachetools-4.2.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/certifi-2020.12.5-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/chardet-3.0.4-py38h06a4308_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/click-7.1.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/cloudpickle-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/decorator-4.4.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/defusedxml-0.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/entrypoints-0.3-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/gast-0.3.3-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/idna-2.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/ipython_genutils-0.2.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/kiwisolver-1.3.1-py38h2531618_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/markupsafe-1.1.1-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mistune-0.8.4-py38h7b6447c_1000.conda
-https://repo.anaconda.com/pkgs/main/linux-64/multidict-4.7.6-py38h7b6447c_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nest-asyncio-1.4.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ninja-1.10.2-py38hff7bd54_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/olefile-0.46-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pandocfilters-1.4.3-py38h06a4308_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pickleshare-0.7.5-pyhd3eb1b0_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/prometheus_client-0.9.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/ptyprocess-0.7.0-pyhd3eb1b0_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-0.4.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pycparser-2.20-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyparsing-2.4.7-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/pyrsistent-0.17.3-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pysocks-1.7.1-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pytz-2021.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyyaml-5.4.1-py38h27cfd23_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyzmq-20.0.0-py38h2531618_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/qt-5.9.7-h5867ecd_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/send2trash-1.5.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/sip-4.19.13-py38he6710b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/six-1.15.0-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/termcolor-1.1.0-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/testpath-0.4.4-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.1.0-pyh5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/toolz-0.11.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/tornado-6.1-py38h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/typing_extensions-3.7.4.3-pyh06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/wcwidth-0.2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/webencodings-0.5.1-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/werkzeug-1.0.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/wheel-0.36.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/wrapt-1.12.1-py38h7b6447c_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/zipp-3.4.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/absl-py-0.11.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cffi-1.14.4-py38h261ae71_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cycler-0.10.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cytoolz-0.11.0-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/dask-core-2021.1.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-pasta-0.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib-metadata-2.0.0-py_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jedi-0.17.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl-service-2.3.0-py38he904b0f_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/packaging-20.9-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pexpect-4.8.0-pyhd3eb1b0_3.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pillow-8.1.0-py38he98fc37_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-modules-0.2.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyqt-5.9.2-py38h05f1152_4.conda
-https://repo.anaconda.com/pkgs/main/noarch/python-dateutil-2.8.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/rsa-4.7-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/setuptools-52.0.0-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/terminado-0.9.2-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/traitlets-5.0.5-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/yarl-1.6.3-py38h27cfd23_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/aiohttp-3.6.3-py38h7b6447c_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/argon2-cffi-20.1.0-py38h7b6447c_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/bleach-3.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/brotlipy-0.7.0-py38h27cfd23_1003.conda
-https://repo.anaconda.com/pkgs/main/linux-64/cryptography-3.3.1-py38h3c74f83_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/grpcio-1.31.0-py38hf8bcb03_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-2.0.0-1.conda
-https://repo.anaconda.com/pkgs/main/noarch/jinja2-2.11.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/joblib-1.0.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/jupyter_core-4.7.1-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/markdown-3.3.3-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/networkx-2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/numpy-base-1.19.2-py38hfa32c7d_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pip-20.3.3-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/protobuf-3.14.0-py38h2531618_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/pygments-2.7.4-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-plugin-wit-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-1.24.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jsonschema-3.2.0-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyter_client-6.1.7-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_pygments-0.1.2-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/prompt-toolkit-3.0.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pyjwt-1.7.1-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyopenssl-20.0.1-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ipython-7.20.0-py38hb070fc8_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbformat-5.1.2-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/oauthlib-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/urllib3-1.26.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/ipykernel-5.3.4-py38h5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbclient-0.5.1-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-2.25.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/nbconvert-6.0.7-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-oauthlib-1.3.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-oauthlib-0.4.2-pyhd3eb1b0_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/notebook-6.2.0-py38h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_server-1.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab-2.2.6-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/h5py-2.10.0-py38hd6299e0_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/imagecodecs-2021.1.11-py38h581e88b_1.conda
-https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-3.3.2-h06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/matplotlib-base-3.3.2-py38h817c723_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl_fft-1.2.0-py38h23d657b_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/mkl_random-1.1.1-py38h0573a6f_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/numpy-1.19.2-py38h54aff64_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/imageio-2.9.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/opt_einsum-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/pandas-1.2.1-py38ha9443f7_0.conda
-https://conda.anaconda.org/pytorch/linux-64/pytorch-1.7.1-py3.8_cuda10.1.243_cudnn7.6.3_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/pywavelets-1.1.1-py38h7b6447c_2.conda
-https://repo.anaconda.com/pkgs/main/linux-64/scipy-1.5.2-py38h0b6359f_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-2.3.0-pyh4dce500_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tifffile-2021.1.14-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/keras-preprocessing-1.1.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/scikit-image-0.17.2-py38hdf5156a_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/scikit-learn-0.23.2-py38h0573a6f_0.conda
-https://conda.anaconda.org/pytorch/linux-64/torchvision-0.8.2-py38_cu101.tar.bz2
-https://repo.anaconda.com/pkgs/main/linux-64/tensorflow-base-2.2.0-gpu_py38h83e3d50_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorflow-estimator-2.2.0-pyh208ff02_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/tensorflow-2.2.0-gpu_py38hb782248_0.conda
-https://repo.anaconda.com/pkgs/main/linux-64/tensorflow-gpu-2.2.0-h0d30ee6_0.conda
diff --git a/environments/archives/fidle_environment_windows10.txt b/environments/archives/fidle_environment_windows10.txt
deleted file mode 100644
index 2560446..0000000
--- a/environments/archives/fidle_environment_windows10.txt
+++ /dev/null
@@ -1,192 +0,0 @@
-# This file may be used to create an environment using:
-# $ conda create --name <env> --file <this file>
-# platform: win-64
-@EXPLICIT
-https://repo.anaconda.com/pkgs/main/win-64/_tflow_select-2.3.0-eigen.conda
-https://repo.anaconda.com/pkgs/main/win-64/blas-1.0-mkl.conda
-https://repo.anaconda.com/pkgs/main/win-64/ca-certificates-2021.1.19-haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/icc_rt-2019.0.0-h0cc432a_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/intel-openmp-2020.2-254.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/msys2-conda-epoch-20160418-1.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/pandoc-2.11-h9490d1a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/vs2015_runtime-14.27.29016-h5e58377_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/winpty-0.4.3-4.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gmp-6.1.0-2.tar.bz2
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/mkl-2020.2-256.conda
-https://repo.anaconda.com/pkgs/main/win-64/vc-14.2-h21ff451_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/brotli-1.0.9-ha925a31_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/bzip2-1.0.8-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/charls-2.1.0-h33f27b4_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/cudatoolkit-11.0.221-h74a9793_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/giflib-5.2.1-h62dcd97_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/icu-58.2-ha925a31_3.conda
-https://repo.anaconda.com/pkgs/main/win-64/jpeg-9b-hb83a4c4_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/lerc-2.2.1-hd77b12b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libaec-1.0.4-h33f27b4_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/libdeflate-1.7-h2bbff1b_5.conda
-https://repo.anaconda.com/pkgs/main/win-64/libsodium-1.0.18-h62dcd97_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libuv-1.40.0-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libzopfli-1.0.3-ha925a31_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/lz4-c-1.9.3-h2bbff1b_0.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/openssl-1.1.1i-h2bbff1b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/snappy-1.1.8-h33f27b4_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/tk-8.6.10-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/xz-5.2.5-h62dcd97_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/yaml-0.2.5-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/zfp-0.5.5-hd77b12b_4.conda
-https://repo.anaconda.com/pkgs/main/win-64/zlib-1.2.11-h62dcd97_4.conda
-https://repo.anaconda.com/pkgs/main/win-64/hdf5-1.10.4-h7ebc959_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libpng-1.6.37-h2a8f88b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libprotobuf-3.13.0.1-h200bbdf_0.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/sqlite-3.33.0-h2a8f88b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/zeromq-4.3.3-ha925a31_3.conda
-https://repo.anaconda.com/pkgs/main/win-64/zstd-1.4.5-h04227a9_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/blosc-1.20.1-h7bd577a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/freetype-2.10.4-hd328e21_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libtiff-4.1.0-h56a325e_1.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/python-3.8.5-h5fd99cc_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/qt-5.9.7-vc14h73c81de_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/async-timeout-3.0.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/async_generator-1.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/attrs-20.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/backcall-0.2.0-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/blinker-1.4-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/cachetools-4.2.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/certifi-2020.12.5-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/chardet-3.0.4-py38haa95532_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/click-7.1.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/cloudpickle-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/colorama-0.4.4-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/decorator-4.4.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/defusedxml-0.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/entrypoints-0.3-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/gast-0.4.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/idna-2.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/ipython_genutils-0.2.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/kiwisolver-1.3.0-py38hd77b12b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/lcms2-2.11-hc51a39a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/markupsafe-1.1.1-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mistune-0.8.4-py38he774522_1000.conda
-https://repo.anaconda.com/pkgs/main/win-64/multidict-4.7.6-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nest-asyncio-1.4.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/ninja-1.10.2-py38h6d14046_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/olefile-0.46-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/openjpeg-2.3.0-h5ec785f_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pandocfilters-1.4.3-py38haa95532_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pickleshare-0.7.5-pyhd3eb1b0_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/prometheus_client-0.9.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-0.4.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pycparser-2.20-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyparsing-2.4.7-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/pyreadline-2.1-py38_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyrsistent-0.17.3-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pytz-2020.5-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pywin32-227-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pywinpty-0.5.7-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyyaml-5.4.1-py38h2bbff1b_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyzmq-20.0.0-py38hd77b12b_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/send2trash-1.5.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/sip-4.19.13-py38ha925a31_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/six-1.15.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/termcolor-1.1.0-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/testpath-0.4.4-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.1.0-pyh5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/toolz-0.11.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/tornado-6.1-py38h2bbff1b_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/typing_extensions-3.7.4.3-pyh06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/wcwidth-0.2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/webencodings-0.5.1-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/werkzeug-1.0.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/wheel-0.36.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/win_inet_pton-1.1.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/wincertstore-0.2-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/wrapt-1.12.1-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/zipp-3.4.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/absl-py-0.11.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/cffi-1.14.4-py38hcd4344a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/cycler-0.10.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/cytoolz-0.11.0-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/dask-core-2021.1.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-pasta-0.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib-metadata-2.0.0-py_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/jedi-0.18.0-py38haa95532_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/mkl-service-2.3.0-py38h196d8e1_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/packaging-20.8-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pillow-8.1.0-py38h4fa10fc_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-modules-0.2.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyqt-5.9.2-py38ha925a31_4.conda
-https://repo.anaconda.com/pkgs/main/win-64/pysocks-1.7.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/python-dateutil-2.8.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/rsa-4.7-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/setuptools-52.0.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/terminado-0.9.2-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/traitlets-5.0.5-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/typing-extensions-3.7.4.3-hd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/yarl-1.5.1-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/aiohttp-3.7.3-py38h2bbff1b_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/argon2-cffi-20.1.0-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/bleach-3.2.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/brotlipy-0.7.0-py38h2bbff1b_1003.conda
-https://repo.anaconda.com/pkgs/main/win-64/cryptography-2.9.2-py38h7a1dbc1_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/grpcio-1.31.0-py38he7da953_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-2.0.0-1.conda
-https://repo.anaconda.com/pkgs/main/noarch/jinja2-2.11.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/joblib-1.0.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/jupyter_core-4.7.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/markdown-3.3.3-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/networkx-2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/numpy-base-1.19.2-py38ha3acd2a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pip-20.3.3-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/protobuf-3.13.0.1-py38ha925a31_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/pygments-2.7.4-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-plugin-wit-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-1.24.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jsonschema-3.2.0-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyter_client-6.1.7-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_pygments-0.1.2-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/prompt-toolkit-3.0.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyjwt-2.0.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyopenssl-20.0.1-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/ipython-7.19.0-py38hd4e2768_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbformat-5.1.2-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/oauthlib-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/urllib3-1.26.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/ipykernel-5.3.4-py38h5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbclient-0.5.1-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-2.25.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/nbconvert-6.0.7-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-oauthlib-1.3.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-oauthlib-0.4.2-pyhd3eb1b0_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/notebook-6.2.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_server-1.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab-2.2.6-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/imageio-2.9.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/opt_einsum-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-2.3.0-pyh4dce500_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorflow-estimator-2.3.0-pyheb71bc4_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/h5py-2.10.0-py38h5e291fa_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/keras-applications-1.0.8-py_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/imagecodecs-2021.1.11-py38h5da4933_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/tifffile-2021.1.14-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/matplotlib-3.3.2-haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/matplotlib-base-3.3.2-py38hba9282a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mkl_fft-1.2.0-py38h45dec08_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mkl_random-1.1.1-py38h47e9c7a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/numpy-1.19.2-py38hadc3359_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pandas-1.2.1-py38hf11a4ad_0.conda
-https://conda.anaconda.org/pytorch/win-64/pytorch-1.7.1-py3.8_cuda110_cudnn8_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/pywavelets-1.1.1-py38he774522_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/scipy-1.5.2-py38h14eb087_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/keras-preprocessing-1.1.0-py_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/scikit-image-0.17.2-py38h1e1f486_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/scikit-learn-0.23.2-py38h47e9c7a_0.conda
-https://conda.anaconda.org/pytorch/win-64/torchvision-0.8.2-py38_cu110.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/tensorflow-base-2.3.0-eigen_py38h75a453f_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/tensorflow-2.3.0-mkl_py38h8c0d9a2_0.conda
diff --git a/environments/archives/fidle_environment_windows10_gpu_cuda101.txt b/environments/archives/fidle_environment_windows10_gpu_cuda101.txt
deleted file mode 100644
index 3ab287a..0000000
--- a/environments/archives/fidle_environment_windows10_gpu_cuda101.txt
+++ /dev/null
@@ -1,194 +0,0 @@
-# This file may be used to create an environment using:
-# $ conda create --name <env> --file <this file>
-# platform: win-64
-@EXPLICIT
-https://repo.anaconda.com/pkgs/main/win-64/_tflow_select-2.3.0-gpu.conda
-https://repo.anaconda.com/pkgs/main/win-64/blas-1.0-mkl.conda
-https://repo.anaconda.com/pkgs/main/win-64/ca-certificates-2021.1.19-haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/icc_rt-2019.0.0-h0cc432a_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/intel-openmp-2020.2-254.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/msys2-conda-epoch-20160418-1.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/pandoc-2.11-h9490d1a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/vs2015_runtime-14.27.29016-h5e58377_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/winpty-0.4.3-4.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gmp-6.1.0-2.tar.bz2
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-libwinpthread-git-5.0.0.4634.697f757-2.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/mkl-2020.2-256.conda
-https://repo.anaconda.com/pkgs/main/win-64/vc-14.2-h21ff451_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/brotli-1.0.9-ha925a31_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/bzip2-1.0.8-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/charls-2.1.0-h33f27b4_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/cudatoolkit-10.1.243-h74a9793_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/giflib-5.2.1-h62dcd97_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/icu-58.2-ha925a31_3.conda
-https://repo.anaconda.com/pkgs/main/win-64/jpeg-9b-hb83a4c4_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/lerc-2.2.1-hd77b12b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libaec-1.0.4-h33f27b4_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/libdeflate-1.7-h2bbff1b_5.conda
-https://repo.anaconda.com/pkgs/main/win-64/libsodium-1.0.18-h62dcd97_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libuv-1.40.0-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libzopfli-1.0.3-ha925a31_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/lz4-c-1.9.3-h2bbff1b_0.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gcc-libs-core-5.3.0-7.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/openssl-1.1.1i-h2bbff1b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/snappy-1.1.8-h33f27b4_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/tk-8.6.10-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/xz-5.2.5-h62dcd97_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/yaml-0.2.5-he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/zfp-0.5.5-hd77b12b_4.conda
-https://repo.anaconda.com/pkgs/main/win-64/zlib-1.2.11-h62dcd97_4.conda
-https://repo.anaconda.com/pkgs/main/win-64/cudnn-7.6.5-cuda10.1_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/hdf5-1.10.4-h7ebc959_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libpng-1.6.37-h2a8f88b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libprotobuf-3.14.0-h23ce68f_0.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gcc-libgfortran-5.3.0-6.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/sqlite-3.33.0-h2a8f88b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/zeromq-4.3.3-ha925a31_3.conda
-https://repo.anaconda.com/pkgs/main/win-64/zstd-1.4.5-h04227a9_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/blosc-1.20.1-h7bd577a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/freetype-2.10.4-hd328e21_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/libtiff-4.1.0-h56a325e_1.conda
-https://repo.anaconda.com/pkgs/msys2/win-64/m2w64-gcc-libs-5.3.0-7.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/python-3.8.5-h5fd99cc_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/qt-5.9.7-vc14h73c81de_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/async-timeout-3.0.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/async_generator-1.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/attrs-20.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/backcall-0.2.0-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/blinker-1.4-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/cachetools-4.2.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/certifi-2020.12.5-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/chardet-3.0.4-py38haa95532_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/click-7.1.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/cloudpickle-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/colorama-0.4.4-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/decorator-4.4.2-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/defusedxml-0.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/entrypoints-0.3-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/gast-0.4.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/idna-2.10-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/ipython_genutils-0.2.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/json5-0.9.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/kiwisolver-1.3.1-py38hd77b12b_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/lcms2-2.11-hc51a39a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/markupsafe-1.1.1-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mistune-0.8.4-py38he774522_1000.conda
-https://repo.anaconda.com/pkgs/main/win-64/multidict-4.7.6-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nest-asyncio-1.4.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/ninja-1.10.2-py38h6d14046_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/olefile-0.46-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/openjpeg-2.3.0-h5ec785f_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pandocfilters-1.4.3-py38haa95532_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/parso-0.8.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pickleshare-0.7.5-pyhd3eb1b0_1003.conda
-https://repo.anaconda.com/pkgs/main/noarch/prometheus_client-0.9.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-0.4.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pycparser-2.20-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyparsing-2.4.7-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/pyreadline-2.1-py38_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyrsistent-0.17.3-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pytz-2021.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pywin32-227-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pywinpty-0.5.7-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyyaml-5.4.1-py38h2bbff1b_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyzmq-20.0.0-py38hd77b12b_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/send2trash-1.5.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/sip-4.19.13-py38ha925a31_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/six-1.15.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/termcolor-1.1.0-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/testpath-0.4.4-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/threadpoolctl-2.1.0-pyh5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/toolz-0.11.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/tornado-6.1-py38h2bbff1b_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/typing_extensions-3.7.4.3-pyh06a4308_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/wcwidth-0.2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/webencodings-0.5.1-py38_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/werkzeug-1.0.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/wheel-0.36.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/win_inet_pton-1.1.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/wincertstore-0.2-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/wrapt-1.12.1-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/zipp-3.4.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/absl-py-0.11.0-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/astunparse-1.6.3-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/cffi-1.14.4-py38hcd4344a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/cycler-0.10.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/cytoolz-0.11.0-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/dask-core-2021.1.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-pasta-0.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib-metadata-2.0.0-py_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/jedi-0.17.0-py38_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mkl-service-2.3.0-py38h196d8e1_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/packaging-20.9-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pillow-8.1.0-py38h4fa10fc_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyasn1-modules-0.2.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyqt-5.9.2-py38ha925a31_4.conda
-https://repo.anaconda.com/pkgs/main/win-64/pysocks-1.7.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/python-dateutil-2.8.1-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/rsa-4.7-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/setuptools-52.0.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/terminado-0.9.2-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/traitlets-5.0.5-pyhd3eb1b0_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/noarch/typing-extensions-3.7.4.3-hd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/yarl-1.5.1-py38he774522_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/aiohttp-3.7.3-py38h2bbff1b_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/argon2-cffi-20.1.0-py38he774522_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/bleach-3.3.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/brotlipy-0.7.0-py38h2bbff1b_1003.conda
-https://repo.anaconda.com/pkgs/main/win-64/cryptography-2.9.2-py38h7a1dbc1_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/grpcio-1.31.0-py38he7da953_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/importlib_metadata-2.0.0-1.conda
-https://repo.anaconda.com/pkgs/main/noarch/jinja2-2.11.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/joblib-1.0.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/jupyter_core-4.7.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/markdown-3.3.3-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/networkx-2.5-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/numpy-base-1.19.2-py38ha3acd2a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pip-20.3.3-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/protobuf-3.14.0-py38hd77b12b_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/pygments-2.7.4-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-plugin-wit-1.6.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-1.24.0-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jsonschema-3.2.0-py_2.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyter_client-6.1.7-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_pygments-0.1.2-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/prompt-toolkit-3.0.8-py_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pyjwt-2.0.1-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/pyopenssl-20.0.1-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/ipython-7.20.0-py38hd4e2768_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbformat-5.1.2-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/oauthlib-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/urllib3-1.26.3-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/ipykernel-5.3.4-py38h5ca1d4c_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/nbclient-0.5.1-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-2.25.1-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/nbconvert-6.0.7-py38_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/requests-oauthlib-1.3.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/google-auth-oauthlib-0.4.2-pyhd3eb1b0_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/notebook-6.2.0-py38haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab_server-1.2.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/jupyterlab-2.2.6-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/imageio-2.9.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/opt_einsum-3.1.0-py_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorboard-2.3.0-pyh4dce500_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/tensorflow-estimator-2.3.0-pyheb71bc4_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/h5py-2.10.0-py38h5e291fa_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/keras-applications-1.0.8-py_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/imagecodecs-2021.1.11-py38h5da4933_1.conda
-https://repo.anaconda.com/pkgs/main/noarch/tifffile-2021.1.14-pyhd3eb1b0_1.conda
-https://repo.anaconda.com/pkgs/main/win-64/matplotlib-3.3.2-haa95532_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/matplotlib-base-3.3.2-py38hba9282a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mkl_fft-1.2.0-py38h45dec08_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/mkl_random-1.1.1-py38h47e9c7a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/numpy-1.19.2-py38hadc3359_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/pandas-1.2.1-py38hf11a4ad_0.conda
-https://conda.anaconda.org/pytorch/win-64/pytorch-1.7.1-py3.8_cuda101_cudnn7_0.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/pywavelets-1.1.1-py38he774522_2.conda
-https://repo.anaconda.com/pkgs/main/win-64/scipy-1.6.0-py38h14eb087_0.conda
-https://repo.anaconda.com/pkgs/main/noarch/keras-preprocessing-1.1.2-pyhd3eb1b0_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/scikit-image-0.17.2-py38h1e1f486_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/scikit-learn-0.23.2-py38h47e9c7a_0.conda
-https://conda.anaconda.org/pytorch/win-64/torchvision-0.8.2-py38_cu101.tar.bz2
-https://repo.anaconda.com/pkgs/main/win-64/tensorflow-base-2.3.0-gpu_py38h7339f5a_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/tensorflow-2.3.0-mkl_py38h1fcfbd6_0.conda
-https://repo.anaconda.com/pkgs/main/win-64/tensorflow-gpu-2.3.0-he13fc11_0.conda
diff --git a/environments/fidle-cpu.txt b/environments/fidle-cpu.txt
new file mode 100644
index 0000000..6c7063d
--- /dev/null
+++ b/environments/fidle-cpu.txt
@@ -0,0 +1,24 @@
+# ----------------------------------------------------
+#    ______ _     _ _       __      __             
+#   |  ____(_)   | | |      \ \    / /             
+#   | |__   _  __| | | ___   \ \  / /__ _ ____   __
+#   |  __| | |/ _` | |/ _ \   \ \/ / _ \ '_ \ \ / /
+#   | |    | | (_| | |  __/    \  /  __/ | | \ V / 
+#   |_|    |_|\__,_|_|\___|     \/ \___|_| |_|\_/  
+#                               Fidle pip virtual env
+# ----------------------------------------------------
+#
+# To install your Fidle env, see https://fidle.cnrs.fr/installation
+
+python>=3.8
+tensorflow>=2.7,<=2.9
+scikit-image
+scikit-learn
+matplotlib
+plotly
+barviz
+pandas
+pandoc
+pyyaml
+jupyterlab
+fidle
diff --git a/environments/fidle-cpu.yml b/environments/fidle-cpu.yml
deleted file mode 100644
index 0e1f9c5..0000000
--- a/environments/fidle-cpu.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: fidle
-channels:
-  - default
-dependencies:
-  - numpy=1.19
-  - tensorflow>=2.4
-  - python>=3.8
-  - keras
-  - scikit-learn
-  - scikit-image
-  - matplotlib
-  - plotly
-  - pandas
-  - pandoc
-  - jupyterlab
diff --git a/environments/fidle-gpu.txt b/environments/fidle-gpu.txt
new file mode 100644
index 0000000..045af11
--- /dev/null
+++ b/environments/fidle-gpu.txt
@@ -0,0 +1,24 @@
+# ----------------------------------------------------
+#    ______ _     _ _       __      __             
+#   |  ____(_)   | | |      \ \    / /             
+#   | |__   _  __| | | ___   \ \  / /__ _ ____   __
+#   |  __| | |/ _` | |/ _ \   \ \/ / _ \ '_ \ \ / /
+#   | |    | | (_| | |  __/    \  /  __/ | | \ V / 
+#   |_|    |_|\__,_|_|\___|     \/ \___|_| |_|\_/  
+#                               Fidle pip virtual env
+# ----------------------------------------------------
+#
+# To install your Fidle env, see https://fidle.cnrs.fr/installation
+
+python>=3.8
+tensorflow-gpu>=2.7,<=2.9
+scikit-image
+scikit-learn
+matplotlib
+plotly
+barviz
+pandas
+pandoc
+pyyaml
+jupyterlab
+fidle
diff --git a/environments/fidle-gpu.yml b/environments/fidle-gpu.yml
deleted file mode 100644
index cf89ac6..0000000
--- a/environments/fidle-gpu.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-name: fidle
-channels:
-  - default
-dependencies:
-  - numpy=1.19
-  - tensorflow-gpu>=2.4
-  - python>=3.8
-  - keras
-  - scikit-learn
-  - scikit-image
-  - matplotlib
-  - plotly
-  - pandas
-  - pandoc
-  - jupyterlab
diff --git a/fidle/ci/default.yml b/fidle/ci/default.yml
index d124c1b..e52b040 100644
--- a/fidle/ci/default.yml
+++ b/fidle/ci/default.yml
@@ -1,6 +1,6 @@
 campain:
   version: '1.0'
-  description: Automatically generated ci profile (07/10/22 16:36:10)
+  description: Automatically generated ci profile (10/10/22 13:07:38)
   directory: ./campains/default
   existing_notebook: 'remove    # remove|skip'
   report_template: 'fidle     # fidle|default'
-- 
GitLab