From fcfae76ddc053288434ae93d7f3ef3808545d2ef Mon Sep 17 00:00:00 2001
From: PierreGtch <25532709+PierreGtch@users.noreply.github.com>
Date: Thu, 1 Feb 2024 09:44:27 +0100
Subject: [PATCH] Update Braindecode dependency to 0.8 (#542)

* Update braindecode to 0.8

* Simplify plot_braindecode.py

* Update whats_new.rst

* Update load_model.py

* Remove unused code in examples

* Update braindecode pipelines
---
 docs/source/whats_new.rst                     |   1 +
 examples/load_model.py                        |  17 +-
 .../braindecode_EEGInception.py               |  14 +-
 .../braindecode_EEGNetv4.py                   |  14 +-
 .../braindecode_ShallowFBCSPNet.py            |  17 +-
 examples/plot_braindecode.py                  |  19 +-
 poetry.lock                                   | 206 +++++-------------
 pyproject.toml                                |   2 +-
 8 files changed, 68 insertions(+), 222 deletions(-)

diff --git a/docs/source/whats_new.rst b/docs/source/whats_new.rst
index 6a322032b..053384bef 100644
--- a/docs/source/whats_new.rst
+++ b/docs/source/whats_new.rst
@@ -21,6 +21,7 @@ Enhancements
 - Adding cache option to the evaluation (:gh:`517` by `Bruno Aristimunha`_)
 - Option to interpolate channel in paradigms' `match_all` method (:gh:`480` by `Gregoire Cattan`_)
 - Adding leave k-Subjects out evaluations (:gh:`470` by `Bruno Aristimunha`_)
+- Update Braindecode dependency to 0.8 (:gh:`542` by `Pierre Guetschel`_)
 
 Bugs
 ~~~~
diff --git a/examples/load_model.py b/examples/load_model.py
index a35bb2111..4d96ae51d 100644
--- a/examples/load_model.py
+++ b/examples/load_model.py
@@ -16,13 +16,12 @@
 from braindecode import EEGClassifier
 from braindecode.models import EEGInception
 from scikeras.wrappers import KerasClassifier
-from sklearn.pipeline import Pipeline
+from sklearn.pipeline import Pipeline, make_pipeline
 from skorch.callbacks import EarlyStopping, EpochScoring
 from skorch.dataset import ValidSplit
 
 from moabb import set_log_level
 from moabb.pipelines.features import StandardScaler_Epoch
-from moabb.pipelines.utils_pytorch import BraindecodeDatasetLoader, InputShapeSetterEEG
 from moabb.utils import setup_seed
 
 
@@ -70,9 +69,6 @@
 ###############################################################################
 # Loading the PyTorch model
 
-# Set EEG Inception model
-model = EEGInception(in_channels=22, n_classes=2)
-
 # Hyperparameter
 LEARNING_RATE = 0.0001
 WEIGHT_DECAY = 0
@@ -84,8 +80,7 @@
 
 # Define a Skorch classifier
 clf = EEGClassifier(
-    module=model,
-    criterion=torch.nn.CrossEntropyLoss,
+    module=EEGInception,
     optimizer=torch.optim.Adam,
     optimizer__lr=LEARNING_RATE,
     batch_size=BATCH_SIZE,
@@ -99,9 +94,6 @@
         EpochScoring(
             scoring="accuracy", on_train=False, name="valid_acc", lower_is_better=False
         ),
-        InputShapeSetterEEG(
-            params_list=["in_channels", "input_window_samples", "n_classes"],
-        ),
     ],
     verbose=VERBOSE,  # Not printing the results for each epoch
 )
@@ -114,8 +106,5 @@
 
 clf.load_params(f_params=f_params, f_optimizer=f_optimizer, f_history=f_history)
 
-# Create the dataset
-create_dataset = BraindecodeDatasetLoader(drop_last_window=False)
-
 # Create the pipelines
-pipes_pytorch = Pipeline([("Braindecode_dataset", create_dataset), ("EEGInception", clf)])
+pipes_pytorch = make_pipeline(clf)
diff --git a/examples/pipelines_braindecode/braindecode_EEGInception.py b/examples/pipelines_braindecode/braindecode_EEGInception.py
index b18e8033f..0326e4bab 100644
--- a/examples/pipelines_braindecode/braindecode_EEGInception.py
+++ b/examples/pipelines_braindecode/braindecode_EEGInception.py
@@ -6,7 +6,6 @@
 from skorch.dataset import ValidSplit
 
 from moabb.pipelines.features import Resampler_Epoch
-from moabb.pipelines.utils_pytorch import BraindecodeDatasetLoader, InputShapeSetterEEG
 
 
 # Set up GPU if it is there
@@ -22,16 +21,9 @@
 EPOCH = 10
 PATIENCE = 3
 
-# Create the dataset
-create_dataset = BraindecodeDatasetLoader()
-
-# Set random Model
-model = EEGInception(in_channels=1, n_classes=2, input_window_samples=100)
-
 # Define a Skorch classifier
 clf = EEGClassifier(
-    module=model,
-    criterion=torch.nn.CrossEntropyLoss,
+    module=EEGInception,
     optimizer=torch.optim.Adam,
     optimizer__lr=LEARNING_RATE,
     batch_size=BATCH_SIZE,
@@ -46,9 +38,6 @@
         EpochScoring(
             scoring="accuracy", on_train=False, name="valid_acc", lower_is_better=False
         ),
-        InputShapeSetterEEG(
-            params_list=["in_channels", "input_window_samples", "n_classes"],
-        ),
     ],
     verbose=VERBOSE,  # Not printing the results for each epoch
 )
@@ -57,7 +46,6 @@
 pipes = Pipeline(
     [
         ("resample", Resampler_Epoch(128)),
-        ("braindecode_dataset", create_dataset),
         ("EEGInception", clf),
     ]
 )
diff --git a/examples/pipelines_braindecode/braindecode_EEGNetv4.py b/examples/pipelines_braindecode/braindecode_EEGNetv4.py
index 3aba86787..0ed3ed312 100644
--- a/examples/pipelines_braindecode/braindecode_EEGNetv4.py
+++ b/examples/pipelines_braindecode/braindecode_EEGNetv4.py
@@ -6,7 +6,6 @@
 from skorch.dataset import ValidSplit
 
 from moabb.pipelines.features import Resampler_Epoch
-from moabb.pipelines.utils_pytorch import BraindecodeDatasetLoader, InputShapeSetterEEG
 
 
 # Set up GPU if it is there
@@ -22,16 +21,9 @@
 EPOCH = 10
 PATIENCE = 3
 
-# Create the dataset
-create_dataset = BraindecodeDatasetLoader()
-
-# Set random Model
-model = EEGNetv4(in_chans=1, n_classes=2, input_window_samples=100)
-
 # Define a Skorch classifier
 clf = EEGClassifier(
-    module=model,
-    criterion=torch.nn.CrossEntropyLoss,
+    module=EEGNetv4,
     optimizer=torch.optim.Adam,
     optimizer__lr=LEARNING_RATE,
     batch_size=BATCH_SIZE,
@@ -46,9 +38,6 @@
         EpochScoring(
             scoring="accuracy", on_train=False, name="valid_acc", lower_is_better=False
         ),
-        InputShapeSetterEEG(
-            params_list=["in_chans", "input_window_samples", "n_classes"],
-        ),
     ],
     verbose=VERBOSE,  # Not printing the results for each epoch
 )
@@ -57,7 +46,6 @@
 pipes = Pipeline(
     [
         ("resample", Resampler_Epoch(128)),
-        ("braindecode_dataset", create_dataset),
         ("EEGNetv4", clf),
     ]
 )
diff --git a/examples/pipelines_braindecode/braindecode_ShallowFBCSPNet.py b/examples/pipelines_braindecode/braindecode_ShallowFBCSPNet.py
index 79c8f2bf8..ae2e8519e 100644
--- a/examples/pipelines_braindecode/braindecode_ShallowFBCSPNet.py
+++ b/examples/pipelines_braindecode/braindecode_ShallowFBCSPNet.py
@@ -6,7 +6,6 @@
 from skorch.dataset import ValidSplit
 
 from moabb.pipelines.features import Resampler_Epoch
-from moabb.pipelines.utils_pytorch import BraindecodeDatasetLoader, InputShapeSetterEEG
 
 
 # Set up GPU if it is there
@@ -22,18 +21,10 @@
 EPOCH = 5
 PATIENCE = 3
 
-# Create the dataset
-create_dataset = BraindecodeDatasetLoader()
-
-# Set random Model
-model = ShallowFBCSPNet(
-    in_chans=1, n_classes=2, input_window_samples=100, final_conv_length="auto"
-)
-
 # Define a Skorch classifier
 clf = EEGClassifier(
-    module=model,
-    criterion=torch.nn.CrossEntropyLoss,
+    module=ShallowFBCSPNet,
+    module__final_conv_length="auto",
     optimizer=torch.optim.Adam,
     optimizer__lr=LEARNING_RATE,
     batch_size=BATCH_SIZE,
@@ -48,9 +39,6 @@
         EpochScoring(
             scoring="accuracy", on_train=False, name="valid_acc", lower_is_better=False
         ),
-        InputShapeSetterEEG(
-            params_list=["in_chans", "input_window_samples", "n_classes"],
-        ),
     ],
     verbose=VERBOSE,  # Not printing the results for each epoch
 )
@@ -59,7 +47,6 @@
 pipes = Pipeline(
     [
         ("resample", Resampler_Epoch(250)),
-        ("braindecode_dataset", create_dataset),
         ("ShallowFBCSPNet", clf),
     ]
 )
diff --git a/examples/plot_braindecode.py b/examples/plot_braindecode.py
index 06ff06939..e845dbfcb 100644
--- a/examples/plot_braindecode.py
+++ b/examples/plot_braindecode.py
@@ -16,14 +16,13 @@
 import torch
 from braindecode import EEGClassifier
 from braindecode.models import EEGNetv4
-from sklearn.pipeline import Pipeline
+from sklearn.pipeline import make_pipeline
 from skorch.callbacks import EarlyStopping, EpochScoring
 from skorch.dataset import ValidSplit
 
 from moabb.datasets import BNCI2014_001
 from moabb.evaluations import CrossSessionEvaluation
 from moabb.paradigms import MotorImagery
-from moabb.pipelines.utils_pytorch import BraindecodeDatasetLoader, InputShapeSetterEEG
 from moabb.utils import setup_seed
 
 
@@ -81,8 +80,6 @@
 )
 subjects = [1]
 X, _, _ = paradigm.get_data(dataset=dataset, subjects=subjects)
-# Define Transformer of Dataset compatible with Brain Decode
-create_dataset = BraindecodeDatasetLoader()
 
 ##############################################################################
 # Create Pipelines
@@ -94,16 +91,9 @@
 # callbacks InputShapeSetterEEG, where we have to specify the correct name of the parameter.
 # Here, we will use the EEGNet v4 model [1]_ .
 
-model = EEGNetv4(in_chans=1, n_classes=1, input_window_samples=100)
-
-# Send model to GPU
-if cuda:
-    model.cuda()
-
 # Define a Skorch classifier
 clf = EEGClassifier(
-    module=model,
-    criterion=torch.nn.CrossEntropyLoss,
+    module=EEGNetv4,
     optimizer=torch.optim.Adam,
     optimizer__lr=LEARNING_RATE,
     batch_size=BATCH_SIZE,
@@ -118,16 +108,13 @@
         EpochScoring(
             scoring="accuracy", on_train=False, name="valid_acc", lower_is_better=False
         ),
-        InputShapeSetterEEG(
-            params_list=["in_chans", "input_window_samples", "n_classes"],
-        ),
     ],
     verbose=1,  # Not printing the results for each epoch
 )
 
 # Create the pipelines
 pipes = {}
-pipes["EEGNetV4"] = Pipeline([("Braindecode_dataset", create_dataset), ("Net", clf)])
+pipes["EEGNetV4"] = make_pipeline(clf)
 
 ##############################################################################
 # Evaluation
diff --git a/poetry.lock b/poetry.lock
index bff725591..c8aa17845 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,10 +1,9 @@
-# This file is automatically @generated by Poetry and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
 
 [[package]]
 name = "absl-py"
 version = "2.0.0"
 description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -16,7 +15,6 @@ files = [
 name = "accessible-pygments"
 version = "0.0.4"
 description = "A collection of accessible pygments styles"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -31,7 +29,6 @@ pygments = ">=1.5"
 name = "alabaster"
 version = "0.7.13"
 description = "A configurable sidebar-enabled Sphinx theme"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -43,7 +40,6 @@ files = [
 name = "arrow"
 version = "1.3.0"
 description = "Better dates & times for Python"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -57,13 +53,12 @@ types-python-dateutil = ">=2.8.10"
 
 [package.extras]
 doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"]
-test = ["dateparser (>=1.0.0,<2.0.0)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (>=3.0.0,<4.0.0)"]
+test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"]
 
 [[package]]
 name = "astunparse"
 version = "1.6.3"
 description = "An AST unparser for Python"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -79,7 +74,6 @@ wheel = ">=0.23.0,<1.0"
 name = "babel"
 version = "2.13.0"
 description = "Internationalization utilities"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -97,7 +91,6 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
 name = "beautifulsoup4"
 version = "4.12.2"
 description = "Screen-scraping library"
-category = "dev"
 optional = false
 python-versions = ">=3.6.0"
 files = [
@@ -114,30 +107,38 @@ lxml = ["lxml"]
 
 [[package]]
 name = "braindecode"
-version = "0.7"
-description = "A deep learning toolbox to decode raw time-domain EEG."
-category = "main"
+version = "0.8.1"
+description = "Deep learning software to decode EEG, ECG or MEG signals"
 optional = true
-python-versions = "*"
+python-versions = ">=3.8"
 files = [
-    {file = "Braindecode-0.7-py3-none-any.whl", hash = "sha256:e53555cbea75e35b6dc089ef3d7f769cab6e4fa129b8cec6ad54bff19492c19a"},
-    {file = "Braindecode-0.7.tar.gz", hash = "sha256:e2bca3d096b70b041d7b30ca2dfeaffae79ea722a4578cee04c9864ec07effce"},
+    {file = "braindecode-0.8.1-py3-none-any.whl", hash = "sha256:6c2a571095a6ca366ade93a1a12bafce3225ce7d395eca6f7e2eb66edb5dd7da"},
+    {file = "braindecode-0.8.1.tar.gz", hash = "sha256:e80515c3d20a80f16800770936d1eb0012de15830a8175dce376256bdaf928e7"},
 ]
 
 [package.dependencies]
+docstring-inheritance = "*"
+einops = "*"
 h5py = "*"
+joblib = "*"
 matplotlib = "*"
 mne = "*"
 numpy = "*"
 pandas = "*"
 scipy = "*"
 skorch = "*"
+torch = "*"
+torchinfo = "*"
+
+[package.extras]
+docs = ["ipython", "lightning", "memory-profiler", "numpydoc", "pillow", "pre-commit", "pydata-sphinx-theme", "seaborn", "sphinx-design", "sphinx-gallery", "sphinx-rtd-theme"]
+moabb = ["moabb (>=1.0.0)"]
+tests = ["codecov", "pytest", "pytest-cases", "pytest-cov"]
 
 [[package]]
 name = "cachetools"
 version = "5.3.1"
 description = "Extensible memoizing collections and decorators"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -149,7 +150,6 @@ files = [
 name = "certifi"
 version = "2023.7.22"
 description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -161,7 +161,6 @@ files = [
 name = "cfgv"
 version = "3.4.0"
 description = "Validate configuration and produce human readable error messages."
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -173,7 +172,6 @@ files = [
 name = "charset-normalizer"
 version = "3.3.1"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-category = "main"
 optional = false
 python-versions = ">=3.7.0"
 files = [
@@ -273,7 +271,6 @@ files = [
 name = "click"
 version = "8.1.7"
 description = "Composable command line interface toolkit"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -288,7 +285,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
 name = "codecarbon"
 version = "2.3.1"
 description = ""
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -315,7 +311,6 @@ viz = ["dash", "dash-bootstrap-components (<1.0.0)", "fire"]
 name = "colorama"
 version = "0.4.6"
 description = "Cross-platform colored terminal text."
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
 files = [
@@ -327,7 +322,6 @@ files = [
 name = "contourpy"
 version = "1.1.1"
 description = "Python library for calculating contours of 2D quadrilateral grids"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -399,7 +393,6 @@ test-no-images = ["pytest", "pytest-cov", "wurlitzer"]
 name = "coverage"
 version = "7.3.2"
 description = "Code coverage measurement for Python"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -464,7 +457,6 @@ toml = ["tomli"]
 name = "cycler"
 version = "0.12.1"
 description = "Composable style cycles"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -480,7 +472,6 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"]
 name = "decorator"
 version = "5.1.1"
 description = "Decorators for Humans"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -492,7 +483,6 @@ files = [
 name = "distlib"
 version = "0.3.7"
 description = "Distribution utilities"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -500,11 +490,24 @@ files = [
     {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"},
 ]
 
+[[package]]
+name = "docstring-inheritance"
+version = "2.1.2"
+description = "Avoid writing and maintaining duplicated docstrings."
+optional = true
+python-versions = "<3.13,>=3.8"
+files = [
+    {file = "docstring-inheritance-2.1.2.tar.gz", hash = "sha256:ac9af95a7b06a305d43720274d0e62523d23f835bf94ce2bb814687e6fe3957b"},
+    {file = "docstring_inheritance-2.1.2-py3-none-any.whl", hash = "sha256:05c8e3ef4c308406e66345b6d583df48ec1803ae90ae39cb7be03a78ac8d88d1"},
+]
+
+[package.extras]
+test = ["covdefaults", "pytest", "pytest-cov"]
+
 [[package]]
 name = "docutils"
 version = "0.18.1"
 description = "Docutils -- Python Documentation Utilities"
-category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
 files = [
@@ -516,7 +519,6 @@ files = [
 name = "edflib-python"
 version = "1.0.8"
 description = "Library to read/write EDF+/BDF+ files written in pure Python by the same author as the original EDFlib."
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -527,11 +529,21 @@ files = [
 [package.dependencies]
 numpy = ">=1.17"
 
+[[package]]
+name = "einops"
+version = "0.7.0"
+description = "A new flavour of deep learning operations"
+optional = true
+python-versions = ">=3.8"
+files = [
+    {file = "einops-0.7.0-py3-none-any.whl", hash = "sha256:0f3096f26b914f465f6ff3c66f5478f9a5e380bb367ffc6493a68143fbbf1fd1"},
+    {file = "einops-0.7.0.tar.gz", hash = "sha256:b2b04ad6081a3b227080c9bf5e3ace7160357ff03043cd66cc5b2319eb7031d1"},
+]
+
 [[package]]
 name = "exceptiongroup"
 version = "1.1.3"
 description = "Backport of PEP 654 (exception groups)"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -546,7 +558,6 @@ test = ["pytest (>=6)"]
 name = "filelock"
 version = "3.12.4"
 description = "A platform independent file lock."
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -563,7 +574,6 @@ typing = ["typing-extensions (>=4.7.1)"]
 name = "flatbuffers"
 version = "23.5.26"
 description = "The FlatBuffers serialization format for Python"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -575,7 +585,6 @@ files = [
 name = "fonttools"
 version = "4.43.1"
 description = "Tools to manipulate font files"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -641,7 +650,6 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
 name = "fuzzywuzzy"
 version = "0.18.0"
 description = "Fuzzy string matching in python"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -656,7 +664,6 @@ speedup = ["python-levenshtein (>=0.12)"]
 name = "gast"
 version = "0.4.0"
 description = "Python AST that abstracts the underlying Python version"
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -668,7 +675,6 @@ files = [
 name = "google-auth"
 version = "2.23.3"
 description = "Google Authentication Library"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -692,7 +698,6 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"]
 name = "google-auth-oauthlib"
 version = "1.0.0"
 description = "Google Authentication Library"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -711,7 +716,6 @@ tool = ["click (>=6.0.0)"]
 name = "google-pasta"
 version = "0.2.0"
 description = "pasta is an AST-based Python refactoring library"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -727,7 +731,6 @@ six = "*"
 name = "grpcio"
 version = "1.59.0"
 description = "HTTP/2-based RPC framework"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -794,7 +797,6 @@ protobuf = ["grpcio-tools (>=1.59.0)"]
 name = "h5py"
 version = "3.8.0"
 description = "Read and write HDF5 files from Python"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -832,7 +834,6 @@ numpy = ">=1.14.5"
 name = "identify"
 version = "2.5.30"
 description = "File identification library for Python"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -847,7 +848,6 @@ license = ["ukkonen"]
 name = "idna"
 version = "3.4"
 description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -859,7 +859,6 @@ files = [
 name = "imagesize"
 version = "1.4.1"
 description = "Getting image size from png/jpeg/jpeg2000/gif file"
-category = "dev"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -871,7 +870,6 @@ files = [
 name = "importlib-metadata"
 version = "6.8.0"
 description = "Read metadata from Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -891,7 +889,6 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs
 name = "importlib-resources"
 version = "6.1.0"
 description = "Read resources from Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -910,7 +907,6 @@ testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)",
 name = "iniconfig"
 version = "2.0.0"
 description = "brain-dead simple config-ini parsing"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -922,7 +918,6 @@ files = [
 name = "jax"
 version = "0.4.13"
 description = "Differentiate, compile, and transform Numpy code."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -953,7 +948,6 @@ tpu = ["jaxlib (==0.4.13)", "libtpu-nightly (==0.1.dev20230622)"]
 name = "jinja2"
 version = "3.1.2"
 description = "A very fast and expressive template engine."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -971,7 +965,6 @@ i18n = ["Babel (>=2.7)"]
 name = "joblib"
 version = "1.3.2"
 description = "Lightweight pipelining with Python functions"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -983,7 +976,6 @@ files = [
 name = "keras"
 version = "2.12.0"
 description = "Deep learning for humans."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -994,7 +986,6 @@ files = [
 name = "kiwisolver"
 version = "1.4.5"
 description = "A fast implementation of the Cassowary constraint solver"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1108,7 +1099,6 @@ files = [
 name = "libclang"
 version = "15.0.6.1"
 description = "Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python, to make the installation process easier."
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -1127,7 +1117,6 @@ files = [
 name = "m2r2"
 version = "0.3.2"
 description = "Markdown and reStructuredText in a single file."
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1143,7 +1132,6 @@ mistune = "0.8.4"
 name = "markdown"
 version = "3.5"
 description = "Python implementation of John Gruber's Markdown."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -1162,7 +1150,6 @@ testing = ["coverage", "pyyaml"]
 name = "markupsafe"
 version = "2.1.3"
 description = "Safely add untrusted strings to HTML/XML markup."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1186,16 +1173,6 @@ files = [
     {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
     {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
     {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
-    {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
     {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
     {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
     {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
@@ -1232,7 +1209,6 @@ files = [
 name = "matplotlib"
 version = "3.7.3"
 description = "Python plotting package"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1302,7 +1278,6 @@ setuptools_scm = ">=7"
 name = "memory-profiler"
 version = "0.61.0"
 description = "A module for monitoring memory usage of a python program"
-category = "main"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -1317,7 +1292,6 @@ psutil = "*"
 name = "mistune"
 version = "0.8.4"
 description = "The fastest markdown parser in pure Python"
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -1329,7 +1303,6 @@ files = [
 name = "ml-dtypes"
 version = "0.2.0"
 description = ""
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1366,7 +1339,6 @@ dev = ["absl-py", "pyink", "pylint (>=2.6.0)", "pytest", "pytest-xdist"]
 name = "mne"
 version = "1.5.1"
 description = "MNE-Python project for MEG and EEG data analysis."
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1393,7 +1365,6 @@ test = ["EDFlib-Python", "black", "check-manifest", "codespell", "eeglabio", "im
 name = "mne-bids"
 version = "0.13"
 description = "MNE-BIDS: Organizing MEG, EEG, and iEEG data according to the BIDS specification and facilitating their analysis with MNE-Python"
-category = "main"
 optional = false
 python-versions = "~=3.8"
 files = [
@@ -1413,7 +1384,6 @@ full = ["EDFlib-Python (>=1.0.6)", "matplotlib (>=3.4.0)", "nibabel (>=3.2.1)",
 name = "nodeenv"
 version = "1.8.0"
 description = "Node.js virtual environment builder"
-category = "dev"
 optional = false
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
 files = [
@@ -1428,7 +1398,6 @@ setuptools = "*"
 name = "numpy"
 version = "1.24.3"
 description = "Fundamental package for array computing in Python"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1466,7 +1435,6 @@ files = [
 name = "numpydoc"
 version = "1.6.0"
 description = "Sphinx extension to support docstrings in Numpy format"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1489,7 +1457,6 @@ test = ["matplotlib", "pytest", "pytest-cov"]
 name = "nvidia-cublas-cu11"
 version = "11.10.3.66"
 description = "CUBLAS native runtime libraries"
-category = "main"
 optional = true
 python-versions = ">=3"
 files = [
@@ -1505,7 +1472,6 @@ wheel = "*"
 name = "nvidia-cuda-nvrtc-cu11"
 version = "11.7.99"
 description = "NVRTC native runtime libraries"
-category = "main"
 optional = true
 python-versions = ">=3"
 files = [
@@ -1522,7 +1488,6 @@ wheel = "*"
 name = "nvidia-cuda-runtime-cu11"
 version = "11.7.99"
 description = "CUDA Runtime native Libraries"
-category = "main"
 optional = true
 python-versions = ">=3"
 files = [
@@ -1538,7 +1503,6 @@ wheel = "*"
 name = "nvidia-cudnn-cu11"
 version = "8.5.0.96"
 description = "cuDNN runtime libraries"
-category = "main"
 optional = true
 python-versions = ">=3"
 files = [
@@ -1554,7 +1518,6 @@ wheel = "*"
 name = "oauthlib"
 version = "3.2.2"
 description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -1571,7 +1534,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
 name = "opt-einsum"
 version = "3.3.0"
 description = "Optimizing numpys einsum function"
-category = "main"
 optional = true
 python-versions = ">=3.5"
 files = [
@@ -1590,7 +1552,6 @@ tests = ["pytest", "pytest-cov", "pytest-pep8"]
 name = "packaging"
 version = "23.2"
 description = "Core utilities for Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1602,7 +1563,6 @@ files = [
 name = "pandas"
 version = "1.5.3"
 description = "Powerful data structures for data analysis, time series, and statistics"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1651,7 +1611,6 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"]
 name = "pillow"
 version = "10.1.0"
 description = "Python Imaging Library (Fork)"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1719,7 +1678,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
 name = "platformdirs"
 version = "3.11.0"
 description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1735,7 +1693,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co
 name = "pluggy"
 version = "1.3.0"
 description = "plugin and hook calling mechanisms for python"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -1751,7 +1708,6 @@ testing = ["pytest", "pytest-benchmark"]
 name = "pooch"
 version = "1.7.0"
 description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\""
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1773,7 +1729,6 @@ xxhash = ["xxhash (>=1.4.3)"]
 name = "pre-commit"
 version = "2.21.0"
 description = "A framework for managing and maintaining multi-language pre-commit hooks."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1792,7 +1747,6 @@ virtualenv = ">=20.10.0"
 name = "prometheus-client"
 version = "0.17.1"
 description = "Python client for the Prometheus monitoring system."
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -1807,7 +1761,6 @@ twisted = ["twisted"]
 name = "protobuf"
 version = "4.24.4"
 description = ""
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -1830,7 +1783,6 @@ files = [
 name = "psutil"
 version = "5.9.6"
 description = "Cross-platform lib for process and system monitoring in Python."
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 files = [
@@ -1859,7 +1811,6 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
 name = "py-cpuinfo"
 version = "9.0.0"
 description = "Get CPU info with pure Python"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -1871,7 +1822,6 @@ files = [
 name = "pyasn1"
 version = "0.5.0"
 description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)"
-category = "main"
 optional = true
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -1883,7 +1833,6 @@ files = [
 name = "pyasn1-modules"
 version = "0.3.0"
 description = "A collection of ASN.1-based protocols modules"
-category = "main"
 optional = true
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -1898,7 +1847,6 @@ pyasn1 = ">=0.4.6,<0.6.0"
 name = "pydata-sphinx-theme"
 version = "0.13.3"
 description = "Bootstrap-based Sphinx theme from the PyData community"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1925,7 +1873,6 @@ test = ["codecov", "pytest", "pytest-cov", "pytest-regressions"]
 name = "pygments"
 version = "2.16.1"
 description = "Pygments is a syntax highlighting package written in Python."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1940,7 +1887,6 @@ plugins = ["importlib-metadata"]
 name = "pynvml"
 version = "11.5.0"
 description = "Python Bindings for the NVIDIA Management Library"
-category = "main"
 optional = true
 python-versions = ">=3.6"
 files = [
@@ -1952,7 +1898,6 @@ files = [
 name = "pyparsing"
 version = "3.1.1"
 description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-category = "main"
 optional = false
 python-versions = ">=3.6.8"
 files = [
@@ -1967,7 +1912,6 @@ diagrams = ["jinja2", "railroad-diagrams"]
 name = "pyriemann"
 version = "0.5"
 description = "Biosignals classification with Riemannian geometry"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -1988,7 +1932,6 @@ tests = ["flake8", "pytest", "seaborn"]
 name = "pytest"
 version = "7.4.2"
 description = "pytest: simple powerful testing with Python"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2011,7 +1954,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no
 name = "python-dateutil"
 version = "2.8.2"
 description = "Extensions to the standard Python datetime module"
-category = "main"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
 files = [
@@ -2026,7 +1968,6 @@ six = ">=1.5"
 name = "pytz"
 version = "2023.3.post1"
 description = "World timezone definitions, modern and historical"
-category = "main"
 optional = false
 python-versions = "*"
 files = [
@@ -2038,7 +1979,6 @@ files = [
 name = "pyyaml"
 version = "6.0.1"
 description = "YAML parser and emitter for Python"
-category = "main"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -2060,6 +2000,7 @@ files = [
     {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
     {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
     {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+    {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
     {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
     {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
     {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
@@ -2098,7 +2039,6 @@ files = [
 name = "requests"
 version = "2.31.0"
 description = "Python HTTP for Humans."
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2120,7 +2060,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
 name = "requests-oauthlib"
 version = "1.3.1"
 description = "OAuthlib authentication support for Requests."
-category = "main"
 optional = true
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 files = [
@@ -2139,7 +2078,6 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"]
 name = "rsa"
 version = "4.9"
 description = "Pure-Python RSA implementation"
-category = "main"
 optional = true
 python-versions = ">=3.6,<4"
 files = [
@@ -2154,7 +2092,6 @@ pyasn1 = ">=0.1.3"
 name = "scikeras"
 version = "0.12.0"
 description = "Scikit-Learn API wrapper for Keras."
-category = "main"
 optional = true
 python-versions = ">=3.8.0,<3.12.0"
 files = [
@@ -2176,7 +2113,6 @@ tensorflow-cpu = ["tensorflow-cpu (>=2.12.0,<2.13.0)"]
 name = "scikit-learn"
 version = "1.3.1"
 description = "A set of python modules for machine learning and data mining"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2224,7 +2160,6 @@ tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (
 name = "scipy"
 version = "1.10.1"
 description = "Fundamental algorithms for scientific computing in Python"
-category = "main"
 optional = false
 python-versions = "<3.12,>=3.8"
 files = [
@@ -2263,7 +2198,6 @@ test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeo
 name = "seaborn"
 version = "0.12.2"
 description = "Statistical data visualization"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2285,7 +2219,6 @@ stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"]
 name = "setuptools"
 version = "68.2.2"
 description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2302,7 +2235,6 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar
 name = "setuptools-scm"
 version = "8.0.4"
 description = "the blessed package to manage your versions by scm tags"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2325,7 +2257,6 @@ test = ["build", "pytest", "rich", "wheel"]
 name = "six"
 version = "1.16.0"
 description = "Python 2 and 3 compatibility utilities"
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 files = [
@@ -2337,7 +2268,6 @@ files = [
 name = "skorch"
 version = "0.15.0"
 description = "scikit-learn compatible neural network library for pytorch"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -2360,7 +2290,6 @@ testing = ["accelerate (>=0.22.0)", "fire", "flaky", "future (>=0.17.1)", "gpyto
 name = "snowballstemmer"
 version = "2.2.0"
 description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms."
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -2372,7 +2301,6 @@ files = [
 name = "soupsieve"
 version = "2.5"
 description = "A modern CSS selector implementation for Beautiful Soup."
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2384,7 +2312,6 @@ files = [
 name = "sphinx"
 version = "5.3.0"
 description = "Python documentation generator"
-category = "dev"
 optional = false
 python-versions = ">=3.6"
 files = [
@@ -2420,7 +2347,6 @@ test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast"]
 name = "sphinx-bootstrap-theme"
 version = "0.8.1"
 description = "Sphinx Bootstrap Theme."
-category = "dev"
 optional = false
 python-versions = "*"
 files = [
@@ -2432,7 +2358,6 @@ files = [
 name = "sphinx-design"
 version = "0.3.0"
 description = "A sphinx extension for designing beautiful, view size responsive web components."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2456,7 +2381,6 @@ theme-sbt = ["sphinx-book-theme (>=0.3.0,<0.4.0)"]
 name = "sphinx-gallery"
 version = "0.11.1"
 description = "A Sphinx extension that builds an HTML version of any Python script and puts it into an examples gallery."
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2471,7 +2395,6 @@ sphinx = ">=3"
 name = "sphinx-rtd-theme"
 version = "1.3.0"
 description = "Read the Docs theme for Sphinx"
-category = "dev"
 optional = false
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 files = [
@@ -2491,7 +2414,6 @@ dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"]
 name = "sphinxcontrib-applehelp"
 version = "1.0.4"
 description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2507,7 +2429,6 @@ test = ["pytest"]
 name = "sphinxcontrib-devhelp"
 version = "1.0.2"
 description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -2523,7 +2444,6 @@ test = ["pytest"]
 name = "sphinxcontrib-htmlhelp"
 version = "2.0.1"
 description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files"
-category = "dev"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2539,7 +2459,6 @@ test = ["html5lib", "pytest"]
 name = "sphinxcontrib-jquery"
 version = "4.1"
 description = "Extension to include jQuery on newer Sphinx releases"
-category = "dev"
 optional = false
 python-versions = ">=2.7"
 files = [
@@ -2554,7 +2473,6 @@ Sphinx = ">=1.8"
 name = "sphinxcontrib-jsmath"
 version = "1.0.1"
 description = "A sphinx extension which renders display math in HTML via JavaScript"
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -2569,7 +2487,6 @@ test = ["flake8", "mypy", "pytest"]
 name = "sphinxcontrib-qthelp"
 version = "1.0.3"
 description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -2585,7 +2502,6 @@ test = ["pytest"]
 name = "sphinxcontrib-serializinghtml"
 version = "1.1.5"
 description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)."
-category = "dev"
 optional = false
 python-versions = ">=3.5"
 files = [
@@ -2601,7 +2517,6 @@ test = ["pytest"]
 name = "tabulate"
 version = "0.9.0"
 description = "Pretty-print tabular data"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2616,7 +2531,6 @@ widechars = ["wcwidth"]
 name = "tdlda"
 version = "0.1.0"
 description = "Time-decoupled linear discriminant analysis."
-category = "dev"
 optional = false
 python-versions = ">=3.6.0"
 files = []
@@ -2632,7 +2546,6 @@ resolved_reference = "d3acc59d34e47a4f36773b3df86f0842089f65cd"
 name = "tensorboard"
 version = "2.12.3"
 description = "TensorBoard lets you watch Tensors Flow"
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -2657,7 +2570,6 @@ wheel = ">=0.26"
 name = "tensorboard-data-server"
 version = "0.7.1"
 description = "Fast data loading for TensorBoard"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2670,7 +2582,6 @@ files = [
 name = "tensorflow"
 version = "2.12.1"
 description = "TensorFlow is an open source machine learning framework for everyone."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -2720,7 +2631,6 @@ wrapt = ">=1.11.0,<1.15"
 name = "tensorflow-estimator"
 version = "2.12.0"
 description = "TensorFlow Estimator."
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2731,7 +2641,6 @@ files = [
 name = "tensorflow-io-gcs-filesystem"
 version = "0.31.0"
 description = "TensorFlow IO"
-category = "main"
 optional = true
 python-versions = ">=3.7, <3.12"
 files = [
@@ -2767,7 +2676,6 @@ tensorflow-rocm = ["tensorflow-rocm (>=2.11.0,<2.12.0)"]
 name = "tensorflow-metal"
 version = "1.1.0"
 description = "TensorFlow acceleration for Mac GPUs."
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2784,7 +2692,6 @@ wheel = ">=0.35,<1.0"
 name = "termcolor"
 version = "2.3.0"
 description = "ANSI color formatting for output in terminal"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2799,7 +2706,6 @@ tests = ["pytest", "pytest-cov"]
 name = "threadpoolctl"
 version = "3.2.0"
 description = "threadpoolctl"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -2811,7 +2717,6 @@ files = [
 name = "tomli"
 version = "2.0.1"
 description = "A lil' TOML parser"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2823,7 +2728,6 @@ files = [
 name = "torch"
 version = "1.13.1"
 description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
-category = "main"
 optional = true
 python-versions = ">=3.7.0"
 files = [
@@ -2860,11 +2764,21 @@ typing-extensions = "*"
 [package.extras]
 opt-einsum = ["opt-einsum (>=3.3)"]
 
+[[package]]
+name = "torchinfo"
+version = "1.8.0"
+description = "Model summary in PyTorch, based off of the original torchsummary."
+optional = true
+python-versions = ">=3.7"
+files = [
+    {file = "torchinfo-1.8.0-py3-none-any.whl", hash = "sha256:2e911c2918603f945c26ff21a3a838d12709223dc4ccf243407bce8b6e897b46"},
+    {file = "torchinfo-1.8.0.tar.gz", hash = "sha256:72e94b0e9a3e64dc583a8e5b7940b8938a1ac0f033f795457f27e6f4e7afa2e9"},
+]
+
 [[package]]
 name = "tqdm"
 version = "4.66.1"
 description = "Fast, Extensible Progress Meter"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2885,7 +2799,6 @@ telegram = ["requests"]
 name = "types-python-dateutil"
 version = "2.8.19.14"
 description = "Typing stubs for python-dateutil"
-category = "main"
 optional = true
 python-versions = "*"
 files = [
@@ -2897,7 +2810,6 @@ files = [
 name = "typing-extensions"
 version = "4.5.0"
 description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "main"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2909,7 +2821,6 @@ files = [
 name = "urllib3"
 version = "1.26.18"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-category = "main"
 optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
 files = [
@@ -2926,7 +2837,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 name = "virtualenv"
 version = "20.24.5"
 description = "Virtual Python Environment builder"
-category = "dev"
 optional = false
 python-versions = ">=3.7"
 files = [
@@ -2947,7 +2857,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess
 name = "werkzeug"
 version = "3.0.0"
 description = "The comprehensive WSGI web application library."
-category = "main"
 optional = true
 python-versions = ">=3.8"
 files = [
@@ -2965,7 +2874,6 @@ watchdog = ["watchdog (>=2.3)"]
 name = "wheel"
 version = "0.41.2"
 description = "A built-package format for Python"
-category = "main"
 optional = true
 python-versions = ">=3.7"
 files = [
@@ -2980,7 +2888,6 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"]
 name = "wrapt"
 version = "1.14.1"
 description = "Module for decorators, wrappers and monkey patching."
-category = "main"
 optional = true
 python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
 files = [
@@ -3054,7 +2961,6 @@ files = [
 name = "zipp"
 version = "3.17.0"
 description = "Backport of pathlib-compatible object wrapper for zip files"
-category = "main"
 optional = false
 python-versions = ">=3.8"
 files = [
@@ -3068,9 +2974,9 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p
 
 [extras]
 carbonemission = ["codecarbon"]
-deeplearning = ["tensorflow", "keras", "scikeras", "braindecode", "torch", "libclang"]
+deeplearning = ["braindecode", "keras", "libclang", "scikeras", "tensorflow", "torch"]
 
 [metadata]
 lock-version = "2.0"
 python-versions = ">=3.8, <3.12"
-content-hash = "70d78f4bc698036ebce93e1a325b11880669debf42af18bf14b8c0d04b90e207"
+content-hash = "505b4abac3130faceda25ccea89d3c39211a52c219fc6e6fb8fce6ced4c0315e"
diff --git a/pyproject.toml b/pyproject.toml
index c1718df5c..fb9a220b3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -40,7 +40,7 @@ codecarbon = { version = "^2.1.4", optional = true }
 tensorflow = { version = ">=2.10,<2.13", optional = true }
 keras = { version = ">=1.11.0", optional = true }
 scikeras =  { version = "^0.12.0", optional = true }
-braindecode = { version = "^0.7", optional = true }
+braindecode = {version = "^0.8", optional = true}
 torch = { version = "^1.13.1", optional = true }
 libclang = { version = "^15.0", optional = true }