braindecode 1.5.0.dev983__tar.gz → 1.5.0.dev989__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {braindecode-1.5.0.dev983/braindecode.egg-info → braindecode-1.5.0.dev989}/PKG-INFO +1 -1
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/base.py +80 -19
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/attentionbasenet.py +3 -2
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/biot.py +1 -1
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/config.py +5 -4
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/syncnet.py +17 -13
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/tsinception.py +1 -1
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/attention.py +45 -16
- braindecode-1.5.0.dev989/braindecode/version.py +1 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989/braindecode.egg-info}/PKG-INFO +1 -1
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/whats_new.rst +35 -2
- braindecode-1.5.0.dev983/braindecode/version.py +0 -1
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/LICENSE.txt +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/MANIFEST.in +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/NOTICE.txt +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/README.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/augmentation/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/augmentation/base.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/augmentation/functional.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/augmentation/transforms.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/classifier.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bbci.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bcicomp.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/datasets.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/format.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/hub.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/hub_format.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/hub_io.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/hub_validation.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/iterable.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/chb_mit.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/mne.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/moabb.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/nmt.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/registry.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/siena.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/sleep_physionet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/tuh.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/utils.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/xy.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datautil/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datautil/channel_utils.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datautil/hub_formats.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datautil/serialization.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datautil/util.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/eegneuralnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/functional/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/functional/functions.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/functional/initialization.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/atcnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/attn_sleep.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/base.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/bendr.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/brainmodule.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/cbramod.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/contrawr.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/ctnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/deep4.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/deepsleepnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/dgcnn.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegconformer.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eeginception_erp.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eeginception_mi.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegitnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegminer.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegnex.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegpt.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegsimpleconv.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegsym.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eegtcnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/fbcnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/fblightconvnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/fbmsnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/hybrid.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/ifnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/labram.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/luna.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/medformer.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/msvtnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/patchedtransformer.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/reve.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sccnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/shallow_fbcsp.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/signal_jepa.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sinc_shallow.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sparcnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sstdpn.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/summary.csv +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/tcn.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/tidnet.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/usleep.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/util.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/activation.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/blocks.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/convolution.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/filter.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/layers.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/linear.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/parametrization.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/stats.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/util.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/wrapper.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/mne_preprocess.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/preprocess.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/util.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/windowers.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/regressor.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/samplers/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/samplers/base.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/samplers/ssl.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/training/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/training/callbacks.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/training/losses.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/training/scoring.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/util.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/visualization/__init__.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/visualization/confusion_matrices.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/visualization/gradients.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode.egg-info/SOURCES.txt +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode.egg-info/dependency_links.txt +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode.egg-info/requires.txt +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode.egg-info/top_level.txt +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/Makefile +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/_templates/autosummary/class.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/_templates/autosummary/function.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/api.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/cite.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/conf.py +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/help.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/index.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/install/install.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/install/install_pip.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/install/install_source.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/attention.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/channel.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/convolution.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/filterbank.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/gnn.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/interpretable.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/lbm.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/recurrent.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/spd.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/models.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/models_categorization.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/models_table.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/models_visualization.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/sg_execution_times.rst +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/pyproject.toml +0 -0
- {braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: braindecode
|
|
3
|
-
Version: 1.5.0.
|
|
3
|
+
Version: 1.5.0.dev989
|
|
4
4
|
Summary: Deep learning software to decode EEG, ECG or MEG signals
|
|
5
5
|
Author-email: Robin Tibor Schirrmeister <robintibor@gmail.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Alexandre Gramfort <agramfort@meta.com>
|
|
6
6
|
Maintainer-email: Alexandre Gramfort <agramfort@meta.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Robin Tibor Schirrmeister <robintibor@gmail.com>
|
|
@@ -298,34 +298,95 @@ def _build_windowed_repr(
|
|
|
298
298
|
|
|
299
299
|
|
|
300
300
|
def _zarr_to_memmap(zarr_path, group_name):
|
|
301
|
-
"""
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
301
|
+
"""Materialise a zarr array as a float64 ``.npy`` memmap, race-free.
|
|
302
|
+
|
|
303
|
+
Decompress the ``group_name`` array inside ``zarr_path`` into a
|
|
304
|
+
float64 ``.npy`` file inside a sibling ``.<zarr>_memmap/`` cache
|
|
305
|
+
directory and return the path to that file. The dtype is float64
|
|
306
|
+
because MNE objects wrap the memmap zero-copy and MNE requires
|
|
307
|
+
float64 internally. Callers open the result with
|
|
308
|
+
``np.load(path, mmap_mode='c')`` so preprocessing writes land in
|
|
309
|
+
anonymous copy-on-write pages and never mutate the on-disk file.
|
|
310
|
+
|
|
311
|
+
Concurrency contract
|
|
312
|
+
--------------------
|
|
313
|
+
Safe to call from any number of threads or processes concurrently
|
|
314
|
+
on the same ``(zarr_path, group_name)``, on local POSIX, NFSv3,
|
|
315
|
+
Lustre and SMB. The published ``.npy`` file is **created exactly
|
|
316
|
+
once and never replaced**: subsequent callers either hit the
|
|
317
|
+
already-materialised file on the fast path or lose the
|
|
318
|
+
publication race and discard their own copy.
|
|
319
|
+
|
|
320
|
+
The atomic publication step is ``os.link``, not ``rename``.
|
|
321
|
+
``os.link(tmp, dst)`` either creates ``dst`` pointing at ``tmp``'s
|
|
322
|
+
inode or fails with :class:`FileExistsError` when ``dst`` already
|
|
323
|
+
exists — the "create only if absent" primitive we need, available
|
|
324
|
+
on every POSIX filesystem. ``rename`` was the wrong primitive:
|
|
325
|
+
it atomically *replaces* its destination, which unlinks the inode
|
|
326
|
+
that concurrent readers may already have ``mmap``'d. On NFSv3
|
|
327
|
+
that produced ``.nfsXXXX`` silly-rename files and intermittent
|
|
328
|
+
``SIGBUS`` when workers page-faulted on the unlinked inode.
|
|
329
|
+
|
|
330
|
+
Under ``N`` concurrent writers, every racer materialises the data
|
|
331
|
+
into its own per-pid temp file and then tries to publish it; at
|
|
332
|
+
most one ``os.link`` wins, and the losers silently ``unlink``
|
|
333
|
+
their temp file in a ``finally`` block. The wasted I/O scales
|
|
334
|
+
with the number of racers; for the workloads braindecode targets
|
|
335
|
+
(a handful of concurrent workers per group) it is negligible.
|
|
336
|
+
|
|
337
|
+
Crash recovery: if a writer dies mid-run the only debris is a
|
|
338
|
+
``<group>.<pid>.tmp.npy`` file. Such files are namespaced by pid
|
|
339
|
+
so they can never collide with a live writer, they are never
|
|
340
|
+
read by the fast path, and they do not prevent subsequent
|
|
341
|
+
callers from producing a correct result. Caches written by
|
|
342
|
+
earlier braindecode versions remain valid: the fast path only
|
|
343
|
+
requires ``<group>.npy`` to exist.
|
|
306
344
|
"""
|
|
307
345
|
zarr_p = Path(zarr_path)
|
|
308
346
|
cache_dir = zarr_p.parent / f".{zarr_p.name}_memmap"
|
|
309
347
|
npy_path = cache_dir / f"{group_name}.npy"
|
|
310
348
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
349
|
+
# Fast path: the file is already fully materialised. A single
|
|
350
|
+
# stat() is all the steady-state workload pays.
|
|
351
|
+
if npy_path.exists():
|
|
352
|
+
return npy_path
|
|
353
|
+
|
|
354
|
+
cache_dir.mkdir(parents=True, exist_ok=True)
|
|
355
|
+
arr = zarr.open(zarr_path, mode="r")[group_name]["data"]
|
|
356
|
+
tmp_path = cache_dir / f"{group_name}.{os.getpid()}.tmp.npy"
|
|
357
|
+
try:
|
|
358
|
+
# Write chunk-by-chunk to avoid materialising the whole zarr
|
|
359
|
+
# array in RAM.
|
|
316
360
|
mm = np.lib.format.open_memmap(
|
|
317
361
|
tmp_path, mode="w+", dtype=np.float64, shape=arr.shape
|
|
318
362
|
)
|
|
319
|
-
chunk0 = arr.chunks[0] if hasattr(arr, "chunks") else arr.shape[0]
|
|
320
|
-
for start in range(0, arr.shape[0], chunk0):
|
|
321
|
-
end = min(start + chunk0, arr.shape[0])
|
|
322
|
-
mm[start:end] = np.asarray(arr[start:end], dtype=np.float64)
|
|
323
|
-
mm.flush()
|
|
324
|
-
del mm
|
|
325
363
|
try:
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
364
|
+
chunk0 = arr.chunks[0] if hasattr(arr, "chunks") else arr.shape[0]
|
|
365
|
+
for start in range(0, arr.shape[0], chunk0):
|
|
366
|
+
end = min(start + chunk0, arr.shape[0])
|
|
367
|
+
mm[start:end] = np.asarray(arr[start:end], dtype=np.float64)
|
|
368
|
+
mm.flush()
|
|
369
|
+
finally:
|
|
370
|
+
del mm
|
|
371
|
+
|
|
372
|
+
# Atomic publication. ``os.link`` never replaces an existing
|
|
373
|
+
# destination, so the published inode is immutable for the
|
|
374
|
+
# lifetime of the cache directory. Concurrent readers never
|
|
375
|
+
# see their mmap'd inode vanish from under them.
|
|
376
|
+
try:
|
|
377
|
+
os.link(tmp_path, npy_path)
|
|
378
|
+
except FileExistsError:
|
|
379
|
+
# Another writer beat us to it. Their file is the
|
|
380
|
+
# canonical one; ours is discarded in the finally block.
|
|
381
|
+
pass
|
|
382
|
+
finally:
|
|
383
|
+
# Always remove our private per-pid temp file. It is
|
|
384
|
+
# namespaced by pid so this cannot clobber a concurrent
|
|
385
|
+
# writer's in-progress tmp file.
|
|
386
|
+
try:
|
|
387
|
+
os.unlink(tmp_path)
|
|
388
|
+
except FileNotFoundError:
|
|
389
|
+
pass
|
|
329
390
|
|
|
330
391
|
return npy_path
|
|
331
392
|
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/attentionbasenet.py
RENAMED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
# Authors: Sarthak Tayal <sarthaktayal2@gmail.com>
|
|
4
|
+
#
|
|
5
|
+
# License: BSD (3-clause)
|
|
3
6
|
import math
|
|
4
7
|
|
|
5
8
|
from einops.layers.torch import Rearrange
|
|
@@ -275,8 +278,6 @@ class AttentionBaseNet(EEGModuleMixin, nn.Module):
|
|
|
275
278
|
activation: type[nn.Module] = nn.ELU,
|
|
276
279
|
extra_params: bool = False,
|
|
277
280
|
):
|
|
278
|
-
super(AttentionBaseNet, self).__init__()
|
|
279
|
-
|
|
280
281
|
super().__init__(
|
|
281
282
|
n_outputs=n_outputs,
|
|
282
283
|
n_chans=n_chans,
|
|
@@ -439,7 +439,7 @@ class _BIOTEncoder(nn.Module):
|
|
|
439
439
|
self.channel_tokens = nn.Embedding(
|
|
440
440
|
num_embeddings=n_chans, embedding_dim=emb_size
|
|
441
441
|
)
|
|
442
|
-
self.index
|
|
442
|
+
self.register_buffer("index", torch.arange(n_chans, dtype=torch.long))
|
|
443
443
|
|
|
444
444
|
def stft(self, sample):
|
|
445
445
|
"""
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# Authors: Sarthak Tayal <sarthaktayal2@gmail.com>
|
|
1
2
|
from collections.abc import Callable
|
|
2
3
|
from inspect import signature
|
|
3
4
|
from types import UnionType
|
|
@@ -17,10 +18,10 @@ from braindecode.models.util import (
|
|
|
17
18
|
|
|
18
19
|
try:
|
|
19
20
|
from numpydantic import NDArray, Shape
|
|
21
|
+
|
|
22
|
+
_loc_type = NDArray[Shape["12"], np.float64]
|
|
20
23
|
except ImportError:
|
|
21
|
-
|
|
22
|
-
NDArray = Any # type: ignore
|
|
23
|
-
Shape = Any # type: ignore
|
|
24
|
+
_loc_type = np.ndarray # type: ignore[misc]
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
class ChsInfoType(TypedDict, total=False, closed=True): # type: ignore[call-arg]
|
|
@@ -29,7 +30,7 @@ class ChsInfoType(TypedDict, total=False, closed=True): # type: ignore[call-arg
|
|
|
29
30
|
coil_type: int
|
|
30
31
|
coord_frame: int
|
|
31
32
|
kind: str
|
|
32
|
-
loc:
|
|
33
|
+
loc: _loc_type # type: ignore[valid-type,misc]
|
|
33
34
|
logno: int
|
|
34
35
|
range: float
|
|
35
36
|
scanno: int
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
# Authors: Sarthak Tayal <sarthaktayal2@gmail.com>
|
|
2
|
+
#
|
|
3
|
+
# License: BSD (3-clause)
|
|
4
|
+
|
|
1
5
|
import torch
|
|
2
6
|
import torch.nn as nn
|
|
3
7
|
import torch.nn.functional as F
|
|
@@ -51,11 +55,11 @@ class SyncNet(EEGModuleMixin, nn.Module):
|
|
|
51
55
|
The initialization range for omega parameters using uniform
|
|
52
56
|
distribution. Default is (0, 1).
|
|
53
57
|
beta_init_values : tuple of float, optional
|
|
54
|
-
The initialization range for beta parameters using uniform
|
|
55
|
-
distribution. Default is (0,
|
|
58
|
+
The initialization range for beta (decay) parameters using uniform
|
|
59
|
+
distribution. Default is (0, 0.05).
|
|
56
60
|
phase_init_values : tuple of float, optional
|
|
57
|
-
The initialization
|
|
58
|
-
|
|
61
|
+
The initialization mean and standard deviation for phase
|
|
62
|
+
parameters using normal distribution. Default is (0, 0.05).
|
|
59
63
|
|
|
60
64
|
|
|
61
65
|
Notes
|
|
@@ -146,12 +150,12 @@ class SyncNet(EEGModuleMixin, nn.Module):
|
|
|
146
150
|
# Phase Shift
|
|
147
151
|
self.phi_ini = nn.Parameter(
|
|
148
152
|
torch.FloatTensor(1, 1, self.n_chans, self.num_filters).normal_(
|
|
149
|
-
self.
|
|
153
|
+
self.phase_init_values[0], self.phase_init_values[1]
|
|
150
154
|
)
|
|
151
155
|
)
|
|
152
156
|
self.beta = nn.Parameter(
|
|
153
157
|
torch.FloatTensor(1, 1, 1, self.num_filters).uniform_(
|
|
154
|
-
self.
|
|
158
|
+
self.beta_init_values[0], self.beta_init_values[1]
|
|
155
159
|
)
|
|
156
160
|
)
|
|
157
161
|
|
|
@@ -185,21 +189,21 @@ class SyncNet(EEGModuleMixin, nn.Module):
|
|
|
185
189
|
# Output: (batch_size, n_chans, 1, n_times)
|
|
186
190
|
|
|
187
191
|
# Compute the oscillatory component
|
|
192
|
+
# Shape: (1, filter_width, n_chans, num_filters)
|
|
188
193
|
W_osc = self.amplitude * torch.cos(self.t * self.omega + self.phi_ini)
|
|
189
|
-
# W_osc is (1, filter_width, n_chans, 1)
|
|
190
194
|
|
|
191
195
|
# Compute the decay component
|
|
192
|
-
|
|
193
|
-
|
|
196
|
+
# Shape: (1, filter_width, 1, num_filters)
|
|
197
|
+
t_squared = torch.pow(self.t, 2)
|
|
198
|
+
t_squared_beta = t_squared * self.beta
|
|
194
199
|
W_decay = torch.exp(-t_squared_beta)
|
|
195
|
-
# W_osc is (1, filter_width, 1, 1)
|
|
196
200
|
|
|
197
201
|
# Combine oscillatory and decay components
|
|
198
|
-
#
|
|
202
|
+
# Shape: (1, filter_width, n_chans, num_filters)
|
|
199
203
|
W = W_osc * W_decay
|
|
200
|
-
# W shape will be: (1, filter_width, n_chans, 1)
|
|
201
204
|
|
|
202
|
-
|
|
205
|
+
# Permute to conv2d weight shape (out_channels, in_channels, kH, kW)
|
|
206
|
+
W = W.permute(3, 2, 0, 1).contiguous()
|
|
203
207
|
|
|
204
208
|
# Apply convolution
|
|
205
209
|
x_padded = self.pad_input(x.float())
|
|
@@ -837,6 +837,18 @@ class CATLite(nn.Module):
|
|
|
837
837
|
class MultiHeadAttention(nn.Module):
|
|
838
838
|
"""Multi-head self-attention block.
|
|
839
839
|
|
|
840
|
+
Uses ``F.scaled_dot_product_attention`` for optimized attention
|
|
841
|
+
kernels (flash-attention on CUDA, memory-efficient on other devices).
|
|
842
|
+
|
|
843
|
+
Parameters
|
|
844
|
+
----------
|
|
845
|
+
emb_size : int
|
|
846
|
+
The embedding dimension.
|
|
847
|
+
num_heads : int
|
|
848
|
+
Number of attention heads. Must evenly divide ``emb_size``.
|
|
849
|
+
dropout : float, optional
|
|
850
|
+
Dropout probability applied to attention weights. Default: 0.0.
|
|
851
|
+
|
|
840
852
|
Examples
|
|
841
853
|
--------
|
|
842
854
|
>>> import torch
|
|
@@ -848,40 +860,57 @@ class MultiHeadAttention(nn.Module):
|
|
|
848
860
|
torch.Size([2, 10, 32])
|
|
849
861
|
"""
|
|
850
862
|
|
|
851
|
-
def __init__(self, emb_size, num_heads, dropout):
|
|
863
|
+
def __init__(self, emb_size, num_heads, dropout=0.0):
|
|
852
864
|
super().__init__()
|
|
865
|
+
if emb_size % num_heads != 0:
|
|
866
|
+
raise ValueError(
|
|
867
|
+
f"emb_size ({emb_size}) must be divisible by num_heads ({num_heads})."
|
|
868
|
+
)
|
|
853
869
|
self.emb_size = emb_size
|
|
854
870
|
self.num_heads = num_heads
|
|
871
|
+
self.head_dim = emb_size // num_heads
|
|
855
872
|
self.keys = nn.Linear(emb_size, emb_size)
|
|
856
873
|
self.queries = nn.Linear(emb_size, emb_size)
|
|
857
874
|
self.values = nn.Linear(emb_size, emb_size)
|
|
858
|
-
self.att_drop =
|
|
875
|
+
self.att_drop = dropout
|
|
859
876
|
self.projection = nn.Linear(emb_size, emb_size)
|
|
860
877
|
|
|
861
878
|
self.rearrange_stack = Rearrange(
|
|
862
|
-
"
|
|
863
|
-
|
|
879
|
+
"batch seq (heads head_dim) -> batch heads seq head_dim",
|
|
880
|
+
heads=num_heads,
|
|
864
881
|
)
|
|
865
882
|
self.rearrange_unstack = Rearrange(
|
|
866
|
-
"
|
|
883
|
+
"batch heads seq head_dim -> batch seq (heads head_dim)",
|
|
867
884
|
)
|
|
868
885
|
|
|
869
886
|
def forward(self, x: Tensor, mask: Optional[Tensor] = None) -> Tensor:
|
|
887
|
+
"""Forward pass.
|
|
888
|
+
|
|
889
|
+
Parameters
|
|
890
|
+
----------
|
|
891
|
+
x : Tensor
|
|
892
|
+
Input tensor of shape ``(batch, seq, emb_size)``.
|
|
893
|
+
mask : Tensor, optional
|
|
894
|
+
Attention mask following PyTorch SDPA convention: for boolean
|
|
895
|
+
masks ``True`` means **ignore** that position; for float
|
|
896
|
+
masks the values are **added** to attention scores before
|
|
897
|
+
softmax.
|
|
898
|
+
"""
|
|
870
899
|
queries = self.rearrange_stack(self.queries(x))
|
|
871
900
|
keys = self.rearrange_stack(self.keys(x))
|
|
872
901
|
values = self.rearrange_stack(self.values(x))
|
|
873
|
-
|
|
874
|
-
if
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
902
|
+
|
|
903
|
+
dp = self.att_drop if self.training else 0.0
|
|
904
|
+
out = F.scaled_dot_product_attention(
|
|
905
|
+
queries,
|
|
906
|
+
keys,
|
|
907
|
+
values,
|
|
908
|
+
attn_mask=mask,
|
|
909
|
+
dropout_p=dp,
|
|
910
|
+
)
|
|
911
|
+
|
|
882
912
|
out = self.rearrange_unstack(out)
|
|
883
|
-
|
|
884
|
-
return out
|
|
913
|
+
return self.projection(out)
|
|
885
914
|
|
|
886
915
|
|
|
887
916
|
class CrissCrossTransformerEncoderLayer(nn.Module):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.5.0.dev989"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: braindecode
|
|
3
|
-
Version: 1.5.0.
|
|
3
|
+
Version: 1.5.0.dev989
|
|
4
4
|
Summary: Deep learning software to decode EEG, ECG or MEG signals
|
|
5
5
|
Author-email: Robin Tibor Schirrmeister <robintibor@gmail.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Alexandre Gramfort <agramfort@meta.com>
|
|
6
6
|
Maintainer-email: Alexandre Gramfort <agramfort@meta.com>, Bruno Aristimunha Pinto <b.aristimunha@gmail.com>, Robin Tibor Schirrmeister <robintibor@gmail.com>
|
|
@@ -28,10 +28,19 @@ Current 1.5.0 (GitHub)
|
|
|
28
28
|
Enhancements
|
|
29
29
|
============
|
|
30
30
|
|
|
31
|
+
- Use ``F.scaled_dot_product_attention`` in :class:`braindecode.modules.MultiHeadAttention`,
|
|
32
|
+
enabling optimized attention kernels (flash-attention on CUDA,
|
|
33
|
+
memory-efficient backends on other devices).
|
|
34
|
+
By `Léo Burgund`_ and `Bruno Aristimunha`_.
|
|
35
|
+
(:gh:`902`)
|
|
36
|
+
|
|
31
37
|
API and behavior changes
|
|
32
38
|
========================
|
|
33
39
|
|
|
34
|
-
-
|
|
40
|
+
- :class:`braindecode.modules.MultiHeadAttention` now follows PyTorch's SDPA mask
|
|
41
|
+
convention: boolean masks use ``True`` to **ignore** a position (previously
|
|
42
|
+
``True`` meant keep). The scaling factor is now ``1/sqrt(head_dim)`` instead of
|
|
43
|
+
``1/sqrt(emb_size)``. (:gh:`902`)
|
|
35
44
|
|
|
36
45
|
Requirements
|
|
37
46
|
============
|
|
@@ -41,7 +50,31 @@ Requirements
|
|
|
41
50
|
Bug fixes
|
|
42
51
|
==========
|
|
43
52
|
|
|
44
|
-
-
|
|
53
|
+
- Fix :class:`braindecode.models.SyncNet` swapped parameter initialization where
|
|
54
|
+
``phi_ini`` (phase shift) was using ``beta_init_values`` and ``beta`` (decay) was
|
|
55
|
+
using ``phase_init_values``, replaced incorrect ``.view()`` reshape with ``.permute()``
|
|
56
|
+
for proper conv2d filter weight layout, and fixed duplicate default values in docstring
|
|
57
|
+
(by `Sarthak Tayal`_)
|
|
58
|
+
- Fix :class:`braindecode.models.AttentionBaseNet` redundant
|
|
59
|
+
``super().__init__()`` call that ran the parent ``nn.Module.__init__`` twice
|
|
60
|
+
(by `Sarthak Tayal`_)
|
|
61
|
+
- Fix incomplete author email in :class:`braindecode.models.TSception` header
|
|
62
|
+
(by `Sarthak Tayal`_)
|
|
63
|
+
- Fix a time-of-check-time-of-use race in
|
|
64
|
+
:func:`braindecode.datasets.base._zarr_to_memmap` that caused
|
|
65
|
+
concurrent workers to repeatedly ``rename``-replace the published
|
|
66
|
+
``.npy`` cache, producing wasted I/O on local filesystems and
|
|
67
|
+
``.nfsXXXX`` silly-rename files plus ``SIGBUS`` crashes on NFSv3.
|
|
68
|
+
The published file is now created exactly once via ``os.link`` and
|
|
69
|
+
is never replaced, making the cache safe under arbitrary
|
|
70
|
+
concurrent access on local POSIX, NFSv3, Lustre and SMB
|
|
71
|
+
(:gh:`986` by `Pierre Guetschel`_)
|
|
72
|
+
- Register :class:`braindecode.models.BIOT` encoder ``index`` as a non-trainable
|
|
73
|
+
buffer instead of a parameter (``torch.long``), so it is treated as module
|
|
74
|
+
state rather than trainable weights (:gh:`988` by `Pierre Guetschel`_)
|
|
75
|
+
- Fix ``TypeError: type 'Any' is not subscriptable`` when importing
|
|
76
|
+
``braindecode.models.config`` without ``numpydantic`` installed on
|
|
77
|
+
Python 3.12+ (:gh:`871` by `Sarthak Tayal`_)
|
|
45
78
|
|
|
46
79
|
Code health
|
|
47
80
|
============
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.5.0.dev983"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/augmentation/functional.py
RENAMED
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/augmentation/transforms.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/hub_format.py
RENAMED
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/bids/hub_validation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/sleep_physio_challe_18.py
RENAMED
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/datasets/sleep_physionet.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/functional/initialization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/eeginception_erp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/patchedtransformer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/models/sleep_stager_blanco_2020.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/modules/parametrization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/mne_preprocess.py
RENAMED
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/preprocess.py
RENAMED
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/preprocessing/windowers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode/visualization/gradients.py
RENAMED
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/braindecode.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/_templates/autosummary/function.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/attention.rst
RENAMED
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/channel.rst
RENAMED
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/convolution.rst
RENAMED
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/filterbank.rst
RENAMED
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/interpretable.rst
RENAMED
|
File without changes
|
|
File without changes
|
{braindecode-1.5.0.dev983 → braindecode-1.5.0.dev989}/docs/models/categorization/recurrent.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|