eegdash 0.3.6.dev183416654__tar.gz → 0.3.7.dev183881899__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.

Potentially problematic release.


This version of eegdash might be problematic. Click here for more details.

Files changed (58) hide show
  1. {eegdash-0.3.6.dev183416654/eegdash.egg-info → eegdash-0.3.7.dev183881899}/PKG-INFO +1 -1
  2. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/__init__.py +1 -1
  3. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/api.py +28 -3
  4. eegdash-0.3.6.dev183416654/eegdash/dataset.py → eegdash-0.3.7.dev183881899/eegdash/const.py +0 -95
  5. eegdash-0.3.7.dev183881899/eegdash/dataset.py +118 -0
  6. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899/eegdash.egg-info}/PKG-INFO +1 -1
  7. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash.egg-info/SOURCES.txt +1 -0
  8. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/LICENSE +0 -0
  9. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/MANIFEST.in +0 -0
  10. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/README.md +0 -0
  11. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/Makefile +0 -0
  12. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/conf.py +0 -0
  13. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/dataset_summary.rst +0 -0
  14. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/index.rst +0 -0
  15. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/install/install.rst +0 -0
  16. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/install/install_pip.rst +0 -0
  17. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/install/install_source.rst +0 -0
  18. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/docs/source/overview.rst +0 -0
  19. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/data_config.py +0 -0
  20. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/data_utils.py +0 -0
  21. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/dataset_summary.csv +0 -0
  22. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/__init__.py +0 -0
  23. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/datasets.py +0 -0
  24. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/decorators.py +0 -0
  25. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/extractors.py +0 -0
  26. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/__init__.py +0 -0
  27. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/complexity.py +0 -0
  28. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/connectivity.py +0 -0
  29. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/csp.py +0 -0
  30. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/dimensionality.py +0 -0
  31. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/signal.py +0 -0
  32. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/spectral.py +0 -0
  33. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/feature_bank/utils.py +0 -0
  34. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/inspect.py +0 -0
  35. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/serialization.py +0 -0
  36. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/features/utils.py +0 -0
  37. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/mongodb.py +0 -0
  38. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/preprocessing.py +0 -0
  39. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/registry.py +0 -0
  40. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash/utils.py +0 -0
  41. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash.egg-info/dependency_links.txt +0 -0
  42. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash.egg-info/requires.txt +0 -0
  43. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/eegdash.egg-info/top_level.txt +0 -0
  44. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/pyproject.toml +0 -0
  45. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/setup.cfg +0 -0
  46. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_api.py +0 -0
  47. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_challenge_kwargs.py +0 -0
  48. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_correctness.py +0 -0
  49. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_database.py +0 -0
  50. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_dataset.py +0 -0
  51. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_dataset_registration.py +0 -0
  52. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_eegdash.py +0 -0
  53. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_functional.py +0 -0
  54. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_init.py +0 -0
  55. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_minirelease.py +0 -0
  56. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_mongo_connection.py +0 -0
  57. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_offline.py +0 -0
  58. {eegdash-0.3.6.dev183416654 → eegdash-0.3.7.dev183881899}/tests/test_query.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eegdash
3
- Version: 0.3.6.dev183416654
3
+ Version: 0.3.7.dev183881899
4
4
  Summary: EEG data for machine learning
5
5
  Author-email: Young Truong <dt.young112@gmail.com>, Arnaud Delorme <adelorme@gmail.com>, Aviv Dotan <avivd220@gmail.com>, Oren Shriki <oren70@gmail.com>, Bruno Aristimunha <b.aristimunha@gmail.com>
6
6
  License-Expression: GPL-3.0-only
@@ -7,4 +7,4 @@ __init__mongo_client()
7
7
 
8
8
  __all__ = ["EEGDash", "EEGDashDataset", "EEGChallengeDataset"]
9
9
 
10
- __version__ = "0.3.6.dev183416654"
10
+ __version__ = "0.3.7.dev183881899"
@@ -17,6 +17,7 @@ from s3fs import S3FileSystem
17
17
 
18
18
  from braindecode.datasets import BaseConcatDataset
19
19
 
20
+ from .const import RELEASE_TO_OPENNEURO_DATASET_MAP
20
21
  from .data_config import config as data_config
21
22
  from .data_utils import EEGBIDSDataset, EEGDashBaseDataset
22
23
  from .mongodb import MongoConnectionManager
@@ -710,6 +711,7 @@ class EEGDashDataset(BaseConcatDataset):
710
711
  eeg_dash_instance=None,
711
712
  records: list[dict] | None = None,
712
713
  offline_mode: bool = False,
714
+ n_jobs: int = -1,
713
715
  **kwargs,
714
716
  ):
715
717
  """Create a new EEGDashDataset from a given query or local BIDS dataset directory
@@ -758,6 +760,8 @@ class EEGDashDataset(BaseConcatDataset):
758
760
  offline_mode : bool
759
761
  If True, do not attempt to query MongoDB at all. This is useful if you want to
760
762
  work with a local cache only, or if you are offline.
763
+ n_jobs : int
764
+ The number of jobs to run in parallel (default is -1, meaning using all processors).
761
765
  kwargs : dict
762
766
  Additional keyword arguments to be passed to the EEGDashBaseDataset
763
767
  constructor.
@@ -780,7 +784,22 @@ class EEGDashDataset(BaseConcatDataset):
780
784
  raise ValueError("You must provide a 'dataset' argument")
781
785
 
782
786
  self.data_dir = self.cache_dir / self.query["dataset"]
783
-
787
+ if self.query["dataset"] in RELEASE_TO_OPENNEURO_DATASET_MAP.values():
788
+ warn(
789
+ "If you are not participating in the competition, you can ignore this warning!"
790
+ "\n\n"
791
+ "EEG 2025 Competition Data Notice:\n"
792
+ "---------------------------------\n"
793
+ " You are loading the dataset that is used in the EEG 2025 Competition:\n"
794
+ "IMPORTANT: The data accessed via `EEGDashDataset` is NOT identical to what you get from `EEGChallengeDataset` object directly.\n"
795
+ "and it is not what you will use for the competition. Downsampling and filtering were applied to the data"
796
+ "to allow more people to participate.\n"
797
+ "\n",
798
+ "If you are participating in the competition, always use `EEGChallengeDataset` to ensure consistency with the challenge data.\n"
799
+ "\n",
800
+ UserWarning,
801
+ module="eegdash",
802
+ )
784
803
  _owns_client = False
785
804
  if self.eeg_dash is None and records is None:
786
805
  self.eeg_dash = EEGDash()
@@ -801,11 +820,12 @@ class EEGDashDataset(BaseConcatDataset):
801
820
  elif offline_mode: # only assume local data is complete if in offline mode
802
821
  if self.data_dir.exists():
803
822
  # This path loads from a local directory and is not affected by DB query logic
804
- datasets = self.load_bids_dataset(
823
+ datasets = self.load_bids_daxtaset(
805
824
  dataset=self.query["dataset"],
806
825
  data_dir=self.data_dir,
807
826
  description_fields=description_fields,
808
827
  s3_bucket=s3_bucket,
828
+ n_jobs=n_jobs,
809
829
  **base_dataset_kwargs,
810
830
  )
811
831
  else:
@@ -898,6 +918,7 @@ class EEGDashDataset(BaseConcatDataset):
898
918
  data_dir: str | Path,
899
919
  description_fields: list[str],
900
920
  s3_bucket: str | None = None,
921
+ n_jobs: int = -1,
901
922
  **kwargs,
902
923
  ):
903
924
  """Helper method to load a single local BIDS dataset and return it as a list of
@@ -912,13 +933,17 @@ class EEGDashDataset(BaseConcatDataset):
912
933
  description_fields : list[str]
913
934
  A list of fields to be extracted from the dataset records
914
935
  and included in the returned dataset description(s).
936
+ s3_bucket : str | None
937
+ The S3 bucket to upload the dataset files to (if any).
938
+ n_jobs : int
939
+ The number of jobs to run in parallel (default is -1, meaning using all processors).
915
940
 
916
941
  """
917
942
  bids_dataset = EEGBIDSDataset(
918
943
  data_dir=data_dir,
919
944
  dataset=dataset,
920
945
  )
921
- datasets = Parallel(n_jobs=-1, prefer="threads", verbose=1)(
946
+ datasets = Parallel(n_jobs=n_jobs, prefer="threads", verbose=1)(
922
947
  delayed(self.get_base_dataset_from_bids_file)(
923
948
  bids_dataset=bids_dataset,
924
949
  bids_file=bids_file,
@@ -1,8 +1,3 @@
1
- from pathlib import Path
2
-
3
- from .api import EEGDashDataset
4
- from .registry import register_openneuro_datasets
5
-
6
1
  RELEASE_TO_OPENNEURO_DATASET_MAP = {
7
2
  "R11": "ds005516",
8
3
  "R10": "ds005515",
@@ -261,93 +256,3 @@ SUBJECT_MINI_RELEASE_MAP = {
261
256
  "NDARFW972KFQ",
262
257
  ],
263
258
  }
264
-
265
-
266
- class EEGChallengeDataset(EEGDashDataset):
267
- def __init__(
268
- self,
269
- release: str,
270
- cache_dir: str,
271
- mini: bool = True,
272
- query: dict | None = None,
273
- s3_bucket: str | None = "s3://nmdatasets/NeurIPS25",
274
- **kwargs,
275
- ):
276
- """Create a new EEGDashDataset from a given query or local BIDS dataset directory
277
- and dataset name. An EEGDashDataset is pooled collection of EEGDashBaseDataset
278
- instances (individual recordings) and is a subclass of braindecode's BaseConcatDataset.
279
-
280
- Parameters
281
- ----------
282
- release: str
283
- Release name. Can be one of ["R1", ..., "R11"]
284
- mini: bool, default True
285
- Whether to use the mini-release version of the dataset. It is recommended
286
- to use the mini version for faster training and evaluation.
287
- query : dict | None
288
- Optionally a dictionary that specifies a query to be executed,
289
- in addition to the dataset (automatically inferred from the release argument).
290
- See EEGDash.find() for details on the query format.
291
- cache_dir : str
292
- A directory where the dataset will be cached locally.
293
- s3_bucket : str | None
294
- An optional S3 bucket URI to use instead of the
295
- default OpenNeuro bucket for loading data files.
296
- kwargs : dict
297
- Additional keyword arguments to be passed to the EEGDashDataset
298
- constructor.
299
-
300
- """
301
- self.release = release
302
- self.mini = mini
303
-
304
- if release not in RELEASE_TO_OPENNEURO_DATASET_MAP:
305
- raise ValueError(
306
- f"Unknown release: {release}, expected one of {list(RELEASE_TO_OPENNEURO_DATASET_MAP.keys())}"
307
- )
308
-
309
- dataset_parameters = []
310
- if isinstance(release, str):
311
- dataset_parameters.append(RELEASE_TO_OPENNEURO_DATASET_MAP[release])
312
- else:
313
- raise ValueError(
314
- f"Unknown release type: {type(release)}, the expected type is str."
315
- )
316
-
317
- if query and "dataset" in query:
318
- raise ValueError(
319
- "Query using the parameters `dataset` with the class EEGChallengeDataset is not possible."
320
- "Please use the release argument instead, or the object EEGDashDataset instead."
321
- )
322
-
323
- if self.mini:
324
- # Disallow mixing subject selection with mini=True since mini already
325
- # applies a predefined subject subset.
326
- if (query and "subject" in query) or ("subject" in kwargs):
327
- raise ValueError(
328
- "Query using the parameters `subject` with the class EEGChallengeDataset and `mini==True` is not possible."
329
- "Please don't use the `subject` selection twice."
330
- "Set `mini=False` to use the `subject` selection."
331
- )
332
- kwargs["subject"] = SUBJECT_MINI_RELEASE_MAP[release]
333
- s3_bucket = f"{s3_bucket}/{release}_mini_L100_bdf"
334
- else:
335
- s3_bucket = f"{s3_bucket}/{release}_L100_bdf"
336
-
337
- super().__init__(
338
- dataset=RELEASE_TO_OPENNEURO_DATASET_MAP[release],
339
- query=query,
340
- cache_dir=cache_dir,
341
- s3_bucket=s3_bucket,
342
- **kwargs,
343
- )
344
-
345
-
346
- registered_classes = register_openneuro_datasets(
347
- summary_file=Path(__file__).with_name("dataset_summary.csv"),
348
- base_class=EEGDashDataset,
349
- namespace=globals(),
350
- )
351
-
352
-
353
- __all__ = ["EEGChallengeDataset"] + list(registered_classes.keys())
@@ -0,0 +1,118 @@
1
+ import logging
2
+ from pathlib import Path
3
+
4
+ from mne.utils import warn
5
+
6
+ from .api import EEGDashDataset
7
+ from .const import RELEASE_TO_OPENNEURO_DATASET_MAP, SUBJECT_MINI_RELEASE_MAP
8
+ from .registry import register_openneuro_datasets
9
+
10
+ logger = logging.getLogger("eegdash")
11
+
12
+
13
+ class EEGChallengeDataset(EEGDashDataset):
14
+ def __init__(
15
+ self,
16
+ release: str,
17
+ cache_dir: str,
18
+ mini: bool = True,
19
+ query: dict | None = None,
20
+ s3_bucket: str | None = "s3://nmdatasets/NeurIPS25",
21
+ **kwargs,
22
+ ):
23
+ """Create a new EEGDashDataset from a given query or local BIDS dataset directory
24
+ and dataset name. An EEGDashDataset is pooled collection of EEGDashBaseDataset
25
+ instances (individual recordings) and is a subclass of braindecode's BaseConcatDataset.
26
+
27
+ Parameters
28
+ ----------
29
+ release: str
30
+ Release name. Can be one of ["R1", ..., "R11"]
31
+ mini: bool, default True
32
+ Whether to use the mini-release version of the dataset. It is recommended
33
+ to use the mini version for faster training and evaluation.
34
+ query : dict | None
35
+ Optionally a dictionary that specifies a query to be executed,
36
+ in addition to the dataset (automatically inferred from the release argument).
37
+ See EEGDash.find() for details on the query format.
38
+ cache_dir : str
39
+ A directory where the dataset will be cached locally.
40
+ s3_bucket : str | None
41
+ An optional S3 bucket URI to use instead of the
42
+ default OpenNeuro bucket for loading data files.
43
+ kwargs : dict
44
+ Additional keyword arguments to be passed to the EEGDashDataset
45
+ constructor.
46
+
47
+ """
48
+ self.release = release
49
+ self.mini = mini
50
+
51
+ if release not in RELEASE_TO_OPENNEURO_DATASET_MAP:
52
+ raise ValueError(
53
+ f"Unknown release: {release}, expected one of {list(RELEASE_TO_OPENNEURO_DATASET_MAP.keys())}"
54
+ )
55
+
56
+ dataset_parameters = []
57
+ if isinstance(release, str):
58
+ dataset_parameters.append(RELEASE_TO_OPENNEURO_DATASET_MAP[release])
59
+ else:
60
+ raise ValueError(
61
+ f"Unknown release type: {type(release)}, the expected type is str."
62
+ )
63
+
64
+ if query and "dataset" in query:
65
+ raise ValueError(
66
+ "Query using the parameters `dataset` with the class EEGChallengeDataset is not possible."
67
+ "Please use the release argument instead, or the object EEGDashDataset instead."
68
+ )
69
+
70
+ if self.mini:
71
+ # Disallow mixing subject selection with mini=True since mini already
72
+ # applies a predefined subject subset.
73
+ if (query and "subject" in query) or ("subject" in kwargs):
74
+ raise ValueError(
75
+ "Query using the parameters `subject` with the class EEGChallengeDataset and `mini==True` is not possible."
76
+ "Please don't use the `subject` selection twice."
77
+ "Set `mini=False` to use the `subject` selection."
78
+ )
79
+ kwargs["subject"] = SUBJECT_MINI_RELEASE_MAP[release]
80
+ s3_bucket = f"{s3_bucket}/{release}_mini_L100_bdf"
81
+ else:
82
+ s3_bucket = f"{s3_bucket}/{release}_L100_bdf"
83
+
84
+ warn(
85
+ "\n\n"
86
+ "[EEGChallengeDataset] EEG 2025 Competition Data Notice:\n"
87
+ "-------------------------------------------------------\n"
88
+ "This object loads the HBN dataset that has been preprocessed for the EEG Challenge:\n"
89
+ " - Downsampled from 500Hz to 100Hz\n"
90
+ " - Bandpass filtered (0.5–50 Hz)\n"
91
+ "\n"
92
+ "For full preprocessing details, see:\n"
93
+ " https://github.com/eeg2025/downsample-datasets\n"
94
+ "\n"
95
+ "IMPORTANT: The data accessed via `EEGChallengeDataset` is NOT identical to what you get from `EEGDashDataset` directly.\n"
96
+ "If you are participating in the competition, always use `EEGChallengeDataset` to ensure consistency with the challenge data.\n"
97
+ "\n",
98
+ UserWarning,
99
+ module="eegdash",
100
+ )
101
+
102
+ super().__init__(
103
+ dataset=RELEASE_TO_OPENNEURO_DATASET_MAP[release],
104
+ query=query,
105
+ cache_dir=cache_dir,
106
+ s3_bucket=s3_bucket,
107
+ **kwargs,
108
+ )
109
+
110
+
111
+ registered_classes = register_openneuro_datasets(
112
+ summary_file=Path(__file__).with_name("dataset_summary.csv"),
113
+ base_class=EEGDashDataset,
114
+ namespace=globals(),
115
+ )
116
+
117
+
118
+ __all__ = ["EEGChallengeDataset"] + list(registered_classes.keys())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eegdash
3
- Version: 0.3.6.dev183416654
3
+ Version: 0.3.7.dev183881899
4
4
  Summary: EEG data for machine learning
5
5
  Author-email: Young Truong <dt.young112@gmail.com>, Arnaud Delorme <adelorme@gmail.com>, Aviv Dotan <avivd220@gmail.com>, Oren Shriki <oren70@gmail.com>, Bruno Aristimunha <b.aristimunha@gmail.com>
6
6
  License-Expression: GPL-3.0-only
@@ -12,6 +12,7 @@ docs/source/install/install_pip.rst
12
12
  docs/source/install/install_source.rst
13
13
  eegdash/__init__.py
14
14
  eegdash/api.py
15
+ eegdash/const.py
15
16
  eegdash/data_config.py
16
17
  eegdash/data_utils.py
17
18
  eegdash/dataset.py