braindecode 1.8.0.dev183527593__tar.gz → 1.8.1.dev167868425__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 (193) hide show
  1. braindecode-1.8.1.dev167868425/NOTICE.txt +78 -0
  2. {braindecode-1.8.0.dev183527593/braindecode.egg-info → braindecode-1.8.1.dev167868425}/PKG-INFO +14 -8
  3. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/README.rst +6 -3
  4. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/augmentation/functional.py +1 -1
  5. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/augmentation/transforms.py +4 -2
  6. braindecode-1.8.1.dev167868425/braindecode/datasets/_notebook_viewer.py +255 -0
  7. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/base.py +22 -0
  8. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/tuh.py +7 -2
  9. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datautil/serialization.py +4 -1
  10. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/functional/__init__.py +2 -0
  11. braindecode-1.8.1.dev167868425/braindecode/functional/_real_dft.py +138 -0
  12. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/functional/functions.py +47 -4
  13. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/__init__.py +18 -0
  14. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/atcnet.py +2 -2
  15. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/attn_sleep.py +0 -4
  16. braindecode-1.8.1.dev167868425/braindecode/models/barista.py +699 -0
  17. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/base.py +51 -3
  18. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/bendr.py +2 -0
  19. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/biot.py +1 -0
  20. braindecode-1.8.1.dev167868425/braindecode/models/brainbert.py +448 -0
  21. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/brainmodule.py +1 -1
  22. braindecode-1.8.1.dev167868425/braindecode/models/brant.py +477 -0
  23. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/cbramod.py +3 -0
  24. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/ctnet.py +10 -7
  25. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/dance.py +2 -10
  26. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/dgcnn.py +4 -1
  27. braindecode-1.8.1.dev167868425/braindecode/models/diver1.py +945 -0
  28. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegconformer.py +1 -1
  29. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegdino.py +2 -0
  30. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegminer.py +2 -1
  31. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegpt.py +4 -2
  32. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegsimpleconv.py +9 -7
  33. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/emg2qwerty.py +9 -133
  34. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/ifnet.py +10 -6
  35. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/interpolated.py +5 -2
  36. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/labram.py +1 -0
  37. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/luna.py +33 -5
  38. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/medformer.py +1 -1
  39. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/meta_neuromotor.py +2 -1
  40. braindecode-1.8.1.dev167868425/braindecode/models/mirepnet.py +368 -0
  41. braindecode-1.8.1.dev167868425/braindecode/models/mscformer.py +502 -0
  42. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/mvpformer.py +14 -7
  43. braindecode-1.8.1.dev167868425/braindecode/models/neuropose.py +440 -0
  44. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/reve.py +18 -82
  45. braindecode-1.8.1.dev167868425/braindecode/models/sensingdynamics.py +461 -0
  46. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/signal_jepa.py +30 -11
  47. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/sleep_stager_blanco_2020.py +5 -9
  48. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/sleep_stager_chambon_2018.py +1 -7
  49. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/sparcnet.py +2 -2
  50. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/sstdpn.py +1 -1
  51. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/steegformer.py +66 -19
  52. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/summary.csv +10 -1
  53. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/tcformer.py +1 -1
  54. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/tidnet.py +1 -7
  55. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/usleep.py +3 -7
  56. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/util.py +326 -28
  57. braindecode-1.8.1.dev167868425/braindecode/models/vemg2pose.py +655 -0
  58. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/zuna.py +52 -51
  59. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/__init__.py +16 -2
  60. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/activation.py +14 -0
  61. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/attention.py +7 -1
  62. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/blocks.py +269 -5
  63. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/convolution.py +4 -2
  64. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/filter.py +33 -7
  65. braindecode-1.8.1.dev167868425/braindecode/modules/parametrization.py +62 -0
  66. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/preprocessing/windowers.py +57 -10
  67. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/util.py +44 -0
  68. braindecode-1.8.1.dev167868425/braindecode/version.py +1 -0
  69. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/__init__.py +6 -0
  70. braindecode-1.8.1.dev167868425/braindecode/visualization/activations.py +77 -0
  71. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425/braindecode.egg-info}/PKG-INFO +14 -8
  72. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode.egg-info/SOURCES.txt +12 -0
  73. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode.egg-info/requires.txt +8 -4
  74. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/api.rst +25 -0
  75. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/conf.py +6 -1
  76. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/install/install.rst +4 -1
  77. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/whats_new.rst +268 -3
  78. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/pyproject.toml +6 -5
  79. braindecode-1.8.0.dev183527593/NOTICE.txt +0 -25
  80. braindecode-1.8.0.dev183527593/braindecode/modules/parametrization.py +0 -38
  81. braindecode-1.8.0.dev183527593/braindecode/version.py +0 -1
  82. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/LICENSE.txt +0 -0
  83. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/MANIFEST.in +0 -0
  84. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/__init__.py +0 -0
  85. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/augmentation/__init__.py +0 -0
  86. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/augmentation/base.py +0 -0
  87. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/classifier.py +0 -0
  88. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/__init__.py +0 -0
  89. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bbci.py +0 -0
  90. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bcicomp.py +0 -0
  91. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/__init__.py +0 -0
  92. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/datasets.py +0 -0
  93. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/format.py +0 -0
  94. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/hub.py +0 -0
  95. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/hub_format.py +0 -0
  96. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/hub_io.py +0 -0
  97. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/hub_validation.py +0 -0
  98. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/bids/iterable.py +0 -0
  99. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/chb_mit.py +0 -0
  100. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/collate.py +0 -0
  101. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/mne.py +0 -0
  102. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/moabb.py +0 -0
  103. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/nmt.py +0 -0
  104. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/registry.py +0 -0
  105. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/siena.py +0 -0
  106. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/sleep_physio_challe_18.py +0 -0
  107. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/sleep_physionet.py +0 -0
  108. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/utils.py +0 -0
  109. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datasets/xy.py +0 -0
  110. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datautil/__init__.py +0 -0
  111. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datautil/channel_utils.py +0 -0
  112. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datautil/hub_formats.py +0 -0
  113. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/datautil/util.py +0 -0
  114. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/eegneuralnet.py +0 -0
  115. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/functional/initialization.py +0 -0
  116. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/attentionbasenet.py +0 -0
  117. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/codebrain.py +0 -0
  118. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/config.py +0 -0
  119. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/contrawr.py +0 -0
  120. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/deep4.py +0 -0
  121. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/deepsleepnet.py +0 -0
  122. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eeginception_erp.py +0 -0
  123. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eeginception_mi.py +0 -0
  124. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegitnet.py +0 -0
  125. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegnet.py +0 -0
  126. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegnex.py +0 -0
  127. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegsym.py +0 -0
  128. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/eegtcnet.py +0 -0
  129. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/fbcnet.py +0 -0
  130. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/fblightconvnet.py +0 -0
  131. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/fbmsnet.py +0 -0
  132. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/hybrid.py +0 -0
  133. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/msvtnet.py +0 -0
  134. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/patchedtransformer.py +0 -0
  135. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/sccnet.py +0 -0
  136. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/shallow_fbcsp.py +0 -0
  137. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/sinc_shallow.py +0 -0
  138. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/syncnet.py +0 -0
  139. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/tcn.py +0 -0
  140. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/models/tsinception.py +0 -0
  141. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/dance_modules.py +0 -0
  142. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/interpolation.py +0 -0
  143. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/layers.py +0 -0
  144. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/linear.py +0 -0
  145. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/stats.py +0 -0
  146. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/util.py +0 -0
  147. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/modules/wrapper.py +0 -0
  148. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/preprocessing/__init__.py +0 -0
  149. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/preprocessing/eegprep_preprocess.py +0 -0
  150. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/preprocessing/mne_preprocess.py +0 -0
  151. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/preprocessing/preprocess.py +0 -0
  152. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/preprocessing/util.py +0 -0
  153. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/regressor.py +0 -0
  154. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/samplers/__init__.py +0 -0
  155. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/samplers/base.py +0 -0
  156. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/samplers/ssl.py +0 -0
  157. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/training/__init__.py +0 -0
  158. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/training/callbacks.py +0 -0
  159. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/training/losses.py +0 -0
  160. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/training/scoring.py +0 -0
  161. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/attribution.py +0 -0
  162. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/confusion_matrices.py +0 -0
  163. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/frequency.py +0 -0
  164. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/metrics.py +0 -0
  165. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/sanity.py +0 -0
  166. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode/visualization/topology.py +0 -0
  167. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode.egg-info/dependency_links.txt +0 -0
  168. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/braindecode.egg-info/top_level.txt +0 -0
  169. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/Makefile +0 -0
  170. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/_templates/autosummary/class.rst +0 -0
  171. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/_templates/autosummary/class_in_subdir.rst +0 -0
  172. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/_templates/autosummary/function.rst +0 -0
  173. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/_templates/autosummary/function_in_subdir.rst +0 -0
  174. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/cite.rst +0 -0
  175. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/help.rst +0 -0
  176. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/index.rst +0 -0
  177. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/install/install_pip.rst +0 -0
  178. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/install/install_source.rst +0 -0
  179. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/attention.rst +0 -0
  180. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/channel.rst +0 -0
  181. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/convolution.rst +0 -0
  182. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/filterbank.rst +0 -0
  183. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/gnn.rst +0 -0
  184. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/interpretable.rst +0 -0
  185. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/lbm.rst +0 -0
  186. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/recurrent.rst +0 -0
  187. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/categorization/spd.rst +0 -0
  188. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/models.rst +0 -0
  189. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/models_categorization.rst +0 -0
  190. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/models_table.rst +0 -0
  191. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/models/models_visualization.rst +0 -0
  192. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/docs/sg_execution_times.rst +0 -0
  193. {braindecode-1.8.0.dev183527593 → braindecode-1.8.1.dev167868425}/setup.cfg +0 -0
@@ -0,0 +1,78 @@
1
+ # BRAINDECODE Notice
2
+
3
+ ## Licensed Components
4
+
5
+ ### BSD-3-Clause Licensed Files
6
+
7
+ All files within the `braindecode/` package are licensed under the BSD-3-Clause
8
+ License, except for those listed in the sections below.
9
+
10
+ ### CC BY-NC 4.0 Licensed Files
11
+
12
+ The following components are licensed under the Creative Commons Attribution-NonCommercial 4.0 International License:
13
+
14
+ - `braindecode/models/eegminer.py`
15
+ - `braindecode/models/meta_neuromotor.py`
16
+ - `braindecode/models/brainmodule.py`
17
+
18
+ As well as class later imported into the `braindecode.models.module` named as GeneralizedGaussianFilter.
19
+
20
+ The `meta_neuromotor.py` file is a derivative of
21
+ `facebookresearch/generic-neuromotor-interface`, released by Meta Platforms,
22
+ Inc. under CC BY-NC 4.0, and inherits the same noncommercial terms.
23
+
24
+ ### CC BY-NC-SA 4.0 Licensed Files
25
+
26
+ The following components are licensed under the Creative Commons
27
+ Attribution-NonCommercial-ShareAlike 4.0 International License:
28
+
29
+ - `braindecode/models/emg2qwerty.py`
30
+ - `braindecode/models/vemg2pose.py`
31
+
32
+ The `emg2qwerty.py` file is a derivative of `facebookresearch/emg2qwerty`,
33
+ released by Meta Platforms, Inc. under CC BY-NC-SA 4.0, and inherits the
34
+ same noncommercial ShareAlike terms.
35
+
36
+ ### MIT Licensed Files
37
+
38
+ The following components are licensed under the MIT License:
39
+
40
+ - `braindecode/models/ctnet.py`
41
+ - `braindecode/models/dance.py`
42
+ - `braindecode/models/medformer.py`
43
+ - `braindecode/models/tcformer.py`
44
+ - `braindecode/models/ifnet.py`
45
+ - `braindecode/models/mirepnet.py`
46
+
47
+ ### Apache-2.0 Licensed Files
48
+
49
+ The following components are licensed under the Apache License 2.0:
50
+
51
+ - `braindecode/models/mvpformer.py`
52
+ - `braindecode/models/zuna.py`
53
+ - `braindecode/models/luna.py`
54
+ - `braindecode/models/brant.py`
55
+ - `braindecode/models/diver1.py`
56
+ - `braindecode/models/mscformer.py`
57
+
58
+ ### USC Academic License Files
59
+
60
+ [License](https://github.com/ShanechiLab/BaRISTA/blob/master/LICENSE.md)
61
+
62
+ - `braindecode/models/barista.py`
63
+ - `docs/_static/model/barista.jpeg`
64
+
65
+ ## License Links
66
+
67
+ - [BSD-3-Clause License](https://opensource.org/licenses/BSD-3-Clause)
68
+ - [CC BY-NC 4.0 License](https://creativecommons.org/licenses/by-nc/4.0/)
69
+ - [CC BY-NC-SA 4.0 License](https://creativecommons.org/licenses/by-nc-sa/4.0/)
70
+ - [MIT License](https://opensource.org/licenses/MIT)
71
+ - [Apache-2.0 License](https://www.apache.org/licenses/LICENSE-2.0)
72
+ - [USC Academic License](https://github.com/ShanechiLab/BaRISTA/blob/master/LICENSE.md)
73
+
74
+ ## Note
75
+
76
+ This list covers files whose own headers declare a license other than
77
+ BSD-3-Clause. Per-file provenance review of the remaining models is
78
+ tracked separately.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: braindecode
3
- Version: 1.8.0.dev183527593
3
+ Version: 1.8.1.dev167868425
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,8 +22,8 @@ Requires-Python: >=3.11
22
22
  Description-Content-Type: text/x-rst
23
23
  License-File: LICENSE.txt
24
24
  License-File: NOTICE.txt
25
- Requires-Dist: torch>=2.0
26
- Requires-Dist: torchaudio>=2.0
25
+ Requires-Dist: torch>=2.4
26
+ Requires-Dist: torchaudio>=2.4
27
27
  Requires-Dist: mne>=1.11.0
28
28
  Requires-Dist: mne_bids>=0.18
29
29
  Requires-Dist: h5py
@@ -34,7 +34,6 @@ Requires-Dist: pandas
34
34
  Requires-Dist: wfdb>=4.3.1
35
35
  Requires-Dist: linear_attention_transformer
36
36
  Requires-Dist: docstring_inheritance
37
- Requires-Dist: rotary_embedding_torch
38
37
  Requires-Dist: pydantic>=2.0
39
38
  Provides-Extra: moabb
40
39
  Requires-Dist: moabb>=1.4.3; extra == "moabb"
@@ -45,19 +44,23 @@ Requires-Dist: huggingface_hub[torch]>=0.20.0; extra == "hub"
45
44
  Requires-Dist: zarr>=3.0; extra == "hub"
46
45
  Provides-Extra: viz
47
46
  Requires-Dist: captum>=0.7.0; extra == "viz"
47
+ Provides-Extra: sae
48
+ Requires-Dist: sae-lens==6.51.3; extra == "sae"
48
49
  Provides-Extra: tests
49
50
  Requires-Dist: pytest<9.1; extra == "tests"
50
51
  Requires-Dist: pytest-cov; extra == "tests"
52
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "tests"
51
53
  Requires-Dist: codecov; extra == "tests"
52
54
  Requires-Dist: pytest_cases; extra == "tests"
53
55
  Requires-Dist: mypy; extra == "tests"
56
+ Requires-Dist: ipython; extra == "tests"
54
57
  Requires-Dist: transformers>=4.57.0; extra == "tests"
55
58
  Requires-Dist: bids_validator; extra == "tests"
56
59
  Provides-Extra: typing
57
60
  Requires-Dist: exca>=0.5.10; extra == "typing"
58
61
  Requires-Dist: numpydantic>=1.7; extra == "typing"
59
62
  Provides-Extra: docs
60
- Requires-Dist: sphinx_gallery; extra == "docs"
63
+ Requires-Dist: sphinx_gallery>=0.17; extra == "docs"
61
64
  Requires-Dist: sphinx_rtd_theme; extra == "docs"
62
65
  Requires-Dist: sphinx-autodoc-typehints; extra == "docs"
63
66
  Requires-Dist: sphinx-autobuild; extra == "docs"
@@ -260,7 +263,10 @@ This project is primarily licensed under the BSD-3-Clause License.
260
263
  Additional Components
261
264
  =====================
262
265
 
263
- Some components within this repository are licensed under the Creative Commons
264
- Attribution-NonCommercial 4.0 International License.
266
+ Some components within this repository are licensed under other licenses, including
267
+ Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0), Creative
268
+ Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0), MIT
269
+ and Apache-2.0.
265
270
 
266
- Please refer to the ``LICENSE`` and ``NOTICE`` files for more detailed information.
271
+ Please refer to the ``LICENSE`` and ``NOTICE`` files for the per-file list and more
272
+ detailed information.
@@ -170,7 +170,10 @@ This project is primarily licensed under the BSD-3-Clause License.
170
170
  Additional Components
171
171
  =====================
172
172
 
173
- Some components within this repository are licensed under the Creative Commons
174
- Attribution-NonCommercial 4.0 International License.
173
+ Some components within this repository are licensed under other licenses, including
174
+ Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0), Creative
175
+ Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0), MIT
176
+ and Apache-2.0.
175
177
 
176
- Please refer to the ``LICENSE`` and ``NOTICE`` files for more detailed information.
178
+ Please refer to the ``LICENSE`` and ``NOTICE`` files for the per-file list and more
179
+ detailed information.
@@ -1002,7 +1002,7 @@ def sensors_rotation(
1002
1002
  ``mne`` through::
1003
1003
 
1004
1004
  >>> ten_twenty_montage = mne.channels.make_standard_montage(
1005
- ... 'standard_1020'
1005
+ ... 'standard_1020' # 'colin27_1020' on MNE >= 1.13
1006
1006
  ... ).get_positions()['ch_pos']
1007
1007
  axis : 'x' | 'y' | 'z'
1008
1008
  Axis around which to rotate.
@@ -13,6 +13,8 @@ import numpy as np
13
13
  import torch
14
14
  from mne.channels import make_standard_montage
15
15
 
16
+ from braindecode.util import resolve_montage_name
17
+
16
18
  from .base import Transform
17
19
  from .functional import (
18
20
  amplitude_scale,
@@ -703,7 +705,7 @@ def _get_standard_10_20_positions(raw_or_epoch=None, ordered_ch_names=None):
703
705
  )
704
706
  if ordered_ch_names is None:
705
707
  ordered_ch_names = raw_or_epoch.info["ch_names"]
706
- ten_twenty_montage = make_standard_montage("standard_1020")
708
+ ten_twenty_montage = make_standard_montage(resolve_montage_name("standard_1020"))
707
709
  positions_dict = ten_twenty_montage.get_positions()["ch_pos"]
708
710
  positions_subdict = {
709
711
  k: positions_dict[k] for k in ordered_ch_names if k in positions_dict
@@ -729,7 +731,7 @@ class SensorsRotation(Transform):
729
731
  `mne` through::
730
732
 
731
733
  >>> ten_twenty_montage = mne.channels.make_standard_montage(
732
- ... 'standard_1020'
734
+ ... 'standard_1020' # 'colin27_1020' on MNE >= 1.13
733
735
  ... ).get_positions()['ch_pos']
734
736
 
735
737
  axis : 'x' | 'y' | 'z', optional
@@ -0,0 +1,255 @@
1
+ # Authors: Bruno Aristimunha <b.aristimunha@gmail.com>
2
+ #
3
+ # License: BSD (3-clause)
4
+ """Serverless in-notebook viewer for file-backed recordings.
5
+
6
+ The bytes on disk behind a dataset element are inlined in the cell output
7
+ as base64 and handed to the deployed eegdash-viewer over its ``postMessage``
8
+ bridge (``docs/embedding.md`` in https://github.com/eegdash/eegdash-viewer):
9
+ no server, no CORS. The output is an iframe plus an inline script, so it
10
+ renders when the cell ran in your session or the saved notebook is trusted
11
+ (``jupyter trust``).
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import base64
17
+ import json
18
+ import os
19
+ import uuid
20
+ from pathlib import Path
21
+ from urllib.parse import urlsplit
22
+
23
+ import mne_bids
24
+ from mne.utils import _soft_import
25
+
26
+ CDN = "https://eegdash.github.io/eegdash-viewer"
27
+ MAX_BYTES = 64 * 2**20 # base64 output per call; it is saved with the notebook
28
+ EXTENSIONS = {
29
+ ".set",
30
+ ".edf",
31
+ ".bdf",
32
+ ".vhdr",
33
+ ".fif",
34
+ ".snirf",
35
+ ".nwb",
36
+ } # viewer readers
37
+ _BIDS = {"eeg", "ieeg", "emg", "meg", "nirs"}
38
+ _SIBLINGS = {".vhdr": (".eeg", ".vmrk"), ".set": (".fdt",)} # travel with the header
39
+ _HEADER = {s: h for h, ss in _SIBLINGS.items() for s in ss} # data file -> header
40
+
41
+ _SCRIPT = """<iframe id=%(id)s title="eegdash trace viewer" style="width:100%%;height:%(height)spx;
42
+ border:1px solid var(--jp-border-color1,#d9dce1);border-radius:6px;background:transparent"></iframe>
43
+ <script>
44
+ (function () {
45
+ var self = document.currentScript, id = %(id)s; // Lab re-runs scripts in place; VS Code/nbclassic elsewhere
46
+ var frame = (self && self.previousElementSibling && self.previousElementSibling.tagName === "IFRAME")
47
+ ? self.previousElementSibling : document.getElementById(id);
48
+ if (!frame) { console.error("eegdash viewer: output iframe " + id + " not found"); return; }
49
+ var payload = %(payload)s, origin = %(origin)s, files = null, pose = null;
50
+ function decode(b64) {
51
+ if (Uint8Array.fromBase64) return Uint8Array.fromBase64(b64);
52
+ var bin = atob(b64), out = new Uint8Array(bin.length);
53
+ for (var i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);
54
+ return out;
55
+ }
56
+ function send(target) {
57
+ try {
58
+ if (!files) {
59
+ files = payload.files.map(function (f) { return new File([decode(f.b64)], f.name); });
60
+ pose = payload.pose ? "data:application/json;base64," + payload.pose : null;
61
+ payload = null;
62
+ }
63
+ frame.contentWindow.postMessage({ type: "eegdash-viewer:open", files: files, pose: pose }, target || origin);
64
+ } catch (err) {
65
+ frame.insertAdjacentHTML("afterend", '<div style="font:12px system-ui;color:#b3261e">eegdash viewer: '
66
+ + String(err.message).replace(/</g, "&lt;") + "</div>");
67
+ }
68
+ }
69
+ window.addEventListener("message", function onMessage(e) {
70
+ if (e.source === frame.contentWindow && e.data && e.data.type === "eegdash-viewer:ready") send(e.origin);
71
+ else if (!frame.isConnected) window.removeEventListener("message", onMessage);
72
+ });
73
+ frame.src = %(src)s; // after the listener, so "ready" can never precede it
74
+ })();
75
+ </script>"""
76
+
77
+
78
+ def recording_files(recording: Path) -> tuple[list[Path], Path | None]:
79
+ """``(files, pose)`` to inline for a recording: the header first, then the
80
+ split-format siblings, the BIDS-inherited ``_channels.tsv``/``_events.tsv``
81
+ (``mne_bids`` parses the name; plain names get none) and, separately, the
82
+ ``<prefix>_desc-pose.json`` hand-pose sidecar next to it. Symlinks keep
83
+ their name (git-annex/datalad)."""
84
+ rec = Path(recording)
85
+ if not rec.exists():
86
+ raise ValueError(
87
+ f"{rec.name}: file not found (a datalad symlink may need `datalad get`)"
88
+ )
89
+ if (
90
+ rec.is_dir()
91
+ or rec.suffix.lower() not in EXTENSIONS
92
+ or rec.stem.endswith("_epo")
93
+ ):
94
+ raise ValueError(
95
+ f"{rec.name}: the viewer opens raw recordings in {' '.join(sorted(EXTENSIONS))}"
96
+ )
97
+ sidecars: list[Path | None] = []
98
+ try:
99
+ bids = mne_bids.get_bids_path_from_fname(rec, check=False)
100
+ if bids.subject is not None: # hyphen-free names parse, but are not BIDS
101
+ sidecars = [
102
+ bids.find_matching_sidecar(
103
+ suffix=s, extension=".tsv", on_error="ignore"
104
+ )
105
+ for s in ("channels", "events")
106
+ ]
107
+ except (
108
+ KeyError,
109
+ ValueError,
110
+ ): # not a BIDS name / unknown entity somewhere in the tree
111
+ pass
112
+ files = [rec]
113
+ for p in [
114
+ rec.with_suffix(e) for e in _SIBLINGS.get(rec.suffix.lower(), ())
115
+ ] + sidecars:
116
+ if p and p.is_file():
117
+ if p not in files:
118
+ files.append(p)
119
+ elif p and p.is_symlink(): # dangling: git-annex/datalad content not fetched
120
+ raise ValueError(f"{p.name}: dangling symlink (try `datalad get`)")
121
+ stem, _, token = rec.stem.rpartition("_")
122
+ pose = rec.with_name((stem if token in _BIDS else rec.stem) + "_desc-pose.json")
123
+ return files, pose if pose.is_file() else None
124
+
125
+
126
+ def build_viewer_html(
127
+ recording: Path,
128
+ *,
129
+ height: int = 520,
130
+ cdn_url: str = CDN,
131
+ max_bytes: int = MAX_BYTES,
132
+ ) -> str:
133
+ """Viewer iframe + inlined bytes + bridge script for one recording."""
134
+ url = urlsplit(cdn_url)
135
+ if (
136
+ url.scheme not in ("http", "https")
137
+ or not url.netloc
138
+ or url.username
139
+ or url.query
140
+ or url.fragment
141
+ or url.path.endswith(("index.html", "index.htm"))
142
+ ):
143
+ raise ValueError(
144
+ f"cdn_url must be the viewer's base http(s) URL, got {cdn_url!r}"
145
+ )
146
+ files, pose = recording_files(recording)
147
+ encoded = sum(
148
+ 4 * -(-p.stat().st_size // 3) for p in files + ([pose] if pose else [])
149
+ )
150
+ if encoded > max_bytes:
151
+ raise ValueError(
152
+ f"{files[0].name}: {encoded / 2**20:.1f} MiB of base64 would be inlined into the "
153
+ f"notebook output (max_bytes={max_bytes / 2**20:.1f} MiB); crop/downsample or raise it"
154
+ )
155
+ rec = files[0]
156
+ # The viewer picks the recording by its *_<datatype>.<ext> name: plain names
157
+ # are posted as <stem>_eeg<ext>, an EEGLAB .fdt next to the posted .set name.
158
+ head = (
159
+ rec.name
160
+ if rec.stem.rpartition("_")[2] in _BIDS
161
+ else f"{rec.stem}_eeg{rec.suffix.lower()}"
162
+ )
163
+ names = [head] + [
164
+ head.rsplit("_", 1)[0] + "_eeg.fdt" if p.suffix.lower() == ".fdt" else p.name
165
+ for p in files[1:]
166
+ ]
167
+ b64 = [base64.b64encode(p.read_bytes()).decode() for p in files]
168
+ literals = {
169
+ "id": f"eegdash-viewer-{uuid.uuid4().hex[:8]}",
170
+ "height": int(height),
171
+ "payload": {
172
+ "files": [{"name": n, "b64": b} for n, b in zip(names, b64)],
173
+ "pose": base64.b64encode(pose.read_bytes()).decode() if pose else None,
174
+ },
175
+ "origin": f"{url.scheme}://{url.netloc}",
176
+ "src": f"{url.geturl().rstrip('/')}/index.html?embed=1",
177
+ }
178
+ return _SCRIPT % {
179
+ k: json.dumps(v).replace("<", "\\u003c") for k, v in literals.items()
180
+ }
181
+
182
+
183
+ def _recording(dataset, index: int) -> Path:
184
+ """File behind ``dataset.datasets[index]``: the one its mne ``raw`` reads (a
185
+ data file maps back to its header; lazily downloading datasets fetch it when
186
+ ``raw`` is accessed) or the recorded ``description["path"]``."""
187
+ ds = dataset.datasets[index]
188
+ names = [
189
+ Path(f)
190
+ for f in getattr(getattr(ds, "raw", None), "filenames", None) or ()
191
+ if isinstance(f, (str, os.PathLike))
192
+ ]
193
+ if len(names) > 1:
194
+ raise ValueError(
195
+ f"{type(dataset).__name__}[{index}]: split recordings are not supported"
196
+ )
197
+ desc = getattr(ds, "description", None) # dict or pandas Series
198
+ recorded = desc.get("path") if desc is not None else None
199
+ path = (
200
+ names[0]
201
+ if names
202
+ else Path(recorded)
203
+ if isinstance(recorded, (str, os.PathLike))
204
+ else None
205
+ )
206
+ if path is None:
207
+ raise ValueError(
208
+ f"{type(dataset).__name__}[{index}] is not backed by a recording file"
209
+ )
210
+ header = path.with_suffix(_HEADER.get(path.suffix.lower(), path.suffix))
211
+ return header if header.is_file() else path
212
+
213
+
214
+ def plot(
215
+ dataset,
216
+ index: int = 0,
217
+ *,
218
+ height: int = 520,
219
+ cdn_url: str = CDN,
220
+ max_bytes: int = MAX_BYTES,
221
+ ):
222
+ """Show one recording in the eegdash-viewer inside a Jupyter cell.
223
+
224
+ Serverless: the recording bytes (as on disk) are inlined in the output and
225
+ pushed to the viewer at ``cdn_url`` over ``postMessage``; the output renders
226
+ when the cell ran in your session or the notebook is trusted. A
227
+ ``*_desc-pose.json`` sidecar next to the recording adds the synchronized
228
+ hand-pose panel. Needs IPython (soft dependency).
229
+
230
+ Parameters
231
+ ----------
232
+ index : int
233
+ Recording to display.
234
+ height : int
235
+ Viewer height in pixels.
236
+ cdn_url : str
237
+ Base URL of a deployed eegdash-viewer.
238
+ max_bytes : int
239
+ Refuse to inline more than this much base64 (default 64 MiB); the
240
+ payload is saved with the notebook and, like any cell output, stays
241
+ referenced by IPython's ``Out`` history for the session.
242
+
243
+ Returns
244
+ -------
245
+ IPython.display.HTML
246
+ """
247
+ ipython = _soft_import("IPython", purpose=f"{type(dataset).__name__}.plot()")
248
+ return ipython.display.HTML(
249
+ build_viewer_html(
250
+ _recording(dataset, index),
251
+ height=height,
252
+ cdn_url=cdn_url,
253
+ max_bytes=max_bytes,
254
+ )
255
+ )
@@ -5,6 +5,7 @@
5
5
  # Simon Brandt <simonbrandt@protonmail.com>
6
6
  # David Sabbagh <dav.sabbagh@gmail.com>
7
7
  # Robin Schirrmeister <robintibor@gmail.com>
8
+ # Sarthak Tayal <sarthaktayal2@gmail.com>
8
9
  #
9
10
  # License: BSD (3-clause)
10
11
 
@@ -32,6 +33,7 @@ from mne.utils.docs import deprecated
32
33
  from torch.utils.data import ConcatDataset, Dataset, IterableDataset
33
34
  from typing_extensions import TypeVar
34
35
 
36
+ from ._notebook_viewer import plot as _viewer_plot
35
37
  from .bids.hub import HubDatasetMixin
36
38
  from .bids.hub_io import _restore_nan_from_json
37
39
  from .registry import register_dataset
@@ -59,6 +61,7 @@ def _html_row(label, value):
59
61
 
60
62
  _METADATA_INTERNAL_COLS = {
61
63
  "i_window_in_trial",
64
+ "i_trial_in_dataset",
62
65
  "i_start_in_trial",
63
66
  "i_stop_in_trial",
64
67
  "target",
@@ -1173,6 +1176,8 @@ class BaseConcatDataset(ConcatDataset, HubDatasetMixin, Generic[T]):
1173
1176
  If True, defer computing cumulative sizes until length or item access.
1174
1177
  """
1175
1178
 
1179
+ plot = _viewer_plot # eegdash-viewer embed; a direct member so the API docs list it
1180
+
1176
1181
  datasets: list[T]
1177
1182
 
1178
1183
  def __init__(
@@ -1374,12 +1379,29 @@ class BaseConcatDataset(ConcatDataset, HubDatasetMixin, Generic[T]):
1374
1379
  "datasets are WindowsDataset."
1375
1380
  )
1376
1381
 
1382
+ for ds in self.datasets:
1383
+ if hasattr(ds, "_windows") and ds._windows is not None:
1384
+ df = ds._windows.metadata
1385
+ else:
1386
+ df = ds.metadata
1387
+ if (
1388
+ "i_trial_in_dataset" in df.columns
1389
+ and "i_trial_in_dataset" in ds.description
1390
+ ):
1391
+ raise ValueError(
1392
+ "Dataset descriptions cannot contain the reserved window "
1393
+ "metadata key 'i_trial_in_dataset'."
1394
+ )
1395
+
1377
1396
  all_dfs = list()
1378
1397
  for ds in self.datasets:
1379
1398
  if hasattr(ds, "_windows") and ds._windows is not None:
1380
1399
  df = ds._windows.metadata
1381
1400
  else:
1382
1401
  df = ds.metadata
1402
+ if isinstance(df, pd.DataFrame):
1403
+ # copy so the description columns stay out of the dataset
1404
+ df = df.copy()
1383
1405
  for k, v in ds.description.items():
1384
1406
  df[k] = v
1385
1407
  all_dfs.append(df)
@@ -25,6 +25,7 @@ import pandas as pd
25
25
  from joblib import Parallel, delayed
26
26
 
27
27
  from braindecode.datasets.base import BaseConcatDataset, RawDataset
28
+ from braindecode.util import resolve_montage_name
28
29
 
29
30
 
30
31
  class TUH(BaseConcatDataset):
@@ -182,7 +183,9 @@ class TUH(BaseConcatDataset):
182
183
  }
183
184
  raw.rename_channels(mapping_strip)
184
185
 
185
- montage1005 = mne.channels.make_standard_montage("standard_1005")
186
+ montage1005 = mne.channels.make_standard_montage(
187
+ resolve_montage_name("standard_1005")
188
+ )
186
189
  mapping_eeg_names = {
187
190
  c.upper(): c for c in montage1005.ch_names if c.upper() in raw.ch_names
188
191
  }
@@ -207,7 +210,9 @@ class TUH(BaseConcatDataset):
207
210
 
208
211
  @staticmethod
209
212
  def _set_montage(raw):
210
- montage = mne.channels.make_standard_montage("standard_1005")
213
+ montage = mne.channels.make_standard_montage(
214
+ resolve_montage_name("standard_1005")
215
+ )
211
216
  raw.set_montage(montage, on_missing="ignore")
212
217
 
213
218
  @staticmethod
@@ -1,6 +1,7 @@
1
1
  """Convenience functions for storing and loading of windows datasets."""
2
2
 
3
3
  # Authors: Lukas Gemein <l.gemein@gmail.com>
4
+ # Sarthak Tayal <sarthaktayal2@gmail.com>
4
5
  #
5
6
  # License: BSD (3-clause)
6
7
 
@@ -270,7 +271,9 @@ def _load_parallel(path, i, preload, is_raw, has_stored_windows):
270
271
  else:
271
272
  window_kwargs = _load_kwargs_json("window_kwargs", sub_dir)
272
273
  windows_ds_kwargs = [
273
- kwargs[1] for kwargs in window_kwargs if kwargs[0] == "WindowsDataset"
274
+ kwargs[1]
275
+ for kwargs in window_kwargs
276
+ if kwargs[0] in ("WindowsDataset", "EEGWindowsDataset")
274
277
  ]
275
278
  windows_ds_kwargs = windows_ds_kwargs[0] if len(windows_ds_kwargs) == 1 else {}
276
279
  if is_raw:
@@ -8,6 +8,7 @@ from .functions import (
8
8
  iou_1d,
9
9
  pairwise_iou_1d,
10
10
  plv_time,
11
+ rotate_pairs,
11
12
  safe_log,
12
13
  sinusoidal_positional_encoding,
13
14
  square,
@@ -25,6 +26,7 @@ __all__ = [
25
26
  "iou_1d",
26
27
  "pairwise_iou_1d",
27
28
  "plv_time",
29
+ "rotate_pairs",
28
30
  "safe_log",
29
31
  "sinusoidal_positional_encoding",
30
32
  "square",