Braindecode 1.8.1.dev180519461__tar.gz → 1.8.1.dev180667301__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 (201) hide show
  1. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/NOTICE.txt +2 -11
  2. {braindecode-1.8.1.dev180519461/braindecode.egg-info → braindecode-1.8.1.dev180667301}/PKG-INFO +1 -1
  3. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/__init__.py +0 -11
  4. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/base.py +0 -16
  5. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/bendr.py +12 -14
  6. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/cbramod.py +9 -36
  7. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/deep4.py +4 -12
  8. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegdino.py +1 -4
  9. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/labram.py +9 -42
  10. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/luna.py +3 -23
  11. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/shallow_fbcsp.py +8 -15
  12. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/signal_jepa.py +1 -4
  13. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/summary.csv +0 -6
  14. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/util.py +0 -114
  15. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/zuna.py +3 -3
  16. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/__init__.py +0 -6
  17. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/convolution.py +9 -10
  18. braindecode-1.8.1.dev180667301/braindecode/version.py +1 -0
  19. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301/braindecode.egg-info}/PKG-INFO +1 -1
  20. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode.egg-info/SOURCES.txt +0 -7
  21. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/api.rst +0 -12
  22. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/whats_new.rst +0 -101
  23. braindecode-1.8.1.dev180519461/braindecode/models/brainomni.py +0 -1905
  24. braindecode-1.8.1.dev180519461/braindecode/models/csbrain.py +0 -758
  25. braindecode-1.8.1.dev180519461/braindecode/models/mapa.py +0 -851
  26. braindecode-1.8.1.dev180519461/braindecode/models/neurorvq.py +0 -648
  27. braindecode-1.8.1.dev180519461/braindecode/models/seizure_transformer.py +0 -407
  28. braindecode-1.8.1.dev180519461/braindecode/modules/channel_tokenizer.py +0 -215
  29. braindecode-1.8.1.dev180519461/braindecode/modules/quantization.py +0 -402
  30. braindecode-1.8.1.dev180519461/braindecode/version.py +0 -1
  31. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/LICENSE.txt +0 -0
  32. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/MANIFEST.in +0 -0
  33. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/README.rst +0 -0
  34. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/__init__.py +0 -0
  35. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/augmentation/__init__.py +0 -0
  36. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/augmentation/base.py +0 -0
  37. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/augmentation/functional.py +0 -0
  38. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/augmentation/transforms.py +0 -0
  39. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/classifier.py +0 -0
  40. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/__init__.py +0 -0
  41. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/_notebook_viewer.py +0 -0
  42. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/base.py +0 -0
  43. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bbci.py +0 -0
  44. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bcicomp.py +0 -0
  45. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/__init__.py +0 -0
  46. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/datasets.py +0 -0
  47. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/format.py +0 -0
  48. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/hub.py +0 -0
  49. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/hub_format.py +0 -0
  50. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/hub_io.py +0 -0
  51. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/hub_validation.py +0 -0
  52. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/bids/iterable.py +0 -0
  53. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/chb_mit.py +0 -0
  54. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/collate.py +0 -0
  55. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/mne.py +0 -0
  56. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/moabb.py +0 -0
  57. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/nmt.py +0 -0
  58. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/registry.py +0 -0
  59. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/siena.py +0 -0
  60. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  61. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/sleep_physionet.py +0 -0
  62. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/tuh.py +0 -0
  63. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/utils.py +0 -0
  64. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datasets/xy.py +0 -0
  65. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datautil/__init__.py +0 -0
  66. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datautil/channel_utils.py +0 -0
  67. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datautil/hub_formats.py +0 -0
  68. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datautil/serialization.py +0 -0
  69. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/datautil/util.py +0 -0
  70. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/eegneuralnet.py +0 -0
  71. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/functional/__init__.py +0 -0
  72. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/functional/_real_dft.py +0 -0
  73. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/functional/functions.py +0 -0
  74. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/functional/initialization.py +0 -0
  75. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/atcnet.py +0 -0
  76. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/attentionbasenet.py +0 -0
  77. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/attn_sleep.py +0 -0
  78. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/barista.py +0 -0
  79. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/biot.py +0 -0
  80. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/brainbert.py +0 -0
  81. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/brainmodule.py +0 -0
  82. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/brant.py +0 -0
  83. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/codebrain.py +0 -0
  84. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/config.py +0 -0
  85. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/contrawr.py +0 -0
  86. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/ctnet.py +0 -0
  87. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/dance.py +0 -0
  88. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/deepsleepnet.py +0 -0
  89. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/dgcnn.py +0 -0
  90. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/diver1.py +0 -0
  91. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegconformer.py +0 -0
  92. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eeginception_erp.py +0 -0
  93. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eeginception_mi.py +0 -0
  94. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegitnet.py +0 -0
  95. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegminer.py +0 -0
  96. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegnet.py +0 -0
  97. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegnex.py +0 -0
  98. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegpt.py +0 -0
  99. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegsimpleconv.py +0 -0
  100. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegsym.py +0 -0
  101. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/eegtcnet.py +0 -0
  102. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/emg2qwerty.py +0 -0
  103. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/fbcnet.py +0 -0
  104. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/fblightconvnet.py +0 -0
  105. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/fbmsnet.py +0 -0
  106. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/hybrid.py +0 -0
  107. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/ifnet.py +0 -0
  108. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/interpolated.py +0 -0
  109. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/medformer.py +0 -0
  110. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/meta_neuromotor.py +0 -0
  111. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/mirepnet.py +0 -0
  112. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/mscformer.py +0 -0
  113. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/msvtnet.py +0 -0
  114. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/mvpformer.py +0 -0
  115. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/neuropose.py +0 -0
  116. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/patchedtransformer.py +0 -0
  117. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/popt.py +0 -0
  118. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/reve.py +0 -0
  119. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sccnet.py +0 -0
  120. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sensingdynamics.py +0 -0
  121. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sinc_shallow.py +0 -0
  122. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
  123. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
  124. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sparcnet.py +0 -0
  125. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/sstdpn.py +0 -0
  126. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/steegformer.py +0 -0
  127. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/syncnet.py +0 -0
  128. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/tcformer.py +0 -0
  129. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/tcn.py +0 -0
  130. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/tidnet.py +0 -0
  131. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/tsinception.py +0 -0
  132. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/usleep.py +0 -0
  133. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/models/vemg2pose.py +0 -0
  134. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/activation.py +0 -0
  135. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/attention.py +0 -0
  136. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/blocks.py +0 -0
  137. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/dance_modules.py +0 -0
  138. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/filter.py +0 -0
  139. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/interpolation.py +0 -0
  140. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/layers.py +0 -0
  141. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/linear.py +0 -0
  142. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/parametrization.py +0 -0
  143. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/popt_modules.py +0 -0
  144. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/stats.py +0 -0
  145. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/util.py +0 -0
  146. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/modules/wrapper.py +0 -0
  147. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/preprocessing/__init__.py +0 -0
  148. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
  149. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/preprocessing/mne_preprocess.py +0 -0
  150. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/preprocessing/preprocess.py +0 -0
  151. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/preprocessing/util.py +0 -0
  152. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/preprocessing/windowers.py +0 -0
  153. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/regressor.py +0 -0
  154. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/samplers/__init__.py +0 -0
  155. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/samplers/base.py +0 -0
  156. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/samplers/ssl.py +0 -0
  157. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/training/__init__.py +0 -0
  158. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/training/callbacks.py +0 -0
  159. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/training/losses.py +0 -0
  160. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/training/scoring.py +0 -0
  161. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/util.py +0 -0
  162. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/__init__.py +0 -0
  163. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/activations.py +0 -0
  164. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/attribution.py +0 -0
  165. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/confusion_matrices.py +0 -0
  166. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/frequency.py +0 -0
  167. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/metrics.py +0 -0
  168. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/sanity.py +0 -0
  169. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode/visualization/topology.py +0 -0
  170. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode.egg-info/dependency_links.txt +0 -0
  171. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode.egg-info/requires.txt +0 -0
  172. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/braindecode.egg-info/top_level.txt +0 -0
  173. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/Makefile +0 -0
  174. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/_templates/autosummary/class.rst +0 -0
  175. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
  176. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/_templates/autosummary/function.rst +0 -0
  177. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
  178. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/agent_docs.rst +0 -0
  179. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/cite.rst +0 -0
  180. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/conf.py +0 -0
  181. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/help.rst +0 -0
  182. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/index.rst +0 -0
  183. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/install/install.rst +0 -0
  184. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/install/install_pip.rst +0 -0
  185. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/install/install_source.rst +0 -0
  186. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/attention.rst +0 -0
  187. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/channel.rst +0 -0
  188. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/convolution.rst +0 -0
  189. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/filterbank.rst +0 -0
  190. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/gnn.rst +0 -0
  191. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/interpretable.rst +0 -0
  192. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/lbm.rst +0 -0
  193. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/recurrent.rst +0 -0
  194. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/categorization/spd.rst +0 -0
  195. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/models.rst +0 -0
  196. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/models_categorization.rst +0 -0
  197. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/models_table.rst +0 -0
  198. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/models/models_visualization.rst +0 -0
  199. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/docs/sg_execution_times.rst +0 -0
  200. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/pyproject.toml +0 -0
  201. {braindecode-1.8.1.dev180519461 → braindecode-1.8.1.dev180667301}/setup.cfg +0 -0
@@ -14,7 +14,8 @@ The following components are licensed under the Creative Commons Attribution-Non
14
14
  - `braindecode/models/eegminer.py`
15
15
  - `braindecode/models/meta_neuromotor.py`
16
16
  - `braindecode/models/brainmodule.py`
17
- - `braindecode/models/neurorvq.py`
17
+
18
+ As well as class later imported into the `braindecode.models.module` named as GeneralizedGaussianFilter.
18
19
 
19
20
  The `meta_neuromotor.py` file is a derivative of
20
21
  `facebookresearch/generic-neuromotor-interface`, released by Meta Platforms,
@@ -44,15 +45,6 @@ The following components are licensed under the MIT License:
44
45
  - `braindecode/models/mirepnet.py`
45
46
  - `braindecode/models/popt.py`
46
47
  - `braindecode/modules/popt_modules.py`
47
- - `braindecode/models/brainomni.py`
48
- - `braindecode/modules/quantization.py`
49
- - `braindecode/models/seizure_transformer.py`
50
- - `docs/_static/model/seizure_transformer_arch.png`
51
-
52
- The `brainomni.py` file is a derivative of `OpenTSLab/BrainOmni` (MIT), whose
53
- SEANet codec derives from Meta's `facebookresearch/encodec` (MIT). The
54
- `quantization.py` module holds the residual vector quantization derived from
55
- `lucidrains/vector-quantize-pytorch` (MIT) and the BrainOmni port.
56
48
 
57
49
  ### Apache-2.0 Licensed Files
58
50
 
@@ -61,7 +53,6 @@ The following components are licensed under the Apache License 2.0:
61
53
  - `braindecode/models/mvpformer.py`
62
54
  - `braindecode/models/zuna.py`
63
55
  - `braindecode/models/luna.py`
64
- - `braindecode/models/mapa.py`
65
56
  - `braindecode/models/brant.py`
66
57
  - `braindecode/models/diver1.py`
67
58
  - `braindecode/models/mscformer.py`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.8.1.dev180519461
3
+ Version: 1.8.1.dev180667301
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>
@@ -9,12 +9,10 @@ from .bendr import BENDR, InterpolatedBENDR
9
9
  from .biot import BIOT, InterpolatedBIOT
10
10
  from .brainbert import BrainBERT
11
11
  from .brainmodule import BrainModule
12
- from .brainomni import BrainOmni, BrainTokenizer
13
12
  from .brant import Brant
14
13
  from .cbramod import CBraMod
15
14
  from .codebrain import CodeBrain
16
15
  from .contrawr import ContraWR
17
- from .csbrain import CSBrain
18
16
  from .ctnet import CTNet
19
17
  from .dance import DANCE
20
18
  from .deep4 import Deep4Net
@@ -42,7 +40,6 @@ from .ifnet import IFNet
42
40
  from .interpolated import InterpolatedModel
43
41
  from .labram import InterpolatedLaBraM, Labram
44
42
  from .luna import LUNA
45
- from .mapa import MAPA
46
43
  from .medformer import MEDFormer
47
44
  from .meta_neuromotor import MetaNeuromotorHand
48
45
  from .mirepnet import MIRepNet
@@ -50,12 +47,10 @@ from .mscformer import MSCFormer
50
47
  from .msvtnet import MSVTNet
51
48
  from .mvpformer import MVPFormer
52
49
  from .neuropose import NeuroPose
53
- from .neurorvq import NeuroRVQ
54
50
  from .patchedtransformer import PBT
55
51
  from .popt import PopulationTransformer
56
52
  from .reve import REVE
57
53
  from .sccnet import SCCNet
58
- from .seizure_transformer import SeizureTransformer
59
54
  from .sensingdynamics import SensingDynamics
60
55
  from .shallow_fbcsp import ShallowFBCSPNet
61
56
  from .signal_jepa import (
@@ -101,12 +96,9 @@ __all__ = [
101
96
  "BIOT",
102
97
  "BENDR",
103
98
  "BrainBERT",
104
- "BrainOmni",
105
- "BrainTokenizer",
106
99
  "CBraMod",
107
100
  "CodeBrain",
108
101
  "ContraWR",
109
- "CSBrain",
110
102
  "CTNet",
111
103
  "DANCE",
112
104
  "Deep4Net",
@@ -147,10 +139,8 @@ __all__ = [
147
139
  "LUNA",
148
140
  "extract_channel_locations_from_chs_info",
149
141
  "positions_from_chs_info",
150
- "MAPA",
151
142
  "MEDFormer",
152
143
  "MIRepNet",
153
- "NeuroRVQ",
154
144
  "MSCFormer",
155
145
  "MSVTNet",
156
146
  "MVPFormer",
@@ -158,7 +148,6 @@ __all__ = [
158
148
  "PopulationTransformer",
159
149
  "REVE",
160
150
  "SCCNet",
161
- "SeizureTransformer",
162
151
  "ShallowFBCSPNet",
163
152
  "SignalJEPA",
164
153
  "SignalJEPA_Contextual",
@@ -779,22 +779,6 @@ class EEGModuleMixin(_BaseHubMixin, metaclass=_BraindecodeDocstringMeta):
779
779
 
780
780
  if HAS_HF_HUB:
781
781
 
782
- @classmethod
783
- def from_pretrained(cls, *args, **kwargs):
784
- # The Hub mixin fills omitted __init__ args from config.json; pin the
785
- # derived geometry arg so it cannot clash with the caller's one
786
- # (e.g. caller chs_info vs saved n_chans) in __init__'s checks.
787
- if "chs_info" in kwargs and "n_chans" not in kwargs:
788
- chs_info = kwargs["chs_info"]
789
- kwargs["n_chans"] = None if chs_info is None else len(chs_info)
790
- elif "n_chans" in kwargs and "chs_info" not in kwargs:
791
- kwargs["chs_info"] = None
792
- if ("n_times" in kwargs or "sfreq" in kwargs) and (
793
- "input_window_seconds" not in kwargs
794
- ):
795
- kwargs["input_window_seconds"] = None
796
- return super().from_pretrained(*args, **kwargs)
797
-
798
782
  @classmethod
799
783
  def _from_pretrained(
800
784
  cls,
@@ -11,7 +11,6 @@ from einops.layers.torch import Rearrange
11
11
  from torch import nn
12
12
 
13
13
  from braindecode.models.base import EEGModuleMixin
14
- from braindecode.modules.channel_tokenizer import ChannelTokenizer
15
14
 
16
15
  # The 20 channels used to pre-train BENDR, in the order expected by the
17
16
  # `braindecode/braindecode-bendr` checkpoint. The first 19 entries are the
@@ -289,25 +288,26 @@ class BENDR(EEGModuleMixin, nn.Module):
289
288
  # Keep these parameters if needed later, otherwise they are captured by the mixin
290
289
  del n_outputs, n_chans, chs_info, n_times, input_window_seconds, sfreq
291
290
 
292
- # No chs_info (incl. from_pretrained) or the canonical order: no
293
- # tokenizer, so released checkpoints stay bit-identical. Any other
294
- # montage is projected onto the 20 canonical channels.
291
+ # If the user supplies chs_info, require it to match BENDR_CHANNEL_ORDER
292
+ # exactly (case-insensitive). Arbitrary channel sets should go through
293
+ # InterpolatedBENDR — same pattern as Labram / InterpolatedLaBraM.
294
+ # When chs_info is absent (the usual n_chans=20 path, incl.
295
+ # from_pretrained), no check is performed.
295
296
  try:
296
297
  _chs_info = self.chs_info
297
298
  except ValueError:
298
299
  _chs_info = None
299
- self.channel_tokenizer = None
300
- backbone_n_chans = self.n_chans
301
300
  if _chs_info is not None:
302
301
  user_names = [ch["ch_name"] for ch in _chs_info] # type: ignore[index]
303
302
  canonical = BENDR_CHANNEL_ORDER
304
303
  if [n.lower() for n in user_names] != [n.lower() for n in canonical]:
305
- self.channel_tokenizer = ChannelTokenizer(
306
- strategy="fixed_order",
307
- src_chs_info=_chs_info,
308
- target_chs_info=_BENDR_TARGET_CHS_INFO,
304
+ raise ValueError(
305
+ f"BENDR requires chs_info to match BENDR_CHANNEL_ORDER exactly "
306
+ f"({len(canonical)} channels, specific order; last is 'SCALE'). "
307
+ f"Got {len(user_names)} channel(s). For arbitrary channel sets, "
308
+ f"use InterpolatedBENDR "
309
+ f"(from braindecode.models import InterpolatedBENDR)."
309
310
  )
310
- backbone_n_chans = len(_BENDR_TARGET_CHS_INFO)
311
311
 
312
312
  self.encoder_h = encoder_h
313
313
  self.contextualizer_hidden = contextualizer_hidden
@@ -315,7 +315,7 @@ class BENDR(EEGModuleMixin, nn.Module):
315
315
  self.encoder_only = encoder_only
316
316
 
317
317
  self.encoder = _ConvEncoderBENDR(
318
- in_features=backbone_n_chans,
318
+ in_features=self.n_chans,
319
319
  encoder_h=encoder_h,
320
320
  dropout=drop_prob,
321
321
  projection_head=projection_head,
@@ -361,8 +361,6 @@ class BENDR(EEGModuleMixin, nn.Module):
361
361
  self._build_head(n_outputs)
362
362
 
363
363
  def forward(self, x, return_features=False):
364
- if self.channel_tokenizer is not None:
365
- x = self.channel_tokenizer(x)
366
364
  encoded = self.encoder(x)
367
365
  # encoded: [batch_size, encoder_h, n_encoded_times]
368
366
 
@@ -11,11 +11,11 @@ from typing import Optional, Sequence
11
11
 
12
12
  import torch
13
13
  from einops import rearrange
14
+ from einops.layers.torch import Rearrange
14
15
  from torch import Tensor, nn
15
16
 
16
17
  from braindecode.models.base import EEGModuleMixin
17
18
  from braindecode.modules import CrissCrossTransformerEncoderLayer
18
- from braindecode.modules.blocks import PatchTokenizer
19
19
 
20
20
  logger = logging.getLogger(__name__)
21
21
 
@@ -123,9 +123,6 @@ class CBraMod(EEGModuleMixin, nn.Module):
123
123
 
124
124
  Parameters
125
125
  ----------
126
- on_non_divisible : {"pad", "crop", "error"}, default="pad"
127
- How :class:`~braindecode.modules.PatchTokenizer` treats a time axis that
128
- is not a multiple of ``patch_size`` (right zero-pad, crop, or raise).
129
126
  patch_size : int, default=200
130
127
  Temporal patch size in samples (200 samples = 1 second at 200 Hz).
131
128
  dim_feedforward : int, default=800
@@ -162,7 +159,6 @@ class CBraMod(EEGModuleMixin, nn.Module):
162
159
  input_window_seconds=None,
163
160
  sfreq=None,
164
161
  patch_size: int = 200,
165
- on_non_divisible: str = "pad",
166
162
  dim_feedforward: int = 800,
167
163
  n_layer: int = 12,
168
164
  nhead: int = 8,
@@ -187,18 +183,10 @@ class CBraMod(EEGModuleMixin, nn.Module):
187
183
  sfreq=sfreq,
188
184
  )
189
185
  del n_chans, chs_info, n_times, input_window_seconds, sfreq, n_outputs
190
- # Shared tokenizer: (batch, n_chans, n_times) -> (batch, n_chans, n_patch, patch_size),
191
- # padding/cropping a non-divisible time axis at forward time.
192
- try:
193
- tokenizer_n_times = self.n_times
194
- except ValueError: # unknown length: nothing to check at construction
195
- tokenizer_n_times = patch_size
196
- self.rearrange = PatchTokenizer(
186
+ self.rearrange = Rearrange(
187
+ "batch n_chans (n_patch patch_size) -> batch n_chans n_patch patch_size",
197
188
  patch_size=patch_size,
198
- n_times=tokenizer_n_times,
199
- on_non_divisible=on_non_divisible,
200
189
  )
201
- self._on_non_divisible = on_non_divisible
202
190
  self.patch_embedding = _PatchEmbedding(
203
191
  patch_size,
204
192
  channels_kernel_stride_padding_norm,
@@ -223,9 +211,9 @@ class CBraMod(EEGModuleMixin, nn.Module):
223
211
 
224
212
  if return_encoder_output:
225
213
  self.final_layer = nn.Identity()
226
- elif self._knows_geometry():
227
- n_patch = self._n_patch()
228
- flat_dim = self.n_chans * n_patch * emb_dim
214
+ elif self._n_times is not None and self._n_chans is not None:
215
+ n_patch = self._n_times // patch_size
216
+ flat_dim = self._n_chans * n_patch * emb_dim
229
217
  self.final_layer = nn.Sequential(
230
218
  nn.Flatten(), nn.Linear(flat_dim, self.n_outputs)
231
219
  )
@@ -239,30 +227,15 @@ class CBraMod(EEGModuleMixin, nn.Module):
239
227
  self._update_init_kwargs(n_outputs=n_outputs)
240
228
  # A head implies a classifier, also when built with return_encoder_output.
241
229
  self._update_init_kwargs(return_encoder_output=False)
242
- if self._knows_geometry():
243
- n_patch = self._n_patch()
244
- flat_dim = self.n_chans * n_patch * self._emb_dim
230
+ if self._n_times is not None and self._n_chans is not None:
231
+ n_patch = self._n_times // self._patch_size
232
+ flat_dim = self._n_chans * n_patch * self._emb_dim
245
233
  self.final_layer = nn.Sequential(
246
234
  nn.Flatten(), nn.Linear(flat_dim, n_outputs)
247
235
  )
248
236
  else:
249
237
  self.final_layer = nn.Sequential(nn.Flatten(), nn.LazyLinear(n_outputs))
250
238
 
251
- def _knows_geometry(self):
252
- """True when n_chans and n_times are known (given or derivable), so the
253
- head can be a real Linear instead of a LazyLinear that cannot be saved
254
- or loaded before a forward pass."""
255
- try:
256
- self.n_chans, self.n_times
257
- except ValueError:
258
- return False
259
- return True
260
-
261
- def _n_patch(self):
262
- if self._on_non_divisible == "pad":
263
- return -(-self.n_times // self._patch_size)
264
- return self.n_times // self._patch_size
265
-
266
239
  def _weights_init(self):
267
240
  for m in self.modules():
268
241
  if isinstance(m, nn.Linear):
@@ -162,18 +162,10 @@ class Deep4Net(EEGModuleMixin, nn.Sequential):
162
162
  self.stride_before_pool = stride_before_pool
163
163
 
164
164
  min_n_times = self._get_min_n_times()
165
- resolved_n_times = self._n_times
166
- if (
167
- resolved_n_times is None
168
- and self._input_window_seconds is not None
169
- and self._sfreq is not None
170
- ):
171
- resolved_n_times = round(self._input_window_seconds * self._sfreq)
172
-
173
- if resolved_n_times is not None and resolved_n_times < min_n_times:
174
- scaling_factor = resolved_n_times / min_n_times
165
+ if self.n_times < min_n_times:
166
+ scaling_factor = self.n_times / min_n_times
175
167
  warn(
176
- f"n_times ({resolved_n_times}) is smaller than the minimum required "
168
+ f"n_times ({self.n_times}) is smaller than the minimum required "
177
169
  f"({min_n_times}) for the current model parameters configuration. "
178
170
  "Adjusting parameters to ensure compatibility."
179
171
  "Reducing the kernel, pooling, and stride sizes accordingly."
@@ -225,7 +217,7 @@ class Deep4Net(EEGModuleMixin, nn.Sequential):
225
217
  in_chans=self.n_chans,
226
218
  n_filters_time=self.n_filters_time,
227
219
  n_filters_spat=self.n_filters_spat,
228
- filter_time_length=self.filter_time_length,
220
+ filter_time_length=filter_time_length,
229
221
  bias_time=True,
230
222
  bias_spat=not self.batch_norm,
231
223
  stride=(conv_stride, 1),
@@ -477,10 +477,7 @@ class _Attention(nn.Module):
477
477
 
478
478
  def forward(self, x):
479
479
  bias = torch.cat((self.q_bias, torch.zeros_like(self.v_bias), self.v_bias))
480
- # Call the ``qkv`` module rather than ``F.linear`` on its weight, so
481
- # hooks and adapters attached to it (e.g. LoRA) take part in the forward.
482
- qkv = self.qkv(x)
483
- qkv = qkv + bias.to(qkv.dtype) # keep autocast dtype
480
+ qkv = F.linear(x, self.qkv.weight, bias)
484
481
  batch, tokens, _ = qkv.shape
485
482
  query, key, value = (
486
483
  qkv.reshape(batch, tokens, 3, self.nhead, -1)
@@ -19,7 +19,6 @@ from torch.nn.init import trunc_normal_
19
19
  from braindecode.functional import rescale_parameter
20
20
  from braindecode.models.base import EEGModuleMixin
21
21
  from braindecode.modules import MLP, DropPath
22
- from braindecode.modules.blocks import PatchTokenizer
23
22
 
24
23
  # -----------------------------------------------------------------------------
25
24
  # Standard 10-20 system electrode positions used by LaBraM for position embeddings.
@@ -285,10 +284,6 @@ class Labram(EEGModuleMixin, nn.Module):
285
284
 
286
285
  Parameters
287
286
  ----------
288
- on_non_divisible : {"pad", "crop", "error"}, default="pad"
289
- How :class:`~braindecode.modules.PatchTokenizer` treats a time axis that
290
- is not a multiple of ``patch_size``: right-pad with zeros (default),
291
- crop the trailing samples, or raise.
292
287
  patch_size : int
293
288
  The size of the patch to be used in the patch embedding.
294
289
  learned_patcher : bool
@@ -372,7 +367,6 @@ class Labram(EEGModuleMixin, nn.Module):
372
367
  input_window_seconds=None,
373
368
  patch_size=200,
374
369
  learned_patcher=False,
375
- on_non_divisible="pad",
376
370
  embed_dim=200,
377
371
  conv_in_channels=1,
378
372
  conv_out_channels=8,
@@ -437,12 +431,7 @@ class Labram(EEGModuleMixin, nn.Module):
437
431
  self.embed_dim = None
438
432
  else:
439
433
  self.patch_size = patch_size
440
- self.on_non_divisible = on_non_divisible
441
- self.n_path = (
442
- -(-self.n_times // self.patch_size)
443
- if on_non_divisible == "pad"
444
- else self.n_times // self.patch_size
445
- )
434
+ self.n_path = self.n_times // self.patch_size
446
435
 
447
436
  if neural_tokenizer and conv_in_channels != 1:
448
437
  warn(
@@ -467,7 +456,6 @@ class Labram(EEGModuleMixin, nn.Module):
467
456
  n_chans=self.n_chans,
468
457
  emb_dim=self.patch_size,
469
458
  learned_patcher=learned_patcher,
470
- on_non_divisible=on_non_divisible,
471
459
  ),
472
460
  ),
473
461
  (
@@ -1018,28 +1006,13 @@ class _SegmentPatch(nn.Module):
1018
1006
  """
1019
1007
 
1020
1008
  def __init__(
1021
- self,
1022
- n_times=2000,
1023
- patch_size=200,
1024
- n_chans=1,
1025
- emb_dim=200,
1026
- learned_patcher=True,
1027
- on_non_divisible="pad",
1009
+ self, n_times=2000, patch_size=200, n_chans=1, emb_dim=200, learned_patcher=True
1028
1010
  ):
1029
1011
  super().__init__()
1030
1012
 
1031
1013
  self.n_times = n_times
1032
1014
  self.patch_size = patch_size
1033
- # Single place that pads/crops/rejects a non-divisible time axis
1034
- # (no parameters, so checkpoints are unaffected).
1035
- self.tokenizer = PatchTokenizer(
1036
- patch_size=patch_size, n_times=n_times, on_non_divisible=on_non_divisible
1037
- )
1038
- self.n_patchs = (
1039
- -(-n_times // patch_size)
1040
- if on_non_divisible == "pad"
1041
- else n_times // patch_size
1042
- )
1015
+ self.n_patchs = n_times // patch_size
1043
1016
  self.emb_dim = emb_dim
1044
1017
  self.n_chans = n_chans
1045
1018
  self.learned_patcher = learned_patcher
@@ -1069,7 +1042,6 @@ class _SegmentPatch(nn.Module):
1069
1042
  X_patch: Tensor
1070
1043
  [batch, n_chans, n_times//patch_size, patch_size]
1071
1044
  """
1072
- x = self.tokenizer._prepare_input(x)
1073
1045
  batch_size, n_chans_actual, n_times_actual = x.shape
1074
1046
  # Input shape: [batch, n_chs, n_times]
1075
1047
 
@@ -1131,12 +1103,7 @@ class _PatchEmbed(nn.Module):
1131
1103
  """
1132
1104
 
1133
1105
  def __init__(
1134
- self,
1135
- n_times=2000,
1136
- patch_size=200,
1137
- in_channels=1,
1138
- emb_dim=200,
1139
- n_codebooks=62,
1106
+ self, n_times=2000, patch_size=200, in_channels=1, emb_dim=200, n_codebooks=62
1140
1107
  ):
1141
1108
  super().__init__()
1142
1109
  self.n_times = n_times
@@ -1188,6 +1155,10 @@ class _PatchEmbed(nn.Module):
1188
1155
  "4D (batch, channels, n_patches, patch_size)."
1189
1156
  )
1190
1157
 
1158
+ if n_times % self.patch_size != 0:
1159
+ raise ValueError(
1160
+ f"n_times ({n_times}) must be divisible by patch_size ({self.patch_size})."
1161
+ )
1191
1162
  if n_channels % self.in_channels != 0:
1192
1163
  raise ValueError(
1193
1164
  "The input channel dimension "
@@ -1366,11 +1337,7 @@ class _Attention(nn.Module):
1366
1337
  self.v_bias,
1367
1338
  )
1368
1339
  )
1369
- # Call the ``qkv`` module rather than ``linear`` on its weight, so hooks
1370
- # and adapters attached to it (e.g. LoRA) take part in the forward.
1371
- qkv = self.qkv(x)
1372
- if qkv_bias is not None:
1373
- qkv = qkv + qkv_bias.to(qkv.dtype) # keep autocast dtype
1340
+ qkv = nn.functional.linear(input=x, weight=self.qkv.weight, bias=qkv_bias)
1374
1341
  qkv = qkv.reshape(B, N, 3, self.num_heads, -1).permute(2, 0, 3, 1, 4)
1375
1342
  q, k, v = (
1376
1343
  qkv[0],
@@ -25,7 +25,6 @@ from einops import rearrange
25
25
  from braindecode.functional import rotate_pairs
26
26
  from braindecode.models.base import EEGModuleMixin
27
27
  from braindecode.models.util import extract_channel_locations_from_chs_info
28
- from braindecode.modules.blocks import PatchTokenizer
29
28
  from braindecode.modules.layers import DropPath
30
29
 
31
30
 
@@ -90,9 +89,6 @@ class LUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
90
89
 
91
90
  Parameters
92
91
  ----------
93
- on_non_divisible : {"pad", "crop", "error"}, default="pad"
94
- How :class:`~braindecode.modules.PatchTokenizer` treats a time axis that
95
- is not a multiple of ``patch_size`` (right zero-pad, crop, or raise).
96
92
  patch_size : int
97
93
  Number of time samples per patch. Default: 40.
98
94
  num_queries : int
@@ -133,7 +129,6 @@ class LUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
133
129
  input_window_seconds: Optional[float] = None,
134
130
  # Model-specific parameters
135
131
  patch_size: int = 40,
136
- on_non_divisible: str = "pad",
137
132
  num_queries: int = 4,
138
133
  embed_dim: int = 64,
139
134
  depth: int = 8,
@@ -171,11 +166,6 @@ class LUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
171
166
  self.embed_dim = embed_dim
172
167
  self.num_queries = num_queries
173
168
  self.patch_size = patch_size
174
- self.tokenizer = PatchTokenizer(
175
- patch_size=patch_size,
176
- n_times=self.n_times if self._n_times is not None else patch_size,
177
- on_non_divisible=on_non_divisible,
178
- )
179
169
  self.patch_embed_size = embed_dim
180
170
  self.num_heads = num_heads
181
171
  self.depth = depth
@@ -187,9 +177,7 @@ class LUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
187
177
 
188
178
  # Layers
189
179
  self.patch_embed = _PatchEmbedNetwork(
190
- embed_dim=self.embed_dim,
191
- patch_size=self.patch_size,
192
- on_non_divisible=on_non_divisible,
180
+ embed_dim=self.embed_dim, patch_size=self.patch_size
193
181
  )
194
182
  self.freq_embed = _FrequencyFeatureEmbedder(
195
183
  embed_dim=self.embed_dim, patch_size=self.patch_size
@@ -281,9 +269,6 @@ class LUNA(EEGModuleMixin, nn.Module, license="apache-2.0"):
281
269
  mask: Optional[torch.Tensor] = None,
282
270
  ) -> Tuple[torch.Tensor, torch.Tensor]:
283
271
  num_channels = channel_locations.shape[1]
284
- x_signal = self.tokenizer._prepare_input(x_signal)
285
- if mask is not None:
286
- mask = self.tokenizer._prepare_input(mask)
287
272
  num_patches_per_channel = x_signal.shape[-1] // self.patch_size
288
273
  x_patched = self.patch_embed(x_signal)
289
274
  freq_embed = self.freq_embed(x_signal)
@@ -843,15 +828,10 @@ class _CrossAttentionBlock(nn.Module):
843
828
 
844
829
 
845
830
  class _PatchEmbedNetwork(nn.Module):
846
- def __init__(
847
- self, embed_dim: int = 64, patch_size: int = 40, on_non_divisible: str = "pad"
848
- ) -> None:
831
+ def __init__(self, embed_dim: int = 64, patch_size: int = 40) -> None:
849
832
  super().__init__()
850
833
  self.patch_size = patch_size
851
834
  self.embed_dim = embed_dim
852
- self.tokenizer = PatchTokenizer(
853
- patch_size=patch_size, n_times=patch_size, on_non_divisible=on_non_divisible
854
- )
855
835
  self.in_channels = 1
856
836
  self.out_channels = int(embed_dim // 4)
857
837
  self.groups = 4
@@ -891,7 +871,7 @@ class _PatchEmbedNetwork(nn.Module):
891
871
  x: (B, C, T)
892
872
  output: (B, C*S, D) where S = T//patch_size, D = embed_dim
893
873
  """
894
- x = rearrange(self.tokenizer(x), "B C S P -> B (C S) P")
874
+ x = rearrange(x, "B C (S P) -> B (C S) P", P=self.patch_size)
895
875
  x = x.unsqueeze(1)
896
876
  x = self.proj_in(x)
897
877
  x = rearrange(x, "B E CS D -> B CS (D E)")
@@ -124,18 +124,13 @@ class ShallowFBCSPNet(EEGModuleMixin, nn.Sequential):
124
124
  self.drop_prob = drop_prob
125
125
 
126
126
  self.mapping = {
127
+ "conv_time.weight": "conv_time_spat.conv_time.weight",
128
+ "conv_spat.weight": "conv_time_spat.conv_spat.weight",
129
+ "conv_time.bias": "conv_time_spat.conv_time.bias",
130
+ "conv_spat.bias": "conv_time_spat.conv_spat.bias",
127
131
  "conv_classifier.weight": "final_layer.conv_classifier.weight",
128
132
  "conv_classifier.bias": "final_layer.conv_classifier.bias",
129
133
  }
130
- if self.split_first_layer:
131
- self.mapping.update(
132
- {
133
- "conv_time.weight": "conv_time_spat.conv_time.weight",
134
- "conv_spat.weight": "conv_time_spat.conv_spat.weight",
135
- "conv_time.bias": "conv_time_spat.conv_time.bias",
136
- "conv_spat.bias": "conv_time_spat.conv_spat.bias",
137
- }
138
- )
139
134
 
140
135
  self.add_module("ensuredims", Ensure4d())
141
136
  pool_class = dict(max=nn.MaxPool2d, mean=nn.AvgPool2d)[self.pool_mode]
@@ -208,16 +203,14 @@ class ShallowFBCSPNet(EEGModuleMixin, nn.Sequential):
208
203
  self.add_module("final_layer", module)
209
204
 
210
205
  # Initialization, xavier is same as in paper...
211
- if self.split_first_layer:
212
- init.xavier_uniform_(self.conv_time_spat.conv_time.weight, gain=1)
206
+ init.xavier_uniform_(self.conv_time_spat.conv_time.weight, gain=1)
207
+ # maybe no bias in case of no split layer and batch norm
208
+ if self.split_first_layer or (not self.batch_norm):
213
209
  init.constant_(self.conv_time_spat.conv_time.bias, 0)
210
+ if self.split_first_layer:
214
211
  init.xavier_uniform_(self.conv_time_spat.conv_spat.weight, gain=1)
215
212
  if not self.batch_norm:
216
213
  init.constant_(self.conv_time_spat.conv_spat.bias, 0)
217
- else:
218
- init.xavier_uniform_(self.conv_time.weight, gain=1)
219
- if not self.batch_norm:
220
- init.constant_(self.conv_time.bias, 0)
221
214
  if self.batch_norm:
222
215
  init.constant_(self.bnorm.weight, 1)
223
216
  init.constant_(self.bnorm.bias, 0)
@@ -1593,10 +1593,7 @@ def _pos_encode_contineous(
1593
1593
  (1 - torch.arange(0, n_dim, 2, device=device) / n_dim) * 2 * math.pi
1594
1594
  )
1595
1595
  pos_encoding = torch.empty((n_dim,), dtype=torch.float32, device=device)
1596
- # Zero span when every ``loc`` is zero (names without positions): encode
1597
- # xx = 0 instead of the NaN of 0/0.
1598
- span = x_max - x_min
1599
- xx = (x - x_min) / span if span != 0 else 0.0
1596
+ xx = (x - x_min) / (x_max - x_min)
1600
1597
  pos_encoding[0::2] = torch.sin(xx * div_term)
1601
1598
  pos_encoding[1::2] = torch.cos(xx * div_term)
1602
1599
  return pos_encoding
@@ -7,7 +7,6 @@ BIOT,"Sleep Staging, Epilepsy",Prediction,200,"n_chans, n_outputs",3183879,"BIOT
7
7
  BrainBERT,General,"Prediction, Embedding",2048,"n_chans, n_outputs, n_times",603269,"BrainBERT(n_chans=2, n_outputs=5, n_times=2048)","Foundation Model,Attention/Transformer",iEEG
8
8
  CBraMod,General,"Prediction, Embedding",200,"n_outputs",4924000,"CBraMod(n_outputs=2)","Foundation Model",EEG
9
9
  CodeBrain,General,"Prediction, Embedding",200,"n_chans, n_outputs, n_times",15238802,"CodeBrain(n_chans=19, n_outputs=2, n_times=6000)","Foundation Model,Attention/Transformer",EEG
10
- CSBrain,General,"Prediction, Embedding",200,"n_outputs",10962402,"CSBrain(n_outputs=2)","Foundation Model,Attention/Transformer",EEG
11
10
  ContraWR,Sleep Staging,"Prediction, Embedding",125,"n_chans, n_outputs, sfreq",1160165,"ContraWR(n_chans=2, n_outputs=5, n_times=3750, emb_size=256, sfreq=125)",Convolution,EEG
12
11
  CTNet,Motor Imagery,Prediction,250,"n_chans, n_outputs, n_times",26900,"CTNet(n_chans=22, n_outputs=4, n_times=1000, n_filters_time=8, kernel_size=16, num_heads=2, embed_dim=16)","Convolution,Attention/Transformer",EEG
13
12
  Deep4Net,General,Prediction,250,"n_chans, n_outputs, n_times",282879,"Deep4Net(n_chans=22, n_outputs=4, n_times=1000)","Convolution",EEG
@@ -57,7 +56,6 @@ PopulationTransformer,General,"Prediction, Embedding",2048,"n_chans, n_outputs,
57
56
  SSTDPN,Motor Imagery,Prediction,250,"n_chans, n_outputs, n_times",19502,"SSTDPN(n_chans=22, n_outputs=4, n_times=1000)","Convolution,Attention/Transformer",EEG
58
57
  BENDR,General,"Prediction, Embedding",250,"n_chans, n_times, n_outputs",157141049,"BENDR(n_chans=22, n_outputs=4, n_times=1000)","Foundation Model,Convolution",EEG
59
58
  LUNA,General,"Prediction, Embedding",128,"n_chans, n_times, sfreq, chs_info",7100731,"LUNA(n_chans=22, n_times=512, sfreq=128)","Convolution,Channel,Foundation Model",EEG
60
- MAPA,General,"Prediction, Embedding",2048,"chs_info, n_outputs, n_times",21341572,"MAPA(chs_info=<user>, n_outputs=4, n_times=2048, sfreq=2048)","Attention/Transformer,Foundation Model,Channel",iEEG
61
59
  MEDFormer,General,Prediction,250,"n_chans, n_outputs, n_times",5313924,"MEDFormer(n_chans=22, n_outputs=4, n_times=1000)","Foundation Model,Convolution",EEG
62
60
  REVE,General,Prediction,200,"n_outputs, n_times, n_chans",69481476,"REVE(n_times=1000, n_outputs=4, n_chans=19)","Foundation Model,Attention/Transformer",EEG
63
61
  DGCNN,Emotion Recognition,Prediction,128,"n_chans, n_outputs, n_times, chs_info",1037385,"DGCNN(n_chans=62, n_outputs=4, n_times=128)","Graph Neural Network,Channel",EEG
@@ -67,8 +65,6 @@ InterpolatedBIOT,"Sleep Staging, Epilepsy",Prediction,200,"chs_info, n_outputs,
67
65
  InterpolatedEEGPT,General,Prediction,256,"chs_info, n_outputs, n_times",25323137,"InterpolatedEEGPT(chs_info=<user>, n_outputs=4, n_times=1024)","Foundation Model,Attention/Transformer,Channel",EEG
68
66
  InterpolatedLaBraM,General,"Prediction, Embedding",200,"chs_info, n_outputs, n_times",5866196,"InterpolatedLaBraM(chs_info=<user>, n_outputs=4, n_times=1000)","Convolution,Foundation Model,Channel",EEG
69
67
  InterpolatedSignalJEPA,"Motor Imagery, ERP, SSVEP",Embedding,128,"chs_info",3456882,"InterpolatedSignalJEPA(chs_info=<user>)","Convolution,Channel,Foundation Model",EEG
70
- BrainOmni,General,"Prediction, Embedding",256,"chs_info, n_outputs, n_times, sfreq",13998310,"BrainOmni(chs_info=chs_info, n_outputs=4, n_times=1024, sfreq=256.0)","Foundation Model,Attention/Transformer","EEG, MEG"
71
- BrainTokenizer,General,Embedding,256,"chs_info, n_times, sfreq",5050338,"BrainTokenizer(chs_info=chs_info, n_times=1024, sfreq=256.0)","Foundation Model","EEG, MEG"
72
68
  TCFormer,Motor Imagery,Classification,250,"n_chans, n_outputs, n_times",77820,"TCFormer(n_chans=22, n_outputs=4, n_times=1000)","Convolution,Attention/Transformer",EEG
73
69
  EEGDINO,General,Classification,200,"n_chans, n_outputs, n_times",4539698,"EEGDINO(n_chans=19, n_outputs=4, n_times=1000)","Foundation Model,Attention/Transformer",EEG
74
70
  DANCE,General,Event Detection,200,"n_chans, n_outputs, n_times, sfreq, chs_info",29813542,"DANCE(n_chans=19, n_outputs=4, n_times=6400, sfreq=200, input_window_seconds=32.0, chs_info=[{'ch_name': f'E{i+1}', 'kind': 'eeg', 'loc': numpy.random.default_rng(2024).random(12)} for i in range(19)])","Convolution,Attention/Transformer,Channel",EEG
@@ -76,5 +72,3 @@ STEEGFormer,General,Classification,250,"n_chans, n_outputs, n_times",25305604,"S
76
72
  MVPFormer,General,"Prediction, Embedding",512,"n_chans, n_outputs, n_times, sfreq",3356978,"MVPFormer(n_chans=22, n_outputs=4, n_times=2000, sfreq=100)","Foundation Model,Attention/Transformer",EEG
77
73
  ZUNA,General,"Classification,Embedding",256,"chs_info, n_outputs, n_times",172104100,"ZUNA(chs_info=<user>, n_outputs=4, n_times=1280)","Foundation Model,Channel,Attention/Transformer",EEG
78
74
  MIRepNet,Motor Imagery,"Prediction, Embedding",250,"n_chans, n_outputs",5143300,"MIRepNet(n_chans=45, n_outputs=4, n_times=1000)","Convolution,Attention/Transformer,Foundation Model",EEG
79
- NeuroRVQ,General,"Prediction, Embedding",200,"n_chans, n_outputs, n_times, sfreq, channel_names",7097892,"NeuroRVQ(n_chans=64, n_outputs=4, n_times=800, sfreq=200)","Convolution,Attention/Transformer,Foundation Model,Channel",EEG
80
- SeizureTransformer,Epilepsy,Event Detection,256,"n_chans, n_outputs, n_times",37848897,"SeizureTransformer(n_chans=19, n_outputs=1, n_times=15360)","Convolution,Attention/Transformer",EEG