braindecode 1.8.1.dev177939635__tar.gz → 1.8.1.dev178237886__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 (207) hide show
  1. {braindecode-1.8.1.dev177939635/braindecode.egg-info → braindecode-1.8.1.dev178237886}/PKG-INFO +1 -1
  2. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/functional/functions.py +7 -3
  3. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/biot.py +7 -2
  4. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/codebrain.py +29 -4
  5. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/csbrain.py +1 -2
  6. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegsym.py +17 -1
  7. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/medformer.py +16 -17
  8. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/meta_neuromotor.py +22 -24
  9. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/dance_modules.py +8 -9
  10. braindecode-1.8.1.dev178237886/braindecode/version.py +1 -0
  11. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886/braindecode.egg-info}/PKG-INFO +1 -1
  12. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/whats_new.rst +8 -0
  13. braindecode-1.8.1.dev177939635/braindecode/version.py +0 -1
  14. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/LICENSE.txt +0 -0
  15. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/MANIFEST.in +0 -0
  16. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/NOTICE.txt +0 -0
  17. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/README.rst +0 -0
  18. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/__init__.py +0 -0
  19. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/augmentation/__init__.py +0 -0
  20. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/augmentation/base.py +0 -0
  21. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/augmentation/functional.py +0 -0
  22. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/augmentation/transforms.py +0 -0
  23. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/classifier.py +0 -0
  24. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/__init__.py +0 -0
  25. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/_notebook_viewer.py +0 -0
  26. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/base.py +0 -0
  27. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bbci.py +0 -0
  28. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bcicomp.py +0 -0
  29. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/__init__.py +0 -0
  30. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/datasets.py +0 -0
  31. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/format.py +0 -0
  32. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/hub.py +0 -0
  33. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/hub_format.py +0 -0
  34. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/hub_io.py +0 -0
  35. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/hub_validation.py +0 -0
  36. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/bids/iterable.py +0 -0
  37. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/chb_mit.py +0 -0
  38. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/collate.py +0 -0
  39. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/mne.py +0 -0
  40. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/moabb.py +0 -0
  41. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/nmt.py +0 -0
  42. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/registry.py +0 -0
  43. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/siena.py +0 -0
  44. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  45. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/sleep_physionet.py +0 -0
  46. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/tuh.py +0 -0
  47. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/utils.py +0 -0
  48. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datasets/xy.py +0 -0
  49. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datautil/__init__.py +0 -0
  50. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datautil/channel_utils.py +0 -0
  51. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datautil/hub_formats.py +0 -0
  52. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datautil/serialization.py +0 -0
  53. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/datautil/util.py +0 -0
  54. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/eegneuralnet.py +0 -0
  55. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/functional/__init__.py +0 -0
  56. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/functional/_real_dft.py +0 -0
  57. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/functional/initialization.py +0 -0
  58. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/__init__.py +0 -0
  59. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/atcnet.py +0 -0
  60. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/attentionbasenet.py +0 -0
  61. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/attn_sleep.py +0 -0
  62. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/axon.py +0 -0
  63. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/barista.py +0 -0
  64. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/base.py +0 -0
  65. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/bendr.py +0 -0
  66. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/brainbert.py +0 -0
  67. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/brainmodule.py +0 -0
  68. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/brainomni.py +0 -0
  69. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/brant.py +0 -0
  70. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/cbramod.py +0 -0
  71. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/config.py +0 -0
  72. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/contrawr.py +0 -0
  73. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/ctnet.py +0 -0
  74. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/dance.py +0 -0
  75. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/deep4.py +0 -0
  76. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/deepsleepnet.py +0 -0
  77. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/dgcnn.py +0 -0
  78. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/diver1.py +0 -0
  79. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eeg_clip.py +0 -0
  80. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegconformer.py +0 -0
  81. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegdino.py +0 -0
  82. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eeginception_erp.py +0 -0
  83. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eeginception_mi.py +0 -0
  84. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegitnet.py +0 -0
  85. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegminer.py +0 -0
  86. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegnet.py +0 -0
  87. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegnex.py +0 -0
  88. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegpt.py +0 -0
  89. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegsimpleconv.py +0 -0
  90. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/eegtcnet.py +0 -0
  91. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/emg2qwerty.py +0 -0
  92. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/fbcnet.py +0 -0
  93. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/fblightconvnet.py +0 -0
  94. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/fbmsnet.py +0 -0
  95. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/hybrid.py +0 -0
  96. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/ifnet.py +0 -0
  97. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/labram.py +0 -0
  98. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/luna.py +0 -0
  99. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/mapa.py +0 -0
  100. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/mirepnet.py +0 -0
  101. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/mscformer.py +0 -0
  102. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/msvtnet.py +0 -0
  103. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/mvpformer.py +0 -0
  104. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/neuropose.py +0 -0
  105. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/neurorvq.py +0 -0
  106. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/neurorvq_tokenizer.py +0 -0
  107. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/patchedtransformer.py +0 -0
  108. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/popt.py +0 -0
  109. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/reve.py +0 -0
  110. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sccnet.py +0 -0
  111. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/seizure_transformer.py +0 -0
  112. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sensingdynamics.py +0 -0
  113. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/shallow_fbcsp.py +0 -0
  114. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/signal_jepa.py +0 -0
  115. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sinc_shallow.py +0 -0
  116. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
  117. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
  118. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sleepfm.py +0 -0
  119. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sparcnet.py +0 -0
  120. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/sstdpn.py +0 -0
  121. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/steegformer.py +0 -0
  122. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/summary.csv +0 -0
  123. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/syncnet.py +0 -0
  124. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/tcformer.py +0 -0
  125. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/tcn.py +0 -0
  126. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/tfm_tokenizer.py +0 -0
  127. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/tidnet.py +0 -0
  128. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/tmsanet.py +0 -0
  129. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/tsinception.py +0 -0
  130. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/usleep.py +0 -0
  131. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/util.py +0 -0
  132. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/vemg2pose.py +0 -0
  133. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/models/zuna.py +0 -0
  134. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/__init__.py +0 -0
  135. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/activation.py +0 -0
  136. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/attention.py +0 -0
  137. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/blocks.py +0 -0
  138. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/channels.py +0 -0
  139. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/convolution.py +0 -0
  140. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/filter.py +0 -0
  141. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/layers.py +0 -0
  142. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/linear.py +0 -0
  143. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/linear_attention.py +0 -0
  144. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/parametrization.py +0 -0
  145. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/popt_modules.py +0 -0
  146. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/quantization.py +0 -0
  147. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/stats.py +0 -0
  148. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/util.py +0 -0
  149. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/modules/wrapper.py +0 -0
  150. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/preprocessing/__init__.py +0 -0
  151. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
  152. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/preprocessing/mne_preprocess.py +0 -0
  153. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/preprocessing/preprocess.py +0 -0
  154. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/preprocessing/util.py +0 -0
  155. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/preprocessing/windowers.py +0 -0
  156. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/regressor.py +0 -0
  157. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/samplers/__init__.py +0 -0
  158. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/samplers/base.py +0 -0
  159. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/samplers/ssl.py +0 -0
  160. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/training/__init__.py +0 -0
  161. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/training/callbacks.py +0 -0
  162. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/training/losses.py +0 -0
  163. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/training/scoring.py +0 -0
  164. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/util.py +0 -0
  165. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/__init__.py +0 -0
  166. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/activations.py +0 -0
  167. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/attribution.py +0 -0
  168. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/confusion_matrices.py +0 -0
  169. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/frequency.py +0 -0
  170. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/metrics.py +0 -0
  171. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/sanity.py +0 -0
  172. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode/visualization/topology.py +0 -0
  173. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode.egg-info/SOURCES.txt +0 -0
  174. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode.egg-info/dependency_links.txt +0 -0
  175. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode.egg-info/requires.txt +0 -0
  176. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/braindecode.egg-info/top_level.txt +0 -0
  177. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/Makefile +0 -0
  178. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/_templates/autosummary/class.rst +0 -0
  179. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
  180. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/_templates/autosummary/function.rst +0 -0
  181. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
  182. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/agent_docs.rst +0 -0
  183. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/api.rst +0 -0
  184. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/cite.rst +0 -0
  185. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/conf.py +0 -0
  186. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/help.rst +0 -0
  187. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/index.rst +0 -0
  188. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/install/install.rst +0 -0
  189. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/install/install_pip.rst +0 -0
  190. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/install/install_source.rst +0 -0
  191. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/attention.rst +0 -0
  192. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/channel.rst +0 -0
  193. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/convolution.rst +0 -0
  194. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/filterbank.rst +0 -0
  195. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/gnn.rst +0 -0
  196. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/interpretable.rst +0 -0
  197. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/lbm.rst +0 -0
  198. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/recurrent.rst +0 -0
  199. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/categorization/spd.rst +0 -0
  200. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/models.rst +0 -0
  201. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/models_categorization.rst +0 -0
  202. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/models_table.rst +0 -0
  203. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/models/models_visualization.rst +0 -0
  204. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/sg_execution_times.rst +0 -0
  205. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/docs/user_guide/channel_strategies.rst +0 -0
  206. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/pyproject.toml +0 -0
  207. {braindecode-1.8.1.dev177939635 → braindecode-1.8.1.dev178237886}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.8.1.dev177939635
3
+ Version: 1.8.1.dev178237886
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>
@@ -112,8 +112,11 @@ def prefer_fft_conv(x: torch.Tensor, kernel_size: int) -> bool:
112
112
  Rule measured for :class:`~braindecode.models.EEGInceptionMI` (48 to 240
113
113
  channels, 128-500 Hz, 2 CPU threads, oneDNN on and off): on CPU the FFT
114
114
  wins for float16/bfloat16 inputs (no fast half-precision CPU convolution)
115
- and from ``batch_size * kernel_size >= 600``. GPUs and HPUs (no complex
116
- dtype) keep the direct convolution.
115
+ and from ``batch_size * kernel_size >= 600`` if also
116
+ ``in_channels * kernel_size >= 120``: with one or two input channels a
117
+ float32 direct convolution stays cheaper up to k = 85 / 31 (13 long
118
+ temporal convolutions of the model zoo, 22 channels x batch 32). GPUs and
119
+ HPUs (no complex dtype) keep the direct convolution.
117
120
 
118
121
  Parameters
119
122
  ----------
@@ -123,7 +126,8 @@ def prefer_fft_conv(x: torch.Tensor, kernel_size: int) -> bool:
123
126
  Kernel length in samples.
124
127
  """
125
128
  return x.device.type == "cpu" and (
126
- x.element_size() == 2 or x.shape[0] * kernel_size >= 600
129
+ x.element_size() == 2
130
+ or (x.shape[0] * kernel_size >= 600 and x.shape[1] * kernel_size >= 120)
127
131
  )
128
132
 
129
133
 
@@ -543,10 +543,15 @@ class _BIOTEncoder(nn.Module):
543
543
  emb: Tensor
544
544
  (batch_size, emb_size)
545
545
  """
546
+ batch_size, n_chans, n_times = x.shape
547
+ # One spectrogram for all channels, channel-major so that each
548
+ # channel's (batch, freq, ts) block is contiguous
549
+ spec = self.stft(x.transpose(0, 1).reshape(n_chans * batch_size, 1, n_times))
550
+ spec = spec.unflatten(0, [n_chans, batch_size])
546
551
  emb_seq = []
547
- for i in range(x.shape[1]):
552
+ for i in range(n_chans):
548
553
  # Getting the spectrogram
549
- channel_spec_emb = self.stft(x[:, i : i + 1, :])
554
+ channel_spec_emb = spec[i]
550
555
  # Linear layer to learn some representation over the frequency domain
551
556
  # with permutation
552
557
  channel_spec_emb = self.patch_embedding(channel_spec_emb)
@@ -697,10 +697,35 @@ class _ResidualBlock(nn.Module):
697
697
  # Sliding-window attention branch
698
698
  # (batch, 2*res_channels, seq_len) -> (batch, seq_len, 2*res_channels)
699
699
  h_attn = h_ssm.transpose(1, 2)
700
- swa_mask = self.generate_local_window_mask(
701
- seq_len, self.swa_window_size, x.device, x.dtype
702
- )
703
- h_attn, _ = self.attention(h_attn, h_attn, h_attn, attn_mask=swa_mask)
700
+ if (
701
+ self.swa_window_size == 1
702
+ and not self.training
703
+ and not torch.is_grad_enabled()
704
+ and h_attn.device.type == "cpu"
705
+ ):
706
+ # A one-wide window keeps only the diagonal: the softmax weights are
707
+ # exactly 1 and 0, so the attention returns its value projection.
708
+ # Same projection calls as nn.MultiheadAttention (on its (seq,
709
+ # batch, embed) view), so the output is unchanged bit for bit. (In
710
+ # training the weights carry dropout; on Gaudi the full attention
711
+ # was faster.)
712
+ # ponytail: the unused query/key projections are computed too, to
713
+ # keep the rounding; in_proj_weight[2E:] alone is ~2x less GEMM.
714
+ embed_dim = self.attention.embed_dim
715
+ seq_first = h_attn.transpose(0, 1)
716
+ value = F.linear(
717
+ seq_first, self.attention.in_proj_weight, self.attention.in_proj_bias
718
+ )[..., 2 * embed_dim :]
719
+ h_attn = (
720
+ self.attention.out_proj(value.reshape(-1, embed_dim))
721
+ .view(seq_first.shape)
722
+ .transpose(0, 1)
723
+ )
724
+ else:
725
+ swa_mask = self.generate_local_window_mask(
726
+ seq_len, self.swa_window_size, x.device, x.dtype
727
+ )
728
+ h_attn, _ = self.attention(h_attn, h_attn, h_attn, attn_mask=swa_mask)
704
729
  # (batch, seq_len, 2*res_channels) -> (batch, 2*res_channels, seq_len)
705
730
  h_attn = h_attn.transpose(1, 2)
706
731
 
@@ -710,8 +710,7 @@ class _CSBrainEncoderLayer(nn.Module):
710
710
  for start, stop in self.region_bounds:
711
711
  region_global = x[:, start:stop, :, :].mean(dim=1, keepdim=True)
712
712
  region_global = region_global.permute(0, 2, 1, 3).reshape(batch * T, 1, Fea)
713
- for idx in range(start, stop):
714
- global_features[:, idx : idx + 1, :] = region_global
713
+ global_features[:, start:stop, :] = region_global
715
714
  x_enhanced = x_flat + self.global_fc(global_features)
716
715
 
717
716
  attn_output = self.inter_region_attn(
@@ -441,6 +441,22 @@ class _AvgPoolTime(nn.Module):
441
441
  return y.reshape(b, c, d, y.shape[2], s)
442
442
 
443
443
 
444
+ class _SpatialConv3d(nn.Conv3d):
445
+ """``nn.Conv3d`` with a ``(1, 1, k)`` kernel run as ``conv2d`` on the
446
+ ``(batch, ch, z * time, space)`` view; same parameters. The depthwise
447
+ ``conv3d`` backward segfaults on Gaudi (synapse 1.21)."""
448
+
449
+ def forward(self, x: torch.Tensor) -> torch.Tensor:
450
+ b, c, z, t, s = x.shape
451
+ y = nn.functional.conv2d(
452
+ x.reshape(b, c, z * t, s),
453
+ self.weight.squeeze(2),
454
+ self.bias,
455
+ groups=self.groups,
456
+ )
457
+ return y.reshape(b, -1, z, t, y.shape[-1])
458
+
459
+
444
460
  class _InceptionBlock(nn.Module):
445
461
  r"""Inception module used in EEGSym architecture.
446
462
 
@@ -500,7 +516,7 @@ class _InceptionBlock(nn.Module):
500
516
  for _ in range(spatial_resnet_repetitions):
501
517
  self.spatial_convs.append(
502
518
  nn.Sequential(
503
- nn.Conv3d(
519
+ _SpatialConv3d(
504
520
  in_channels=filters_per_branch * len(scales_samples),
505
521
  out_channels=filters_per_branch * len(scales_samples),
506
522
  kernel_size=(1, 1, ncha),
@@ -425,17 +425,13 @@ class _ListPatchEmbedding(nn.Module):
425
425
  # Reshape to treat each channel independently: (batch_size * n_chans, 1, n_times)
426
426
  x = torch.reshape(x, (batch_size * self.n_chans, 1, self.n_times))
427
427
 
428
+ # add positional embedding to tag each channel (only when not single_channel)
429
+ if not self.single_channel:
430
+ x = x + self.channel_embedding(x)
431
+
428
432
  x_list = []
429
433
  for padding, value_embedding in zip(self.paddings, self.value_embeddings):
430
- x_copy = x.clone()
431
- # add positional embedding to tag each channel (only when not single_channel)
432
- if not self.single_channel:
433
- x_new = x_copy + self.channel_embedding(x_copy)
434
- else:
435
- x_new = x_copy
436
- x_new = padding(x_new).unsqueeze(
437
- 1
438
- ) # (batch_size, 1, enc_in, seq_len+stride)
434
+ x_new = padding(x).unsqueeze(1) # (batch_size, 1, enc_in, seq_len+stride)
439
435
  x_new = value_embedding(x_new) # (batch_size, d_model, 1, patch_num)
440
436
  x_new = x_new.squeeze(2).transpose(1, 2) # (batch_size, patch_num, d_model)
441
437
  x_list.append(x_new)
@@ -693,16 +689,19 @@ class _EncoderLayer(nn.Module):
693
689
  delta: Optional[torch.Tensor] = None,
694
690
  ) -> Tuple[List[torch.Tensor], List[Optional[torch.Tensor]]]:
695
691
  new_x, attn = self.attention(x, attn_mask=attn_mask, tau=tau, delta=delta)
696
- x = [x_orig + self.dropout(x_new) for x_orig, x_new in zip(x, new_x)]
697
-
698
- y = x = [self.norm1(x_val) for x_val in x]
699
- y = [
700
- self.dropout(self.activation(self.conv1(y_val.transpose(-1, 1))))
701
- for y_val in y
702
- ]
692
+ lengths = [x_val.shape[1] for x_val in x]
693
+ # Norms and kernel-1 convs act per token: run them once on all
694
+ # granularities. Dropout stays per granularity (same RNG stream).
695
+ x_all = self.norm1(
696
+ torch.cat(
697
+ [x_orig + self.dropout(x_new) for x_orig, x_new in zip(x, new_x)], dim=1
698
+ )
699
+ )
700
+ y = self.activation(self.conv1(x_all.transpose(-1, 1))).split(lengths, dim=-1)
701
+ y = [self.dropout(y_val) for y_val in y]
703
702
  y = [self.dropout(self.conv2(y_val).transpose(-1, 1)) for y_val in y]
704
703
 
705
- return [self.norm2(x_val + y_val) for x_val, y_val in zip(x, y)], attn
704
+ return list(self.norm2(x_all + torch.cat(y, dim=1)).split(lengths, dim=1)), attn
706
705
 
707
706
 
708
707
  class _Encoder(nn.Module):
@@ -1075,20 +1075,26 @@ class _RotationInvariantMPFMLP(nn.Module):
1075
1075
  raise ValueError("hidden_dims must be non-empty")
1076
1076
  self.offsets = list(offsets)
1077
1077
  self.activation = activation()
1078
- self.vectorize = _VectorizeSymmetricMatrix(
1078
+ # Roll both channel axes by each offset, half-vectorize and flatten
1079
+ # (freqs, covariance) as one gather: entry (row, col) of rotation
1080
+ # ``offset`` reads entry ((row - offset) % C, (col - offset) % C).
1081
+ kept = _VectorizeSymmetricMatrix(
1079
1082
  num_channels=num_channels,
1080
1083
  num_adjacent_cov=num_adjacent_cov,
1081
- )
1082
- self.flatten_features = Rearrange(
1083
- "batch time rotation freqs covariance -> "
1084
- "batch time rotation (freqs covariance)"
1085
- )
1086
- # Stacked rotations come out of torch.stack as
1087
- # (batch, freqs, c1, c2, time, rotation); put time first so the MLP
1088
- # broadcasts cleanly across (time, rotation).
1089
- self.rotations_to_time_major = Rearrange(
1090
- "batch freqs channels1 channels2 time rotation -> "
1091
- "batch time rotation freqs channels1 channels2"
1084
+ ).flattened_matrix_indices
1085
+ rows, cols = kept // num_channels, kept % num_channels
1086
+ self.register_buffer(
1087
+ "rotation_index",
1088
+ torch.cat(
1089
+ [
1090
+ freq * num_channels**2
1091
+ + (rows - offset) % num_channels * num_channels
1092
+ + (cols - offset) % num_channels
1093
+ for offset in self.offsets
1094
+ for freq in range(num_freqs)
1095
+ ]
1096
+ ),
1097
+ persistent=False,
1092
1098
  )
1093
1099
  self.features_to_time_last = Rearrange(
1094
1100
  "batch time features -> batch features time"
@@ -1103,18 +1109,10 @@ class _RotationInvariantMPFMLP(nn.Module):
1103
1109
  dim = hidden_dim
1104
1110
 
1105
1111
  def forward(self, inputs: torch.Tensor) -> torch.Tensor:
1106
- # Gaudi eager mode rolls a non-contiguous tensor wrongly.
1107
- inputs = inputs.contiguous()
1108
- x = torch.stack(
1109
- [
1110
- inputs.roll(shifts=[offset, offset], dims=[2, 3])
1111
- for offset in self.offsets
1112
- ],
1113
- dim=-1,
1114
- )
1115
- x = self.rotations_to_time_major(x)
1116
- x = self.vectorize(x)
1117
- x = self.flatten_features(x)
1112
+ # (batch, freqs, c1, c2, time) -> (batch, time, rotation, features)
1113
+ x = inputs.permute(0, 4, 1, 2, 3).flatten(2)
1114
+ x = x.index_select(-1, self.rotation_index)
1115
+ x = x.unflatten(-1, (len(self.offsets), -1))
1118
1116
  for layer in self.fully_connected_layers:
1119
1117
  x = self.activation(layer(x))
1120
1118
  x = x.mean(dim=2) # average over the rotations
@@ -10,6 +10,7 @@ import math
10
10
  from typing import Dict, Optional
11
11
 
12
12
  import torch
13
+ import torch.nn.functional as F
13
14
  from torch import nn
14
15
 
15
16
  from braindecode.functional import sinusoidal_positional_encoding
@@ -172,15 +173,13 @@ class _Attention(nn.Module):
172
173
  context = context if context is not None else x
173
174
  q = self.to_q(x)
174
175
  k, v = self.to_kv(context).chunk(2, dim=-1)
175
- # (b, n, h * d) -> (b * h, n, d)
176
- q = q.unflatten(-1, (h, -1)).transpose(1, 2).flatten(0, 1)
177
- k = k.unflatten(-1, (h, -1)).transpose(1, 2).flatten(0, 1)
178
- v = v.unflatten(-1, (h, -1)).transpose(1, 2).flatten(0, 1)
179
- attn = (q @ k.transpose(-1, -2) * self.scale).softmax(dim=-1)
180
- out = attn @ v
181
- # (b * h, n, d) -> (b, n, h * d)
182
- out = out.unflatten(0, (-1, h)).transpose(1, 2).flatten(2)
183
- return self.to_out(out)
176
+ # (b, n, h * d) -> (b, h, n, d)
177
+ q = q.unflatten(-1, (h, -1)).transpose(1, 2)
178
+ k = k.unflatten(-1, (h, -1)).transpose(1, 2)
179
+ v = v.unflatten(-1, (h, -1)).transpose(1, 2)
180
+ out = F.scaled_dot_product_attention(q, k, v, scale=self.scale)
181
+ # (b, h, n, d) -> (b, n, h * d)
182
+ return self.to_out(out.transpose(1, 2).flatten(2))
184
183
 
185
184
 
186
185
  class Perceiver(nn.Module):
@@ -0,0 +1 @@
1
+ __version__ = "1.8.1.dev178237886"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.8.1.dev177939635
3
+ Version: 1.8.1.dev178237886
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,17 @@ Current 1.8.1 (2026-08-31)
28
28
  Enhancements
29
29
  ============
30
30
 
31
+ - :class:`braindecode.models.MetaNeuromotorHand` rotates and half-vectorizes the MPF matrices with one precomputed ``index_select`` instead of three rolls, a stack and a permute copy: CPU train step about 2 % faster, Gaudi neutral; outputs, gradients and state dict unchanged bit for bit (:gh:`1292` by `Bruno Aristimunha`_).
32
+ - :class:`braindecode.models.CodeBrain` skips the attention scores in eval mode on CPU at the default ``swa_window_size=1``, where the window keeps only the diagonal and the attention reduces to its value projection: CPU eval forward 1.25x faster at 19 x 6000 (batch 32); training unchanged; outputs unchanged bit for bit (:gh:`1293` by `Bruno Aristimunha`_).
31
33
  - :class:`braindecode.models.LUNA` computes its rotary self-attention with :func:`torch.nn.functional.scaled_dot_product_attention`: CPU forward 1-4 % faster, train step neutral to 2.4 % faster; outputs and gradients change by float rounding only, within master's own float32-vs-float64 difference, also with the released ``PulpBio/LUNA`` weights (:gh:`1282` by `Bruno Aristimunha`_).
34
+ - :class:`braindecode.models.DANCE` computes the Perceiver and decoder attention with :func:`torch.nn.functional.scaled_dot_product_attention` instead of an explicit softmax: eval forward 0.7 % faster on CPU and 1.4 % on Gaudi (22 channels, 32 s, batch 32), train step unchanged; outputs and gradients change by float rounding only, within master's own float32-vs-float64 difference (:gh:`1291` by `Bruno Aristimunha`_).
35
+ - :func:`braindecode.functional.prefer_fft_conv` picks the FFT for a float32 convolution only if also ``in_channels * kernel_size >= 120``: with one or two input channels the direct convolution is up to 2.5x cheaper on CPU; :class:`braindecode.models.EEGInceptionMI` decisions and outputs unchanged (:gh:`1283` by `Bruno Aristimunha`_).
36
+ - :class:`braindecode.models.BIOT` computes the spectrograms of all channels with one STFT instead of one per channel: Gaudi forward 1.6x and train step 1.35x faster (22 channels, batch 32), CPU registry forward 3 % faster; outputs and gradients unchanged bit for bit, also with the released weights (:gh:`1284` by `Bruno Aristimunha`_).
32
37
  - :class:`braindecode.models.MVPFormer` builds its attention masks and channel-shift index once per forward instead of in every layer: forward 19-25 % faster on Gaudi and 2-12 % on CPU, outputs and gradients unchanged bit for bit (:gh:`1280` by `Bruno Aristimunha`_).
33
38
  - :class:`braindecode.models.AttnSleep`, :class:`braindecode.models.Brant`, :class:`braindecode.models.MSVTNet` and :class:`braindecode.models.PBT` no longer compute tensors their forward discards (AttnSleep's first attention product, Brant's reconstruction projection, MSVTNet's branch heads without ``return_features``, PBT's class-token index); outputs and gradients unchanged bit for bit (:gh:`1281` by `Bruno Aristimunha`_).
39
+ - :class:`braindecode.models.CSBrain` copies each region's mean feature into its electrodes with one slice assignment per region instead of one per electrode: train step about 10 % and forward 7 % faster on Gaudi (22 channels, batch 32), unchanged on CPU; outputs are unchanged and gradients change by float rounding only, within master's own float32-vs-float64 difference (:gh:`1285` by `Bruno Aristimunha`_).
34
40
  - :class:`braindecode.modules.FilterBankLayer` broadcasts each FIR band filter over the channels instead of repeating it, so its FFT is computed once per band: :class:`braindecode.models.FBCNet`, :class:`braindecode.models.FBMSNet`, :class:`braindecode.models.FBLightConvNet` and :class:`braindecode.models.IFNet` steps 1-10 % faster on CPU and 8-29 % on Gaudi at batch 2, 0-3 % at batch 32; outputs and gradients change by float rounding only at 22 channels, within master's own float32-vs-float64 difference, and not at all at 3 channels (:gh:`1278` by `Bruno Aristimunha`_).
41
+ - :class:`braindecode.models.MEDFormer` adds its channel embedding once instead of once per granularity, and runs its layer norms and kernel-1 feed-forward convolutions once on all granularities (dropout stays per granularity, same masks): train step 3-7 % faster on CPU and 6-7 % on Gaudi; outputs change by float rounding only (:gh:`1288` by `Bruno Aristimunha`_).
35
42
  - :func:`braindecode.functional.plv_time` copies the real and imaginary phasor parts once instead of in every matmul for each batch matrix: :class:`braindecode.models.EEGMiner` CPU forward 1.5x and train step 1.4x faster (22 channels, batch 32, 2 threads); outputs and gradients change by float rounding only, within master's own float32-vs-float64 difference (:gh:`1277` by `Bruno Aristimunha`_).
36
43
  - :class:`braindecode.models.EEGInceptionMI` runs its max pooling in channels-last layout and pads even kernels once per inception module: CPU forward 1.1-1.25x faster, outputs, gradients and state dict unchanged (:gh:`1267` by `Bruno Aristimunha`_).
37
44
  - :class:`braindecode.models.EEGInceptionMI` computes its temporal convolutions with an FFT on CPU when the input is float16/bfloat16 or ``batch_size * largest_kernel >= 600`` (new ``fft_conv`` argument; ``None`` by default, ``False`` keeps the direct convolution bit for bit): float32 CPU steps 1.5-8.8x faster from batch 8 (2 threads), float16/bfloat16 17-117x; outputs change by float rounding (<= 3.6e-7 relative) (:gh:`1268` by `Bruno Aristimunha`_).
@@ -349,6 +356,7 @@ Bug fixes
349
356
  when the window length is not divisible by the segment count, instead of
350
357
  replacing them with zeros (:gh:`1279` by `Anton Soloviev`_).
351
358
  - Model fixes caught by new CPU-only integration checks (complex tensors, host syncs, kernel gaps, device/dtype follow, training after ``inference_mode``, deepcopy/pickle): BrainOmni/BrainTokenizer SELU trains on Gaudi, EEGSym pools with ``avg_pool2d``, FBCNet/FBMSNet/FBLightConvNet and LUNA run in float16, EEGMiner and AttnSleep deep-copy after training, Labram and NeuroRVQ pickle, SignalJEPA heads accept ``channel_strategy``, and tensors built in ``forward`` follow the input in CodeBrain, TCFormer, LUNA, MVPFormer, BrainOmni, ZUNA, DIVER1 and EEGDINO; float32 outputs unchanged (:gh:`1253` by `Bruno Aristimunha`_)
359
+ - :class:`braindecode.models.EEGSym` trains on Gaudi: its depthwise spatial ``Conv3d`` with a ``(1, 1, n_chans)`` kernel runs as a conv2d on a view, since the Gaudi graph compiler segfaulted on the depthwise conv3d backward; same state dict, outputs unchanged, gradients change by float rounding only (:gh:`1289` by `Bruno Aristimunha`_).
352
360
  - :func:`braindecode.functional.hilbert_freq` returns float16 for float16 input (it
353
361
  returned float32), so :class:`braindecode.models.EEGMiner` runs after
354
362
  ``model.to(torch.float16)`` (:gh:`1259` by `Bruno Aristimunha`_)
@@ -1 +0,0 @@
1
- __version__ = "1.8.1.dev177939635"