braindecode 1.3.2.dev175945036__tar.gz → 1.3.2.dev176161306__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 (161) hide show
  1. {braindecode-1.3.2.dev175945036/braindecode.egg-info → braindecode-1.3.2.dev176161306}/PKG-INFO +1 -1
  2. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/attention.py +2 -1
  3. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/preprocessing/preprocess.py +61 -31
  4. braindecode-1.3.2.dev176161306/braindecode/version.py +1 -0
  5. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306/braindecode.egg-info}/PKG-INFO +1 -1
  6. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/whats_new.rst +8 -0
  7. braindecode-1.3.2.dev175945036/braindecode/version.py +0 -1
  8. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/LICENSE.txt +0 -0
  9. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/MANIFEST.in +0 -0
  10. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/NOTICE.txt +0 -0
  11. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/README.rst +0 -0
  12. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/__init__.py +0 -0
  13. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/augmentation/__init__.py +0 -0
  14. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/augmentation/base.py +0 -0
  15. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/augmentation/functional.py +0 -0
  16. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/augmentation/transforms.py +0 -0
  17. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/classifier.py +0 -0
  18. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/__init__.py +0 -0
  19. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/base.py +0 -0
  20. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bbci.py +0 -0
  21. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bcicomp.py +0 -0
  22. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/__init__.py +0 -0
  23. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/datasets.py +0 -0
  24. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/format.py +0 -0
  25. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/hub.py +0 -0
  26. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/hub_format.py +0 -0
  27. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/hub_io.py +0 -0
  28. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/hub_validation.py +0 -0
  29. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/bids/iterable.py +0 -0
  30. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/chb_mit.py +0 -0
  31. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/mne.py +0 -0
  32. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/moabb.py +0 -0
  33. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/nmt.py +0 -0
  34. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/registry.py +0 -0
  35. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/siena.py +0 -0
  36. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  37. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/sleep_physionet.py +0 -0
  38. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/tuh.py +0 -0
  39. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/utils.py +0 -0
  40. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datasets/xy.py +0 -0
  41. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datautil/__init__.py +0 -0
  42. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datautil/channel_utils.py +0 -0
  43. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datautil/hub_formats.py +0 -0
  44. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datautil/serialization.py +0 -0
  45. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/datautil/util.py +0 -0
  46. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/eegneuralnet.py +0 -0
  47. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/functional/__init__.py +0 -0
  48. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/functional/functions.py +0 -0
  49. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/functional/initialization.py +0 -0
  50. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/__init__.py +0 -0
  51. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/atcnet.py +0 -0
  52. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/attentionbasenet.py +0 -0
  53. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/attn_sleep.py +0 -0
  54. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/base.py +0 -0
  55. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/bendr.py +0 -0
  56. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/biot.py +0 -0
  57. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/brainmodule.py +0 -0
  58. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/cbramod.py +0 -0
  59. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/config.py +0 -0
  60. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/contrawr.py +0 -0
  61. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/ctnet.py +0 -0
  62. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/deep4.py +0 -0
  63. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/deepsleepnet.py +0 -0
  64. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegconformer.py +0 -0
  65. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eeginception_erp.py +0 -0
  66. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eeginception_mi.py +0 -0
  67. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegitnet.py +0 -0
  68. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegminer.py +0 -0
  69. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegnet.py +0 -0
  70. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegnex.py +0 -0
  71. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegpt.py +0 -0
  72. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegsimpleconv.py +0 -0
  73. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegsym.py +0 -0
  74. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/eegtcnet.py +0 -0
  75. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/fbcnet.py +0 -0
  76. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/fblightconvnet.py +0 -0
  77. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/fbmsnet.py +0 -0
  78. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/hybrid.py +0 -0
  79. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/ifnet.py +0 -0
  80. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/labram.py +0 -0
  81. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/luna.py +0 -0
  82. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/medformer.py +0 -0
  83. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/msvtnet.py +0 -0
  84. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/patchedtransformer.py +0 -0
  85. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/reve.py +0 -0
  86. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/sccnet.py +0 -0
  87. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/shallow_fbcsp.py +0 -0
  88. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/signal_jepa.py +0 -0
  89. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/sinc_shallow.py +0 -0
  90. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
  91. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
  92. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/sparcnet.py +0 -0
  93. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/sstdpn.py +0 -0
  94. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/summary.csv +0 -0
  95. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/syncnet.py +0 -0
  96. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/tcn.py +0 -0
  97. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/tidnet.py +0 -0
  98. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/tsinception.py +0 -0
  99. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/usleep.py +0 -0
  100. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/models/util.py +0 -0
  101. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/__init__.py +0 -0
  102. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/activation.py +0 -0
  103. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/blocks.py +0 -0
  104. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/convolution.py +0 -0
  105. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/filter.py +0 -0
  106. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/layers.py +0 -0
  107. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/linear.py +0 -0
  108. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/parametrization.py +0 -0
  109. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/stats.py +0 -0
  110. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/util.py +0 -0
  111. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/modules/wrapper.py +0 -0
  112. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/preprocessing/__init__.py +0 -0
  113. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
  114. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/preprocessing/mne_preprocess.py +0 -0
  115. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/preprocessing/util.py +0 -0
  116. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/preprocessing/windowers.py +0 -0
  117. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/regressor.py +0 -0
  118. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/samplers/__init__.py +0 -0
  119. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/samplers/base.py +0 -0
  120. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/samplers/ssl.py +0 -0
  121. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/training/__init__.py +0 -0
  122. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/training/callbacks.py +0 -0
  123. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/training/losses.py +0 -0
  124. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/training/scoring.py +0 -0
  125. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/util.py +0 -0
  126. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/visualization/__init__.py +0 -0
  127. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/visualization/confusion_matrices.py +0 -0
  128. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode/visualization/gradients.py +0 -0
  129. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode.egg-info/SOURCES.txt +0 -0
  130. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode.egg-info/dependency_links.txt +0 -0
  131. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode.egg-info/requires.txt +0 -0
  132. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/braindecode.egg-info/top_level.txt +0 -0
  133. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/Makefile +0 -0
  134. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/_templates/autosummary/class.rst +0 -0
  135. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
  136. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/_templates/autosummary/function.rst +0 -0
  137. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
  138. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/api.rst +0 -0
  139. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/cite.rst +0 -0
  140. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/conf.py +0 -0
  141. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/help.rst +0 -0
  142. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/index.rst +0 -0
  143. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/install/install.rst +0 -0
  144. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/install/install_pip.rst +0 -0
  145. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/install/install_source.rst +0 -0
  146. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/attention.rst +0 -0
  147. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/channel.rst +0 -0
  148. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/convolution.rst +0 -0
  149. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/filterbank.rst +0 -0
  150. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/gnn.rst +0 -0
  151. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/interpretable.rst +0 -0
  152. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/lbm.rst +0 -0
  153. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/recurrent.rst +0 -0
  154. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/categorization/spd.rst +0 -0
  155. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/models.rst +0 -0
  156. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/models_categorization.rst +0 -0
  157. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/models_table.rst +0 -0
  158. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/models/models_visualization.rst +0 -0
  159. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/docs/sg_execution_times.rst +0 -0
  160. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/pyproject.toml +0 -0
  161. {braindecode-1.3.2.dev175945036 → braindecode-1.3.2.dev176161306}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.3.2.dev175945036
3
+ Version: 1.3.2.dev176161306
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>
@@ -8,6 +8,7 @@ AttentionBaseNet class.
8
8
 
9
9
  # Authors: Martin Wimpff <martin.wimpff@iss.uni-stuttgart.de>
10
10
  # Bruno Aristimunha <b.aristimunha@gmail.com>
11
+ # Sarthak Tayal <sarthaktayal2@gmail.com>
11
12
  #
12
13
  # License: BSD (3-clause)
13
14
 
@@ -60,7 +61,7 @@ class SqueezeAndExcitation(nn.Module):
60
61
  )
61
62
  self.nonlinearity = nn.ReLU()
62
63
  self.fc2 = nn.Conv2d(
63
- in_channels=reduction_rate,
64
+ in_channels=sq_channels,
64
65
  out_channels=in_channels,
65
66
  kernel_size=1,
66
67
  bias=bias,
@@ -5,6 +5,7 @@
5
5
  # Simon Brandt <simonbrandt@protonmail.com>
6
6
  # David Sabbagh <dav.sabbagh@gmail.com>
7
7
  # Bruno Aristimunha <b.aristimunha@gmail.com>
8
+ # Léo Burgund <leo.burgund@gmail.com>
8
9
  #
9
10
  # License: BSD (3-clause)
10
11
 
@@ -24,11 +25,11 @@ else:
24
25
  from collections.abc import Callable
25
26
 
26
27
  import numpy as np
27
- import pandas as pd
28
28
  from joblib import Parallel, delayed
29
29
  from mne import BaseEpochs, create_info
30
30
  from mne.io import BaseRaw
31
31
  from numpy.typing import NDArray
32
+ from scipy.signal import lfilter
32
33
 
33
34
  from braindecode.datasets.base import (
34
35
  BaseConcatDataset,
@@ -424,14 +425,17 @@ def exponential_moving_standardize(
424
425
  ):
425
426
  r"""Perform exponential moving standardization.
426
427
 
427
- Compute the exponental moving mean :math:`m_t` at time `t` as
428
- :math:`m_t=\mathrm{factornew} \cdot mean(x_t) + (1 - \mathrm{factornew}) \cdot m_{t-1}`.
428
+ Compute the exponential moving mean :math:`m_t` at time `t` as
429
+ a weighted average:
430
+ :math:`m_t = \frac{\sum_{i=0}^t (1-\alpha)^i x_{t-i}}{\sum_{i=0}^t (1-\alpha)^i}`
431
+ where :math:`\alpha` is ``factor_new``.
429
432
 
430
433
  Then, compute exponential moving variance :math:`v_t` at time `t` as
431
- :math:`v_t=\mathrm{factornew} \cdot (m_t - x_t)^2 + (1 - \mathrm{factornew}) \cdot v_{t-1}`.
434
+ a weighted average of the squared demeaned signal:
435
+ :math:`v_t = \frac{\sum_{i=0}^t (1-\alpha)^i (x_{t-i} - m_{t-i})^2}{\sum_{i=0}^t (1-\alpha)^i}`.
432
436
 
433
437
  Finally, standardize the data point :math:`x_t` at time `t` as:
434
- :math:`x'_t=(x_t - m_t) / max(\sqrt{->v_t}, eps)`.
438
+ :math:`x'_t=(x_t - m_t) / max(\sqrt{v_t}, eps)`.
435
439
 
436
440
 
437
441
  Parameters
@@ -448,34 +452,52 @@ def exponential_moving_standardize(
448
452
  standardized: np.ndarray (n_channels, n_times)
449
453
  Standardized data.
450
454
  """
451
- data = data.T
452
- df = pd.DataFrame(data)
453
- meaned = df.ewm(alpha=factor_new).mean()
454
- demeaned = df - meaned
455
+ if not (0 < factor_new <= 1):
456
+ raise ValueError(f"factor_new must be between 0 and 1, got {factor_new}")
457
+
458
+ # We use a ratio of two linear filters:
459
+ # y_t = N_t / D_t
460
+ # N_t = x_t + (1-alpha) * N_{t-1}, N_0 = x_0
461
+ # D_t = 1 + (1-alpha) * D_{t-1}, D_0 = 1
462
+ alpha = factor_new
463
+ _, n_times = data.shape
464
+ inv_alpha = 1.0 - alpha
465
+
466
+ # Filter a sequence of ones: [1, 1+(1-a), 1+(1-a)+(1-a)^2, ...]
467
+ d = lfilter([1.0], [1.0, -inv_alpha], np.ones(n_times))
468
+
469
+ n = lfilter([1.0], [1.0, -inv_alpha], data, axis=1)
470
+ meaned = n / d
471
+ demeaned = data - meaned
472
+
455
473
  squared = demeaned * demeaned
456
- square_ewmed = squared.ewm(alpha=factor_new).mean()
457
- standardized = demeaned / np.maximum(eps, np.sqrt(np.array(square_ewmed)))
458
- standardized = np.array(standardized)
474
+ n_sq = lfilter([1.0], [1.0, -inv_alpha], squared, axis=1)
475
+ square_ewmed = n_sq / d
476
+
477
+ standardized = demeaned / np.maximum(eps, np.sqrt(square_ewmed))
478
+
459
479
  if init_block_size is not None:
460
- i_time_axis = 0
461
- init_mean = np.mean(data[0:init_block_size], axis=i_time_axis, keepdims=True)
462
- init_std = np.std(data[0:init_block_size], axis=i_time_axis, keepdims=True)
463
- init_block_standardized = (data[0:init_block_size] - init_mean) / np.maximum(
480
+ init_mean = np.mean(data[:, :init_block_size], axis=1, keepdims=True)
481
+ init_std = np.std(data[:, :init_block_size], axis=1, keepdims=True)
482
+ init_block_standardized = (data[:, :init_block_size] - init_mean) / np.maximum(
464
483
  eps, init_std
465
484
  )
466
- standardized[0:init_block_size] = init_block_standardized
467
- return standardized.T
485
+ standardized[:, :init_block_size] = init_block_standardized
486
+
487
+ return standardized
468
488
 
469
489
 
470
490
  def exponential_moving_demean(
471
491
  data: NDArray, factor_new: float = 0.001, init_block_size: int | None = None
472
492
  ):
473
- r"""Perform exponential moving demeanining.
493
+ r"""Perform exponential moving demeaning.
474
494
 
475
- Compute the exponental moving mean :math:`m_t` at time `t` as
476
- :math:`m_t=\mathrm{factornew} \cdot mean(x_t) + (1 - \mathrm{factornew}) \cdot m_{t-1}`.
495
+ Compute the exponential moving mean :math:`m_t` at time `t` as
496
+ a weighted average:
497
+ :math:`m_t = \frac{\sum_{i=0}^t (1-\alpha)^i x_{t-i}}{\sum_{i=0}^t (1-\alpha)^i}`
498
+ where :math:`\alpha` is ``factor_new``.
477
499
 
478
- Deman the data point :math:`x_t` at time `t` as:
500
+ Demean the data point :math:`x_t` at time `t` as:
479
501
  :math:`x'_t=(x_t - m_t)`.
480
502
 
481
503
  Parameters
@@ -490,16 +512,24 @@ def exponential_moving_demean(
490
512
  demeaned: np.ndarray (n_channels, n_times)
491
513
  Demeaned data.
492
514
  """
493
- data = data.T
494
- df = pd.DataFrame(data)
495
- meaned = df.ewm(alpha=factor_new).mean()
496
- demeaned = df - meaned
497
- demeaned = np.array(demeaned)
515
+ if not (0 < factor_new <= 1):
516
+ raise ValueError(f"factor_new must be between 0 and 1, got {factor_new}")
517
+
518
+ alpha = factor_new
519
+ _, n_times = data.shape
520
+ inv_alpha = 1.0 - alpha
521
+
522
+ d = lfilter([1.0], [1.0, -inv_alpha], np.ones(n_times))
523
+
524
+ n = lfilter([1.0], [1.0, -inv_alpha], data, axis=1)
525
+ meaned = n / d
526
+ demeaned = data - meaned
527
+
498
528
  if init_block_size is not None:
499
- i_time_axis = 0
500
- init_mean = np.mean(data[0:init_block_size], axis=i_time_axis, keepdims=True)
501
- demeaned[0:init_block_size] = data[0:init_block_size] - init_mean
502
- return demeaned.T
529
+ init_mean = np.mean(data[:, :init_block_size], axis=1, keepdims=True)
530
+ demeaned[:, :init_block_size] = data[:, :init_block_size] - init_mean
531
+
532
+ return demeaned
503
533
 
504
534
 
505
535
  def filterbank(
@@ -0,0 +1 @@
1
+ __version__ = "1.3.2.dev176161306"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.3.2.dev175945036
3
+ Version: 1.3.2.dev176161306
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>
@@ -27,6 +27,10 @@ Version 1.4 (Source - GitHub)
27
27
 
28
28
  Enhancements
29
29
  ============
30
+ - Optimize :func:`braindecode.preprocessing.exponential_moving_standardize` and
31
+ :func:`braindecode.preprocessing.exponential_moving_demean` by replacing
32
+ Pandas-based implementation with a more efficient SciPy ``lfilter`` version,
33
+ achieving a ~1.5x speedup (:gh:`950` by `Léo Burgund`_)
30
34
  - Add an optional ``lazy`` init path to :class:`braindecode.datasets.base.BaseConcatDataset`
31
35
  to defer cumulative size computation (and any downstream dataset length access) until
32
36
  first access, supporting truly lazy raw loading workflows.
@@ -82,6 +86,9 @@ Bugs
82
86
  - Fix Zenodo citation: update to global concept DOI and add BibTeX/APA citation formats
83
87
  in ``docs/cite.rst``, ``README.rst``, ``CITATION.cff``, and ``docs/conf.py``
84
88
  (:gh:`937` by `Bruno Aristimunha`_)
89
+ - Fix channel reduction in :class:`braindecode.modules.SqueezeAndExcitation` to avoid
90
+ runtime shape mismatches when the reduced channel count differs from the reduction rate
91
+ (:gh:`889` by `Sarthak Tayal`_)
85
92
  - Push large datasets to HuggingFace Hub using :func:`huggingface_hub.upload_large_folder` to avoid limitations, and allow resuming downloads (:gh:`945` and :gh:`953` by `Pierre Guetschel`_)
86
93
 
87
94
  Code health
@@ -837,3 +844,4 @@ Authors
837
844
  .. _Mattew Chew: https://github.com/MatthewChen37
838
845
  .. _Aman Srivastava: https://github.com/aman-coder03
839
846
  .. _Sarthak Tayal: https://github.com/tayal-sarthak
847
+ .. _Léo Burgund: https://github.com/leob000
@@ -1 +0,0 @@
1
- __version__ = "1.3.2.dev175945036"