braindecode 1.5.0.dev989__tar.gz → 1.5.0.dev996__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.
Files changed (166) hide show
  1. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/NOTICE.txt +5 -0
  2. {braindecode-1.5.0.dev989/braindecode.egg-info → braindecode-1.5.0.dev996}/PKG-INFO +1 -1
  3. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/__init__.py +14 -3
  4. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/bendr.py +92 -28
  5. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/biot.py +61 -1
  6. braindecode-1.5.0.dev996/braindecode/models/codebrain.py +977 -0
  7. braindecode-1.5.0.dev996/braindecode/models/interpolated.py +182 -0
  8. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/labram.py +208 -266
  9. braindecode-1.5.0.dev996/braindecode/models/meta_neuromotor.py +1774 -0
  10. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/reve.py +1 -1
  11. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/signal_jepa.py +463 -38
  12. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/summary.csv +6 -0
  13. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/util.py +139 -20
  14. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/__init__.py +2 -0
  15. braindecode-1.5.0.dev996/braindecode/modules/interpolation.py +201 -0
  16. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/preprocessing/eegprep_preprocess.py +51 -6
  17. braindecode-1.5.0.dev996/braindecode/version.py +1 -0
  18. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996/braindecode.egg-info}/PKG-INFO +1 -1
  19. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode.egg-info/SOURCES.txt +4 -0
  20. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/api.rst +10 -0
  21. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/whats_new.rst +67 -0
  22. braindecode-1.5.0.dev989/braindecode/version.py +0 -1
  23. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/LICENSE.txt +0 -0
  24. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/MANIFEST.in +0 -0
  25. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/README.rst +0 -0
  26. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/__init__.py +0 -0
  27. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/augmentation/__init__.py +0 -0
  28. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/augmentation/base.py +0 -0
  29. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/augmentation/functional.py +0 -0
  30. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/augmentation/transforms.py +0 -0
  31. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/classifier.py +0 -0
  32. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/__init__.py +0 -0
  33. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/base.py +0 -0
  34. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bbci.py +0 -0
  35. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bcicomp.py +0 -0
  36. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/__init__.py +0 -0
  37. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/datasets.py +0 -0
  38. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/format.py +0 -0
  39. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/hub.py +0 -0
  40. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/hub_format.py +0 -0
  41. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/hub_io.py +0 -0
  42. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/hub_validation.py +0 -0
  43. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/bids/iterable.py +0 -0
  44. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/chb_mit.py +0 -0
  45. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/mne.py +0 -0
  46. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/moabb.py +0 -0
  47. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/nmt.py +0 -0
  48. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/registry.py +0 -0
  49. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/siena.py +0 -0
  50. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  51. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/sleep_physionet.py +0 -0
  52. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/tuh.py +0 -0
  53. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/utils.py +0 -0
  54. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datasets/xy.py +0 -0
  55. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datautil/__init__.py +0 -0
  56. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datautil/channel_utils.py +0 -0
  57. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datautil/hub_formats.py +0 -0
  58. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datautil/serialization.py +0 -0
  59. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/datautil/util.py +0 -0
  60. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/eegneuralnet.py +0 -0
  61. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/functional/__init__.py +0 -0
  62. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/functional/functions.py +0 -0
  63. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/functional/initialization.py +0 -0
  64. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/atcnet.py +0 -0
  65. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/attentionbasenet.py +0 -0
  66. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/attn_sleep.py +0 -0
  67. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/base.py +0 -0
  68. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/brainmodule.py +0 -0
  69. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/cbramod.py +0 -0
  70. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/config.py +0 -0
  71. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/contrawr.py +0 -0
  72. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/ctnet.py +0 -0
  73. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/deep4.py +0 -0
  74. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/deepsleepnet.py +0 -0
  75. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/dgcnn.py +0 -0
  76. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegconformer.py +0 -0
  77. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eeginception_erp.py +0 -0
  78. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eeginception_mi.py +0 -0
  79. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegitnet.py +0 -0
  80. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegminer.py +0 -0
  81. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegnet.py +0 -0
  82. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegnex.py +0 -0
  83. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegpt.py +0 -0
  84. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegsimpleconv.py +0 -0
  85. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegsym.py +0 -0
  86. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/eegtcnet.py +0 -0
  87. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/fbcnet.py +0 -0
  88. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/fblightconvnet.py +0 -0
  89. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/fbmsnet.py +0 -0
  90. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/hybrid.py +0 -0
  91. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/ifnet.py +0 -0
  92. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/luna.py +0 -0
  93. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/medformer.py +0 -0
  94. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/msvtnet.py +0 -0
  95. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/patchedtransformer.py +0 -0
  96. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/sccnet.py +0 -0
  97. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/shallow_fbcsp.py +0 -0
  98. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/sinc_shallow.py +0 -0
  99. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
  100. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
  101. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/sparcnet.py +0 -0
  102. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/sstdpn.py +0 -0
  103. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/syncnet.py +0 -0
  104. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/tcn.py +0 -0
  105. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/tidnet.py +0 -0
  106. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/tsinception.py +0 -0
  107. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/models/usleep.py +0 -0
  108. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/activation.py +0 -0
  109. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/attention.py +0 -0
  110. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/blocks.py +0 -0
  111. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/convolution.py +0 -0
  112. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/filter.py +0 -0
  113. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/layers.py +0 -0
  114. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/linear.py +0 -0
  115. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/parametrization.py +0 -0
  116. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/stats.py +0 -0
  117. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/util.py +0 -0
  118. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/modules/wrapper.py +0 -0
  119. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/preprocessing/__init__.py +0 -0
  120. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/preprocessing/mne_preprocess.py +0 -0
  121. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/preprocessing/preprocess.py +0 -0
  122. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/preprocessing/util.py +0 -0
  123. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/preprocessing/windowers.py +0 -0
  124. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/regressor.py +0 -0
  125. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/samplers/__init__.py +0 -0
  126. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/samplers/base.py +0 -0
  127. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/samplers/ssl.py +0 -0
  128. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/training/__init__.py +0 -0
  129. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/training/callbacks.py +0 -0
  130. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/training/losses.py +0 -0
  131. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/training/scoring.py +0 -0
  132. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/util.py +0 -0
  133. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/visualization/__init__.py +0 -0
  134. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/visualization/confusion_matrices.py +0 -0
  135. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode/visualization/gradients.py +0 -0
  136. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode.egg-info/dependency_links.txt +0 -0
  137. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode.egg-info/requires.txt +0 -0
  138. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/braindecode.egg-info/top_level.txt +0 -0
  139. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/Makefile +0 -0
  140. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/_templates/autosummary/class.rst +0 -0
  141. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
  142. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/_templates/autosummary/function.rst +0 -0
  143. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
  144. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/cite.rst +0 -0
  145. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/conf.py +0 -0
  146. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/help.rst +0 -0
  147. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/index.rst +0 -0
  148. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/install/install.rst +0 -0
  149. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/install/install_pip.rst +0 -0
  150. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/install/install_source.rst +0 -0
  151. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/attention.rst +0 -0
  152. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/channel.rst +0 -0
  153. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/convolution.rst +0 -0
  154. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/filterbank.rst +0 -0
  155. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/gnn.rst +0 -0
  156. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/interpretable.rst +0 -0
  157. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/lbm.rst +0 -0
  158. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/recurrent.rst +0 -0
  159. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/categorization/spd.rst +0 -0
  160. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/models.rst +0 -0
  161. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/models_categorization.rst +0 -0
  162. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/models_table.rst +0 -0
  163. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/models/models_visualization.rst +0 -0
  164. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/docs/sg_execution_times.rst +0 -0
  165. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/pyproject.toml +0 -0
  166. {braindecode-1.5.0.dev989 → braindecode-1.5.0.dev996}/setup.cfg +0 -0
@@ -11,9 +11,14 @@ All files within the `src/` directory are licensed under the BSD-3-Clause Licens
11
11
  The following components are licensed under the Creative Commons Attribution-NonCommercial 4.0 International License:
12
12
 
13
13
  - `braindecode/models/eegminer.py`
14
+ - `braindecode/models/meta_neuromotor.py`
14
15
 
15
16
  As well as class later imported into the `braindecode.models.module` named as GeneralizedGaussianFilter.
16
17
 
18
+ The `meta_neuromotor.py` file is a derivative of
19
+ `facebookresearch/generic-neuromotor-interface`, released by Meta Platforms,
20
+ Inc. under CC BY-NC 4.0, and inherits the same noncommercial terms.
21
+
17
22
  ## License Links
18
23
 
19
24
  - [BSD-3-Clause License](https://opensource.org/licenses/BSD-3-Clause)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.5.0.dev989
3
+ Version: 1.5.0.dev996
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>
@@ -4,10 +4,11 @@ from .atcnet import ATCNet
4
4
  from .attentionbasenet import AttentionBaseNet
5
5
  from .attn_sleep import AttnSleep
6
6
  from .base import EEGModuleMixin
7
- from .bendr import BENDR
8
- from .biot import BIOT
7
+ from .bendr import BENDR, InterpolatedBENDR
8
+ from .biot import BIOT, InterpolatedBIOT
9
9
  from .brainmodule import BrainModule
10
10
  from .cbramod import CBraMod
11
+ from .codebrain import CodeBrain
11
12
  from .contrawr import ContraWR
12
13
  from .ctnet import CTNet
13
14
  from .deep4 import Deep4Net
@@ -29,15 +30,18 @@ from .fblightconvnet import FBLightConvNet
29
30
  from .fbmsnet import FBMSNet
30
31
  from .hybrid import HybridNet
31
32
  from .ifnet import IFNet
32
- from .labram import Labram
33
+ from .interpolated import InterpolatedModel
34
+ from .labram import InterpolatedLaBraM, Labram
33
35
  from .luna import LUNA
34
36
  from .medformer import MEDFormer
37
+ from .meta_neuromotor import MetaNeuromotorHand
35
38
  from .msvtnet import MSVTNet
36
39
  from .patchedtransformer import PBT
37
40
  from .reve import REVE
38
41
  from .sccnet import SCCNet
39
42
  from .shallow_fbcsp import ShallowFBCSPNet
40
43
  from .signal_jepa import (
44
+ InterpolatedSignalJEPA,
41
45
  SignalJEPA,
42
46
  SignalJEPA_Contextual,
43
47
  SignalJEPA_PostLocal,
@@ -72,6 +76,7 @@ __all__ = [
72
76
  "BIOT",
73
77
  "BENDR",
74
78
  "CBraMod",
79
+ "CodeBrain",
75
80
  "ContraWR",
76
81
  "CTNet",
77
82
  "Deep4Net",
@@ -93,8 +98,14 @@ __all__ = [
93
98
  "FBCNet",
94
99
  "FBLightConvNet",
95
100
  "FBMSNet",
101
+ "MetaNeuromotorHand",
96
102
  "HybridNet",
97
103
  "IFNet",
104
+ "InterpolatedBENDR",
105
+ "InterpolatedBIOT",
106
+ "InterpolatedLaBraM",
107
+ "InterpolatedModel",
108
+ "InterpolatedSignalJEPA",
98
109
  "Labram",
99
110
  "LUNA",
100
111
  "extract_channel_locations_from_chs_info",
@@ -1,12 +1,60 @@
1
1
  import copy
2
2
 
3
+ import numpy as np
3
4
  import torch
4
5
  from einops.layers.torch import Rearrange
5
6
  from torch import nn
6
- from torch.nn.utils.parametrize import register_parametrization
7
7
 
8
8
  from braindecode.models.base import EEGModuleMixin
9
- from braindecode.modules.parametrization import MaxNormParametrize
9
+
10
+ # The 20 channels used to pre-train BENDR, in the order expected by the
11
+ # `braindecode/braindecode-bendr` checkpoint. The first 19 entries are the
12
+ # EEG channels taken verbatim from `dn3.transforms.instance.To1020.EEG_20_div`
13
+ # (https://github.com/SPOClab-ca/dn3/blob/master/dn3/transforms/instance.py).
14
+ # Their positions come from MNE's ``standard_1005`` montage (T5/T6 are
15
+ # legacy names that share positions with P7/P8 there).
16
+ #
17
+ # The 20th entry is ``SCALE``, a relative-amplitude statistic (not an
18
+ # electrode) appended by ``To1020(include_scale_ch=True)`` during
19
+ # pre-training. Since it has no physical position, the ``loc`` below is
20
+ # the centroid of the 19 EEG positions — purely a placeholder so that
21
+ # :class:`~braindecode.modules.ChannelInterpolationLayer` (used by
22
+ # :class:`InterpolatedBENDR`) can build a valid spline interpolation
23
+ # matrix. It is NOT the SCALE the pre-training pipeline computes
24
+ # (which is an RMS-like amplitude via ``dn3.MappingDeep1010``); users
25
+ # who need a faithful SCALE must compute it themselves and feed 20
26
+ # channels to :class:`BENDR` directly.
27
+ _BENDR_TARGET_CHS_TUPLES: list[tuple[str, tuple[float, float, float]]] = [
28
+ ("FP1", (-0.0294367, +0.0839171, -0.0069900)), # standard_1005
29
+ ("FP2", (+0.0298723, +0.0848959, -0.0070800)), # standard_1005
30
+ ("F7", (-0.0702629, +0.0424743, -0.0114200)), # standard_1005
31
+ ("F3", (-0.0502438, +0.0531112, +0.0421920)), # standard_1005
32
+ ("FZ", (+0.0003122, +0.0585120, +0.0664620)), # standard_1005
33
+ ("F4", (+0.0518362, +0.0543048, +0.0408140)), # standard_1005
34
+ ("F8", (+0.0730431, +0.0444217, -0.0120000)), # standard_1005
35
+ ("T7", (-0.0841611, -0.0160187, -0.0093460)), # standard_1005
36
+ ("C3", (-0.0653581, -0.0116317, +0.0643580)), # standard_1005
37
+ ("CZ", (+0.0004009, -0.0091670, +0.1002440)), # standard_1005
38
+ ("C4", (+0.0671179, -0.0109003, +0.0635800)), # standard_1005
39
+ ("T8", (+0.0850799, -0.0150203, -0.0094900)), # standard_1005
40
+ ("T5", (-0.0724343, -0.0734527, -0.0024870)), # standard_1005 (= P7)
41
+ ("P3", (-0.0530073, -0.0787878, +0.0559400)), # standard_1005
42
+ ("PZ", (+0.0003247, -0.0811150, +0.0826150)), # standard_1005
43
+ ("P4", (+0.0556667, -0.0785602, +0.0565610)), # standard_1005
44
+ ("T6", (+0.0730557, -0.0730683, -0.0025400)), # standard_1005 (= P8)
45
+ ("O1", (-0.0294134, -0.1124490, +0.0088390)), # standard_1005
46
+ ("O2", (+0.0298426, -0.1121560, +0.0088000)), # standard_1005
47
+ (
48
+ "SCALE",
49
+ (+0.0006439, -0.0131942, +0.0278448),
50
+ ), # centroid of the 19 EEG positions (placeholder; see comment above)
51
+ ]
52
+
53
+ _BENDR_TARGET_CHS_INFO: list[dict] = [
54
+ {"ch_name": ch, "kind": "eeg", "loc": np.asarray(loc, dtype=float)}
55
+ for ch, loc in _BENDR_TARGET_CHS_TUPLES
56
+ ]
57
+ BENDR_CHANNEL_ORDER: list[str] = [ch for ch, _ in _BENDR_TARGET_CHS_TUPLES]
10
58
 
11
59
 
12
60
  class BENDR(EEGModuleMixin, nn.Module):
@@ -195,15 +243,6 @@ class BENDR(EEGModuleMixin, nn.Module):
195
243
  The contextualizer is still created (to allow loading pretrained weights) but is not
196
244
  used in the forward pass. Requires input length of at least
197
245
  ``4 * product(enc_downsample)`` samples (384 with default downsampling of 96x).
198
- n_chans_pretrained : int or None, default=None
199
- Number of input channels the pretrained weights expect (20 for the official BENDR
200
- checkpoint). When set and ``n_chans != n_chans_pretrained``, a 1x1 Conv1d with
201
- max-norm constraint projects from ``n_chans`` to ``n_chans_pretrained`` before the
202
- encoder. This allows fine-tuning pretrained BENDR on datasets with arbitrary channel
203
- counts. When using ``from_pretrained``, pass ``strict=False`` since the checkpoint
204
- will not contain ``channel_projection`` weights.
205
- chan_proj_max_norm : float, default=1.0
206
- Max-norm constraint value for the channel projection weights.
207
246
  """
208
247
 
209
248
  def __init__(
@@ -231,8 +270,6 @@ class BENDR(EEGModuleMixin, nn.Module):
231
270
  start_token=-5, # Value for start token embedding
232
271
  final_layer=True, # Whether to include the final linear layer
233
272
  encoder_only=False, # If True, bypass contextualizer and use 4-chunk pooling
234
- n_chans_pretrained=None, # Expected input channels of pretrained weights
235
- chan_proj_max_norm=1.0, # Max-norm for channel projection weights
236
273
  ):
237
274
  super().__init__(
238
275
  n_outputs=n_outputs,
@@ -246,25 +283,34 @@ class BENDR(EEGModuleMixin, nn.Module):
246
283
  # Keep these parameters if needed later, otherwise they are captured by the mixin
247
284
  del n_outputs, n_chans, chs_info, n_times, input_window_seconds, sfreq
248
285
 
286
+ # If the user supplies chs_info, require it to match BENDR_CHANNEL_ORDER
287
+ # exactly (case-insensitive). Arbitrary channel sets should go through
288
+ # InterpolatedBENDR — same pattern as Labram / InterpolatedLaBraM.
289
+ # When chs_info is absent (the usual n_chans=20 path, incl.
290
+ # from_pretrained), no check is performed.
291
+ try:
292
+ _chs_info = self.chs_info
293
+ except ValueError:
294
+ _chs_info = None
295
+ if _chs_info is not None:
296
+ user_names = [ch["ch_name"] for ch in _chs_info] # type: ignore[index]
297
+ canonical = BENDR_CHANNEL_ORDER
298
+ if [n.lower() for n in user_names] != [n.lower() for n in canonical]:
299
+ raise ValueError(
300
+ f"BENDR requires chs_info to match BENDR_CHANNEL_ORDER exactly "
301
+ f"({len(canonical)} channels, specific order; last is 'SCALE'). "
302
+ f"Got {len(user_names)} channel(s). For arbitrary channel sets, "
303
+ f"use InterpolatedBENDR "
304
+ f"(from braindecode.models import InterpolatedBENDR)."
305
+ )
306
+
249
307
  self.encoder_h = encoder_h
250
308
  self.contextualizer_hidden = contextualizer_hidden
251
309
  self.include_final_layer = final_layer
252
310
  self.encoder_only = encoder_only
253
311
 
254
- # Channel projection for pretrained weight compatibility
255
- encoder_n_chans = self.n_chans
256
- if n_chans_pretrained is not None and self.n_chans != n_chans_pretrained:
257
- conv = nn.Conv1d(self.n_chans, n_chans_pretrained, 1, bias=False)
258
- register_parametrization(
259
- conv, "weight", MaxNormParametrize(chan_proj_max_norm)
260
- )
261
- self.channel_projection = conv
262
- encoder_n_chans = n_chans_pretrained
263
- else:
264
- self.channel_projection = None
265
-
266
312
  self.encoder = _ConvEncoderBENDR(
267
- in_features=encoder_n_chans,
313
+ in_features=self.n_chans,
268
314
  encoder_h=encoder_h,
269
315
  dropout=drop_prob,
270
316
  projection_head=projection_head,
@@ -308,8 +354,6 @@ class BENDR(EEGModuleMixin, nn.Module):
308
354
  self._build_head(n_outputs)
309
355
 
310
356
  def forward(self, x, return_features=False):
311
- if self.channel_projection is not None:
312
- x = self.channel_projection(x)
313
357
  encoded = self.encoder(x)
314
358
  # encoded: [batch_size, encoder_h, n_encoded_times]
315
359
 
@@ -552,3 +596,23 @@ class _BENDRContextualizer(nn.Module):
552
596
  # x: [batch_size, in_features, seq_len + 1]
553
597
 
554
598
  return x
599
+
600
+
601
+ # -----------------------------------------------------------------------------
602
+ # InterpolatedBENDR — experimental channel-interpolation variant of BENDR
603
+ # -----------------------------------------------------------------------------
604
+ # Wraps :class:`BENDR` with an MNE-backed channel-interpolation layer that
605
+ # projects arbitrary user ``chs_info`` to the canonical 20-channel BENDR
606
+ # input (:data:`_BENDR_TARGET_CHS_INFO` — the 19 pre-training EEG channels
607
+ # plus a ``SCALE`` placeholder at the centroid of those 19 positions).
608
+ # Frozen by default; set ``trainable=True`` to fine-tune the projection.
609
+ #
610
+ # NOTE: the ``SCALE`` target has no physical position, so the row of the
611
+ # interpolation matrix that produces it is a spatial spline of the user's
612
+ # EEG channels — *not* the dn3 ``MappingDeep1010`` RMS statistic the
613
+ # checkpoint saw during pre-training. Expect degraded zero-shot transfer
614
+ # from the SCALE channel; downstream fine-tuning should still work.
615
+
616
+ from braindecode.models.interpolated import InterpolatedModel # noqa: E402
617
+
618
+ InterpolatedBENDR = InterpolatedModel(BENDR, _BENDR_TARGET_CHS_INFO)
@@ -1,12 +1,57 @@
1
1
  import math
2
2
  from warnings import warn
3
3
 
4
+ import numpy as np
4
5
  import torch
5
6
  import torch.nn as nn
6
7
  from linear_attention_transformer import LinearAttentionTransformer
7
8
 
8
9
  from braindecode.models.base import EEGModuleMixin
9
10
 
11
+ # -----------------------------------------------------------------------------
12
+ # Canonical channel order for InterpolatedBIOT — the 18-channel TCP bipolar
13
+ # montage used by BIOT's shhs-prest and six-datasets pretrained checkpoints.
14
+ # Source: https://github.com/ycq091044/BIOT (README + datasets/TUAB/process.py
15
+ # + datasets/SHHS/process.py). Indices 0-15 are the TCP 16-channel bipolar
16
+ # derivations; indices 16-17 are SHHS differential channels.
17
+ #
18
+ # The `loc` values are only used to build an MNE interpolation matrix for
19
+ # InterpolatedBIOT. All entries are bipolar / differential derivations.
20
+ # TODO: positions are stored as the midpoint of the two constituent
21
+ # electrodes. This is a simplification — a bipolar signal V(A)-V(B) cannot
22
+ # be faithfully recovered by spatial interpolation at the midpoint. Revisit
23
+ # in a follow-up PR (e.g. a dedicated BipolarDerivationLayer).
24
+ # -----------------------------------------------------------------------------
25
+
26
+ # fmt: off
27
+ _BIOT_TARGET_CHS_TUPLES: list[tuple[str, tuple[float, float, float]]] = [
28
+ ("FP1-F7", (-0.04984980, 0.06319570, -0.00920500)),
29
+ ("F7-T7", (-0.07721200, 0.01322780, -0.01038300)),
30
+ ("T7-P7", (-0.07829770, -0.04473570, -0.00591650)),
31
+ ("P7-O1", (-0.05092385, -0.09295085, 0.00317600)),
32
+ ("FP2-F8", (0.05145770, 0.06465880, -0.00954000)),
33
+ ("F8-T8", (0.07906150, 0.01470070, -0.01074500)),
34
+ ("T8-P8", (0.07906780, -0.04404430, -0.00601500)),
35
+ ("P8-O2", (0.05144915, -0.09261215, 0.00313000)),
36
+ ("FP1-F3", (-0.03984025, 0.06851415, 0.01760100)),
37
+ ("F3-C3", (-0.05780095, 0.02073975, 0.05327500)),
38
+ ("C3-P3", (-0.05918270, -0.04520975, 0.06014900)),
39
+ ("P3-O1", (-0.04121035, -0.09561840, 0.03238950)),
40
+ ("FP2-F4", (0.04085425, 0.06960035, 0.01686700)),
41
+ ("F4-C4", (0.05947705, 0.02170225, 0.05219700)),
42
+ ("C4-P4", (0.06139230, -0.04473025, 0.06007050)),
43
+ ("P4-O2", (0.04275465, -0.09535810, 0.03268050)),
44
+ ("C3-A2", (0.01021790, -0.01832050, -0.00183650)),
45
+ ("C4-A1", (-0.00947910, -0.01794500, -0.00220300)),
46
+ ]
47
+ # fmt: on
48
+
49
+ _BIOT_TARGET_CHS_INFO = [
50
+ {"ch_name": ch, "kind": "eeg", "loc": np.asarray(loc, dtype=float)}
51
+ for ch, loc in _BIOT_TARGET_CHS_TUPLES
52
+ ]
53
+ BIOT_CHANNEL_ORDER = [ch for ch, _ in _BIOT_TARGET_CHS_TUPLES]
54
+
10
55
 
11
56
  class BIOT(EEGModuleMixin, nn.Module):
12
57
  r"""BIOT from Yang et al (2023) [Yang2023]_
@@ -439,7 +484,9 @@ class _BIOTEncoder(nn.Module):
439
484
  self.channel_tokens = nn.Embedding(
440
485
  num_embeddings=n_chans, embedding_dim=emb_size
441
486
  )
442
- self.register_buffer("index", torch.arange(n_chans, dtype=torch.long))
487
+ self.register_buffer(
488
+ "index", torch.arange(n_chans, dtype=torch.long), persistent=False
489
+ )
443
490
 
444
491
  def stft(self, sample):
445
492
  """
@@ -553,3 +600,16 @@ class _BIOTEncoder(nn.Module):
553
600
  # (batch_size, emb)
554
601
  emb = self.transformer(emb).mean(dim=1)
555
602
  return emb
603
+
604
+
605
+ # -----------------------------------------------------------------------------
606
+ # InterpolatedBIOT — experimental channel-interpolation variant of BIOT
607
+ # -----------------------------------------------------------------------------
608
+ # Wraps :class:`BIOT` with an MNE-backed channel-interpolation layer that
609
+ # projects arbitrary user ``chs_info`` to the canonical 18-channel BIOT
610
+ # montage (:data:`_BIOT_TARGET_CHS_INFO`). Frozen by default; set
611
+ # ``trainable=True`` to fine-tune the projection matrix.
612
+
613
+ from braindecode.models.interpolated import InterpolatedModel # noqa: E402
614
+
615
+ InterpolatedBIOT = InterpolatedModel(BIOT, _BIOT_TARGET_CHS_INFO)