braindecode 1.5.0.dev1009__tar.gz → 1.5.0.dev1010__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 (171) hide show
  1. {braindecode-1.5.0.dev1009/braindecode.egg-info → braindecode-1.5.0.dev1010}/PKG-INFO +1 -1
  2. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/base.py +119 -1
  3. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/preprocessing/preprocess.py +38 -17
  4. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/preprocessing/windowers.py +13 -4
  5. braindecode-1.5.0.dev1010/braindecode/version.py +1 -0
  6. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010/braindecode.egg-info}/PKG-INFO +1 -1
  7. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/whats_new.rst +23 -11
  8. braindecode-1.5.0.dev1009/braindecode/version.py +0 -1
  9. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/LICENSE.txt +0 -0
  10. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/MANIFEST.in +0 -0
  11. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/NOTICE.txt +0 -0
  12. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/README.rst +0 -0
  13. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/__init__.py +0 -0
  14. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/augmentation/__init__.py +0 -0
  15. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/augmentation/base.py +0 -0
  16. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/augmentation/functional.py +0 -0
  17. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/augmentation/transforms.py +0 -0
  18. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/classifier.py +0 -0
  19. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/__init__.py +0 -0
  20. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bbci.py +0 -0
  21. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bcicomp.py +0 -0
  22. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/__init__.py +0 -0
  23. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/datasets.py +0 -0
  24. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/format.py +0 -0
  25. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/hub.py +0 -0
  26. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/hub_format.py +0 -0
  27. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/hub_io.py +0 -0
  28. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/hub_validation.py +0 -0
  29. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/bids/iterable.py +0 -0
  30. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/chb_mit.py +0 -0
  31. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/mne.py +0 -0
  32. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/moabb.py +0 -0
  33. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/nmt.py +0 -0
  34. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/registry.py +0 -0
  35. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/siena.py +0 -0
  36. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  37. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/sleep_physionet.py +0 -0
  38. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/tuh.py +0 -0
  39. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/utils.py +0 -0
  40. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datasets/xy.py +0 -0
  41. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datautil/__init__.py +0 -0
  42. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datautil/channel_utils.py +0 -0
  43. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datautil/hub_formats.py +0 -0
  44. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datautil/serialization.py +0 -0
  45. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/datautil/util.py +0 -0
  46. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/eegneuralnet.py +0 -0
  47. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/functional/__init__.py +0 -0
  48. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/functional/functions.py +0 -0
  49. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/functional/initialization.py +0 -0
  50. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/__init__.py +0 -0
  51. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/atcnet.py +0 -0
  52. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/attentionbasenet.py +0 -0
  53. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/attn_sleep.py +0 -0
  54. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/base.py +0 -0
  55. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/bendr.py +0 -0
  56. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/biot.py +0 -0
  57. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/brainmodule.py +0 -0
  58. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/cbramod.py +0 -0
  59. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/codebrain.py +0 -0
  60. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/config.py +0 -0
  61. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/contrawr.py +0 -0
  62. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/ctnet.py +0 -0
  63. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/deep4.py +0 -0
  64. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/deepsleepnet.py +0 -0
  65. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/dgcnn.py +0 -0
  66. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegconformer.py +0 -0
  67. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eeginception_erp.py +0 -0
  68. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eeginception_mi.py +0 -0
  69. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegitnet.py +0 -0
  70. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegminer.py +0 -0
  71. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegnet.py +0 -0
  72. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegnex.py +0 -0
  73. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegpt.py +0 -0
  74. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegsimpleconv.py +0 -0
  75. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegsym.py +0 -0
  76. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/eegtcnet.py +0 -0
  77. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/emg2qwerty.py +0 -0
  78. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/fbcnet.py +0 -0
  79. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/fblightconvnet.py +0 -0
  80. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/fbmsnet.py +0 -0
  81. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/hybrid.py +0 -0
  82. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/ifnet.py +0 -0
  83. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/interpolated.py +0 -0
  84. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/labram.py +0 -0
  85. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/luna.py +0 -0
  86. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/medformer.py +0 -0
  87. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/meta_neuromotor.py +0 -0
  88. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/msvtnet.py +0 -0
  89. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/patchedtransformer.py +0 -0
  90. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/reve.py +0 -0
  91. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/sccnet.py +0 -0
  92. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/shallow_fbcsp.py +0 -0
  93. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/signal_jepa.py +0 -0
  94. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/sinc_shallow.py +0 -0
  95. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/sleep_stager_blanco_2020.py +0 -0
  96. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/sleep_stager_chambon_2018.py +0 -0
  97. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/sparcnet.py +0 -0
  98. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/sstdpn.py +0 -0
  99. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/summary.csv +0 -0
  100. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/syncnet.py +0 -0
  101. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/tcn.py +0 -0
  102. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/tidnet.py +0 -0
  103. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/tsinception.py +0 -0
  104. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/usleep.py +0 -0
  105. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/models/util.py +0 -0
  106. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/__init__.py +0 -0
  107. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/activation.py +0 -0
  108. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/attention.py +0 -0
  109. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/blocks.py +0 -0
  110. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/convolution.py +0 -0
  111. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/filter.py +0 -0
  112. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/interpolation.py +0 -0
  113. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/layers.py +0 -0
  114. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/linear.py +0 -0
  115. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/parametrization.py +0 -0
  116. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/stats.py +0 -0
  117. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/util.py +0 -0
  118. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/modules/wrapper.py +0 -0
  119. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/preprocessing/__init__.py +0 -0
  120. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
  121. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/preprocessing/mne_preprocess.py +0 -0
  122. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/preprocessing/util.py +0 -0
  123. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/regressor.py +0 -0
  124. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/samplers/__init__.py +0 -0
  125. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/samplers/base.py +0 -0
  126. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/samplers/ssl.py +0 -0
  127. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/training/__init__.py +0 -0
  128. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/training/callbacks.py +0 -0
  129. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/training/losses.py +0 -0
  130. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/training/scoring.py +0 -0
  131. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/util.py +0 -0
  132. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/__init__.py +0 -0
  133. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/attribution.py +0 -0
  134. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/confusion_matrices.py +0 -0
  135. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/frequency.py +0 -0
  136. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/metrics.py +0 -0
  137. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/sanity.py +0 -0
  138. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode/visualization/topology.py +0 -0
  139. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode.egg-info/SOURCES.txt +0 -0
  140. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode.egg-info/dependency_links.txt +0 -0
  141. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode.egg-info/requires.txt +0 -0
  142. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/braindecode.egg-info/top_level.txt +0 -0
  143. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/Makefile +0 -0
  144. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/_templates/autosummary/class.rst +0 -0
  145. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
  146. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/_templates/autosummary/function.rst +0 -0
  147. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
  148. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/api.rst +0 -0
  149. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/cite.rst +0 -0
  150. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/conf.py +0 -0
  151. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/help.rst +0 -0
  152. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/index.rst +0 -0
  153. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/install/install.rst +0 -0
  154. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/install/install_pip.rst +0 -0
  155. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/install/install_source.rst +0 -0
  156. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/attention.rst +0 -0
  157. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/channel.rst +0 -0
  158. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/convolution.rst +0 -0
  159. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/filterbank.rst +0 -0
  160. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/gnn.rst +0 -0
  161. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/interpretable.rst +0 -0
  162. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/lbm.rst +0 -0
  163. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/recurrent.rst +0 -0
  164. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/categorization/spd.rst +0 -0
  165. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/models.rst +0 -0
  166. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/models_categorization.rst +0 -0
  167. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/models_table.rst +0 -0
  168. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/models/models_visualization.rst +0 -0
  169. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/docs/sg_execution_times.rst +0 -0
  170. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/pyproject.toml +0 -0
  171. {braindecode-1.5.0.dev1009 → braindecode-1.5.0.dev1010}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.5.0.dev1009
3
+ Version: 1.5.0.dev1010
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>
@@ -18,7 +18,7 @@ import shutil
18
18
  import warnings
19
19
  from abc import abstractmethod
20
20
  from collections import Counter
21
- from collections.abc import Callable
21
+ from collections.abc import Callable, Hashable
22
22
  from glob import glob
23
23
  from pathlib import Path
24
24
  from typing import Any, Generic, Iterable, no_type_check
@@ -1340,6 +1340,124 @@ class BaseConcatDataset(ConcatDataset, HubDatasetMixin, Generic[T]):
1340
1340
  raise TypeError("target_transform must be a callable.")
1341
1341
  self._target_transform = fn
1342
1342
 
1343
+ def set_target(self, column: Hashable) -> "BaseConcatDataset":
1344
+ """Use ``column`` as the target ``y`` for every subdataset.
1345
+
1346
+ Dispatches on the subdataset type:
1347
+
1348
+ * For :class:`WindowsDataset` / :class:`EEGWindowsDataset`,
1349
+ ``column`` is looked up in per-window ``metadata`` first, then in
1350
+ the per-record ``description`` (broadcast to every window). The
1351
+ resolved values overwrite ``ds.metadata['target']`` and ``ds.y``.
1352
+ For :class:`WindowsDataset`, the underlying ``ds.windows.metadata``
1353
+ is kept in sync so ``get_metadata()`` and the repr reflect the
1354
+ new target.
1355
+ * For :class:`RawDataset`, ``column`` must exist on the
1356
+ ``description``. ``ds.target_name`` is set to ``column`` so
1357
+ ``__getitem__`` reads ``description[column]`` as ``y`` on every
1358
+ access — no rebuild needed.
1359
+
1360
+ Parameters
1361
+ ----------
1362
+ column : Hashable
1363
+ Name of a metadata column or description field (BIDS entity,
1364
+ participants.tsv extra, ...). Typically a string, but any
1365
+ hashable that pandas accepts as a column label is allowed.
1366
+
1367
+ Returns
1368
+ -------
1369
+ self : BaseConcatDataset
1370
+
1371
+ Raises
1372
+ ------
1373
+ TypeError
1374
+ If any subdataset is not a :class:`WindowsDataset`,
1375
+ :class:`EEGWindowsDataset`, or :class:`RawDataset`, or if a
1376
+ windowed subdataset has lazy (non-DataFrame) metadata.
1377
+ ValueError
1378
+ If ``column`` is not present on a subdataset's metadata or
1379
+ description, or if a windowed subdataset has
1380
+ ``targets_from='channels'`` (which would make this a silent
1381
+ no-op since ``__getitem__`` reads y from misc channels, not
1382
+ from ``metadata['target']``).
1383
+ """
1384
+ for i, ds in enumerate(self.datasets):
1385
+ if isinstance(ds, (WindowsDataset, EEGWindowsDataset)):
1386
+ if not isinstance(ds.metadata, pd.DataFrame):
1387
+ # _LazyDataFrame (lazy_metadata=True) does not implement
1388
+ # .copy()/__setitem__, so the in-place write below would
1389
+ # raise AttributeError. Surface the precondition cleanly.
1390
+ raise TypeError(
1391
+ "set_target requires a materialized metadata "
1392
+ f"DataFrame; datasets[{i}].metadata is "
1393
+ f"{type(ds.metadata).__name__}. Re-window with "
1394
+ "lazy_metadata=False to use set_target."
1395
+ )
1396
+ if getattr(ds, "targets_from", "metadata") != "metadata":
1397
+ # __getitem__ would read y from misc channels; writing
1398
+ # metadata['target']/ds.y would be a silent no-op.
1399
+ raise ValueError(
1400
+ f"datasets[{i}] has targets_from="
1401
+ f"{ds.targets_from!r}; set_target only applies when "
1402
+ "targets_from='metadata' (otherwise __getitem__ "
1403
+ "derives y from misc channels and would ignore the "
1404
+ "rewritten target column)."
1405
+ )
1406
+ n = len(ds)
1407
+ md = ds.metadata
1408
+ if column in md.columns:
1409
+ values = md[column].iloc[:n].to_list()
1410
+ elif (
1411
+ isinstance(ds.description, pd.Series)
1412
+ and column in ds.description.index
1413
+ ):
1414
+ values = [ds.description[column]] * n
1415
+ else:
1416
+ desc_keys = (
1417
+ list(ds.description.index)
1418
+ if isinstance(ds.description, pd.Series)
1419
+ else []
1420
+ )
1421
+ raise ValueError(
1422
+ f"Column {column!r} not found on datasets[{i}]: "
1423
+ f"metadata cols={list(md.columns)}, "
1424
+ f"description keys={desc_keys}."
1425
+ )
1426
+ # In-place write so the WindowsDataset's metadata and the
1427
+ # underlying mne.Epochs.metadata (which start as the same
1428
+ # object reference) both reflect the new target. Defensive
1429
+ # second write covers the case where they got de-aliased
1430
+ # earlier by a caller-side reassignment.
1431
+ md["target"] = values
1432
+ windows_obj = getattr(ds, "_windows", None)
1433
+ if windows_obj is not None and windows_obj.metadata is not md:
1434
+ windows_obj.metadata["target"] = values
1435
+ # values is already a fresh list (Series.to_list() / [x] * n);
1436
+ # no defensive copy needed — pandas keeps its own representation
1437
+ # for md["target"] so mutating ds.y won't reach back into it.
1438
+ ds.y = values
1439
+ elif isinstance(ds, RawDataset):
1440
+ if (
1441
+ not isinstance(ds.description, pd.Series)
1442
+ or column not in ds.description.index
1443
+ ):
1444
+ desc_keys = (
1445
+ list(ds.description.index)
1446
+ if isinstance(ds.description, pd.Series)
1447
+ else []
1448
+ )
1449
+ raise ValueError(
1450
+ f"Column {column!r} not found on datasets[{i}] "
1451
+ f"description (keys={desc_keys})."
1452
+ )
1453
+ ds.target_name = column
1454
+ else:
1455
+ raise TypeError(
1456
+ "set_target requires WindowsDataset, EEGWindowsDataset, "
1457
+ f"or RawDataset; datasets[{i}] is {type(ds).__name__}."
1458
+ )
1459
+ return self
1460
+
1343
1461
  def _outdated_save(self, path, overwrite=False):
1344
1462
  """This is a copy of the old saving function, that had inconsistent.
1345
1463
 
@@ -6,6 +6,7 @@
6
6
  # David Sabbagh <dav.sabbagh@gmail.com>
7
7
  # Bruno Aristimunha <b.aristimunha@gmail.com>
8
8
  # Léo Burgund <leo.burgund@gmail.com>
9
+ # Sarthak Tayal <sarthaktayal2@gmail.com>
9
10
  #
10
11
  # License: BSD (3-clause)
11
12
 
@@ -217,6 +218,7 @@ def preprocess(
217
218
  offset: int = 0,
218
219
  copy_data: bool | None = None,
219
220
  parallel_kwargs: dict | None = None,
221
+ max_nbytes: int | str | None = "1M",
220
222
  ):
221
223
  """Apply preprocessors to a concat dataset.
222
224
 
@@ -244,14 +246,20 @@ def preprocess(
244
246
  Additional keyword arguments forwarded to ``joblib.Parallel``.
245
247
  Defaults to None (equivalent to ``{}``).
246
248
  See https://joblib.readthedocs.io/en/stable/generated/joblib.Parallel.html for details.
249
+ max_nbytes : int, str, or None
250
+ Threshold (in bytes; or e.g. ``"1M"``) above which joblib memory-maps
251
+ preloaded arrays as read-only when dispatching to worker processes.
252
+ Effective only when ``n_jobs != 1``. Pass ``None`` to disable memory
253
+ mapping when a preprocessor resizes the underlying data (for example
254
+ ``filterbank``), which would otherwise fail with an ``mmap can't
255
+ resize a readonly`` error. ``parallel_kwargs['max_nbytes']`` takes
256
+ precedence if both are provided.
247
257
 
248
258
  Returns
249
259
  -------
250
260
  BaseConcatDataset
251
261
  Preprocessed dataset.
252
262
  """
253
- # In case of serialization, make sure directory is available before
254
- # preprocessing
255
263
  if save_dir is not None and not overwrite:
256
264
  _check_save_dir_empty(save_dir)
257
265
 
@@ -266,22 +274,35 @@ def preprocess(
266
274
  parallel_params.setdefault(
267
275
  "prefer", "threads" if platform.system() == "Windows" else None
268
276
  )
269
-
270
- list_of_ds = Parallel(n_jobs=n_jobs, **parallel_params)(
271
- delayed(_preprocess)(
272
- ds,
273
- i + offset,
274
- preprocessors,
275
- save_dir,
276
- overwrite,
277
- copy_data=(
278
- (parallel_processing and (save_dir is None))
279
- if copy_data is None
280
- else copy_data
281
- ),
277
+ parallel_params.setdefault("max_nbytes", max_nbytes)
278
+
279
+ try:
280
+ list_of_ds = Parallel(n_jobs=n_jobs, **parallel_params)(
281
+ delayed(_preprocess)(
282
+ ds,
283
+ i + offset,
284
+ preprocessors,
285
+ save_dir,
286
+ overwrite,
287
+ copy_data=(
288
+ (parallel_processing and (save_dir is None))
289
+ if copy_data is None
290
+ else copy_data
291
+ ),
292
+ )
293
+ for i, ds in enumerate(concat_ds.datasets)
282
294
  )
283
- for i, ds in enumerate(concat_ds.datasets)
284
- )
295
+ except (BufferError, ValueError, OSError) as exc:
296
+ msg = str(exc).lower().replace("-", "")
297
+ if "mmap" in msg and "readonly" in msg:
298
+ raise RuntimeError(
299
+ "Parallel preprocessing failed because joblib memory-mapped "
300
+ "a preloaded array that a preprocessor then attempted to "
301
+ "resize (e.g. ``filterbank``). Pass ``max_nbytes=None`` to "
302
+ "``preprocess`` to disable memory mapping, or supply a "
303
+ "``save_dir`` so the data is reloaded with ``preload=False``."
304
+ ) from exc
305
+ raise
285
306
 
286
307
  if save_dir is not None: # Reload datasets and replace in concat_ds
287
308
  ids_to_load = [i + offset for i in range(len(concat_ds.datasets))]
@@ -498,7 +498,7 @@ def create_fixed_length_windows(
498
498
  EEGWindowsDataset objects with the extracted windows, depending on
499
499
  the value of ``use_mne_epochs``.
500
500
  """
501
- stop_offset_samples, drop_last_window = (
501
+ stop_offset_samples, window_stride_samples, drop_last_window = (
502
502
  _check_and_set_fixed_length_window_arguments(
503
503
  start_offset_samples,
504
504
  stop_offset_samples,
@@ -886,7 +886,10 @@ def _create_fixed_length_windows(
886
886
  if mapping is not None:
887
887
  # in case of multiple targets
888
888
  if isinstance(target, pd.Series):
889
- target = target.replace(mapping).to_list()
889
+ # Plain comprehension instead of Series.replace(mapping):
890
+ # replace() emits a pandas FutureWarning about silent downcasting
891
+ # and the result is immediately list-ified anyway.
892
+ target = [mapping.get(v, v) for v in target]
890
893
  # in case of single value target
891
894
  else:
892
895
  target = mapping[target]
@@ -1245,8 +1248,14 @@ def _check_and_set_fixed_length_window_arguments(
1245
1248
  lazy_metadata,
1246
1249
  ):
1247
1250
  """Raises warnings for incorrect input arguments and will set correct default values for
1248
- stop_offset_samples & drop_last_window, if necessary.
1251
+ stop_offset_samples, window_stride_samples & drop_last_window, if necessary.
1249
1252
  """
1253
+ # default stride to window size for non-overlapping windows
1254
+ if window_size_samples is not None and window_stride_samples is None:
1255
+ window_stride_samples = window_size_samples
1256
+ if drop_last_window is None:
1257
+ drop_last_window = True
1258
+
1250
1259
  _check_windowing_arguments(
1251
1260
  start_offset_samples,
1252
1261
  stop_offset_samples,
@@ -1295,7 +1304,7 @@ def _check_and_set_fixed_length_window_arguments(
1295
1304
  raise ValueError(
1296
1305
  "Cannot have drop_last_window=False and lazy_metadata=True at the same time."
1297
1306
  )
1298
- return stop_offset_samples, drop_last_window
1307
+ return stop_offset_samples, window_stride_samples, drop_last_window
1299
1308
 
1300
1309
 
1301
1310
  def _get_windowing_kwargs(windowing_func_locals):
@@ -0,0 +1 @@
1
+ __version__ = "1.5.0.dev1010"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.5.0.dev1009
3
+ Version: 1.5.0.dev1010
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>
@@ -22,12 +22,22 @@
22
22
  .. _current:
23
23
 
24
24
 
25
- Current 1.5.0 (GitHub)
25
+ Current 1.5.0 (stable)
26
26
  ===============================
27
27
 
28
28
  Enhancements
29
29
  ============
30
30
 
31
+ - Add :meth:`braindecode.datasets.BaseConcatDataset.set_target` to swap
32
+ any per-window metadata column or per-record description field
33
+ (e.g. a BIDS entity, a participants.tsv extra) into the dataset's
34
+ target ``y`` in one call, replacing the manual
35
+ ``for ds in concat.datasets: ds.metadata.loc[:, 'target'] = ...; ds.y = ...``
36
+ loop. Dispatches on the subdataset type: writes
37
+ ``metadata['target']`` / ``ds.y`` for windowed records, and points
38
+ ``target_name`` at the chosen description field for raw records.
39
+ By `Bruno Aristimunha`_.
40
+
31
41
  - Redesign the documentation landing page (``docs/index.rst``) in a
32
42
  pyhealth.dev-style layout: animated brain → EEG → net hero, fact strip
33
43
  highlighting MOABB / EEGDash interoperability, interactive model-zoo
@@ -140,11 +150,6 @@ API and behavior changes
140
150
  :class:`braindecode.models.InterpolatedLaBraM`. (:gh:`993`
141
151
  by `Pierre Guetschel`_)
142
152
 
143
- Requirements
144
- ============
145
-
146
- - None yet
147
-
148
153
  Bug fixes
149
154
  ==========
150
155
 
@@ -173,6 +178,10 @@ Bug fixes
173
178
  - Fix ``TypeError: type 'Any' is not subscriptable`` when importing
174
179
  ``braindecode.models.config`` without ``numpydantic`` installed on
175
180
  Python 3.12+ (:gh:`871` by `Sarthak Tayal`_)
181
+ - Fix :func:`braindecode.preprocessing.create_fixed_length_windows` crashing
182
+ when only ``window_size_samples`` is provided without ``window_stride_samples``,
183
+ stride now defaults to window size as documented
184
+ (:gh:`990` by `Sarthak Tayal`_)
176
185
  - Add ``channel_embedding`` parameter to :class:`braindecode.models.SignalJEPA` and
177
186
  :class:`braindecode.models.SignalJEPA_Contextual` to load pre-trained channel
178
187
  embedding weights when fine-tuning on a subset of the pre-training channels.
@@ -187,11 +196,6 @@ Bug fixes
187
196
  - Retry transient TLS failures from ``physionet.org`` when fetching
188
197
  :class:`braindecode.datasets.SleepPhysionet` (by `Bruno Aristimunha`_)
189
198
 
190
- Code health
191
- ============
192
-
193
- - None yet
194
-
195
199
 
196
200
  Current 1.4.0 (stable)
197
201
  ===============================
@@ -346,6 +350,14 @@ Bugs
346
350
  marked all model-specific parameters as "The description is missing"
347
351
  when ``DOCSTRING_INHERITANCE_ENABLE=1`` was set during documentation
348
352
  builds (:gh:`971` by `Bruno Aristimunha`_)
353
+ - Expose ``max_nbytes`` directly on
354
+ :func:`braindecode.preprocessing.preprocess.preprocess` and turn the
355
+ cryptic ``mmap can't resize a readonly`` failure (raised when joblib
356
+ memory-maps a preloaded array that a preprocessor later tries to
357
+ resize) into an actionable error explaining how to fix it: pass
358
+ ``max_nbytes=None`` to disable memory mapping, or supply a ``save_dir``
359
+ so data is reloaded with ``preload=False``
360
+ (:gh:`325` by `Sarthak Tayal`_)
349
361
 
350
362
  Code health
351
363
  ============
@@ -1 +0,0 @@
1
- __version__ = "1.5.0.dev1009"