junifer 0.0.7.dev332__py3-none-any.whl → 0.0.8__py3-none-any.whl
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.
- junifer/_version.py +9 -19
- junifer/api/__init__.pyi +17 -2
- junifer/api/functions.py +222 -39
- junifer/api/queue_context/__init__.pyi +11 -3
- junifer/api/queue_context/gnu_parallel_local_adapter.py +81 -120
- junifer/api/queue_context/htcondor_adapter.py +118 -181
- junifer/api/queue_context/queue_context_adapter.py +51 -7
- junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +10 -35
- junifer/api/queue_context/tests/test_htcondor_adapter.py +13 -50
- junifer/api/res/fsl/run_fsl_docker.sh +4 -0
- junifer/api/tests/test_functions.py +863 -36
- junifer/cli/__init__.py +1 -7
- junifer/cli/cli.py +41 -22
- junifer/cli/parser.py +23 -147
- junifer/cli/tests/data/gmd_mean.yaml +6 -6
- junifer/cli/tests/data/gmd_mean_htcondor.yaml +6 -5
- junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +1 -0
- junifer/cli/tests/test_cli.py +120 -4
- junifer/cli/tests/test_cli_utils.py +23 -6
- junifer/cli/utils.py +14 -9
- junifer/configs/__init__.py +5 -0
- junifer/configs/__init__.pyi +0 -0
- junifer/configs/juseless/datagrabbers/__init__.pyi +4 -2
- junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +18 -24
- junifer/configs/juseless/datagrabbers/camcan_vbm.py +20 -27
- junifer/configs/juseless/datagrabbers/ixi_vbm.py +44 -52
- junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -7
- junifer/configs/juseless/datagrabbers/tests/test_ucla.py +2 -19
- junifer/configs/juseless/datagrabbers/ucla.py +111 -104
- junifer/configs/juseless/datagrabbers/ukb_vbm.py +19 -25
- junifer/configs/py.typed +0 -0
- junifer/conftest.py +63 -24
- junifer/data/_dispatch.py +9 -19
- junifer/data/coordinates/_ants_coordinates_warper.py +4 -1
- junifer/data/coordinates/_coordinates.py +51 -6
- junifer/data/coordinates/_fsl_coordinates_warper.py +4 -1
- junifer/data/coordinates/tests/test_coordinates.py +15 -3
- junifer/data/coordinates/tests/test_coordinates_names.py +37 -0
- junifer/data/maps/_ants_maps_warper.py +18 -12
- junifer/data/maps/_fsl_maps_warper.py +7 -3
- junifer/data/maps/_maps.py +12 -8
- junifer/data/maps/tests/test_maps.py +13 -21
- junifer/data/masks/_ants_mask_warper.py +18 -12
- junifer/data/masks/_fsl_mask_warper.py +7 -3
- junifer/data/masks/_masks.py +15 -12
- junifer/data/masks/tests/test_masks.py +20 -17
- junifer/data/parcellations/_ants_parcellation_warper.py +18 -12
- junifer/data/parcellations/_fsl_parcellation_warper.py +7 -5
- junifer/data/parcellations/_parcellations.py +125 -91
- junifer/data/parcellations/tests/test_parcellations.py +122 -1
- junifer/data/template_spaces.py +117 -50
- junifer/data/tests/test_template_spaces.py +10 -7
- junifer/data/utils.py +10 -8
- junifer/datagrabber/__init__.pyi +38 -5
- junifer/datagrabber/aomic/__init__.pyi +8 -1
- junifer/datagrabber/aomic/_types.py +22 -0
- junifer/datagrabber/aomic/id1000.py +193 -183
- junifer/datagrabber/aomic/piop1.py +215 -259
- junifer/datagrabber/aomic/piop2.py +211 -244
- junifer/datagrabber/aomic/tests/test_id1000.py +70 -53
- junifer/datagrabber/aomic/tests/test_piop1.py +98 -102
- junifer/datagrabber/aomic/tests/test_piop2.py +88 -85
- junifer/datagrabber/base.py +253 -79
- junifer/datagrabber/datalad_base.py +127 -76
- junifer/datagrabber/dmcc13_benchmark.py +204 -289
- junifer/datagrabber/hcp1200/__init__.pyi +7 -2
- junifer/datagrabber/hcp1200/datalad_hcp1200.py +61 -40
- junifer/datagrabber/hcp1200/hcp1200.py +151 -164
- junifer/datagrabber/hcp1200/tests/test_hcp1200.py +116 -128
- junifer/datagrabber/multiple.py +183 -63
- junifer/datagrabber/pattern.py +358 -227
- junifer/datagrabber/pattern_datalad.py +84 -124
- junifer/datagrabber/pattern_validation_mixin.py +22 -50
- junifer/datagrabber/tests/test_base.py +17 -4
- junifer/datagrabber/tests/test_datalad_base.py +20 -27
- junifer/datagrabber/tests/test_dmcc13_benchmark.py +110 -122
- junifer/datagrabber/tests/test_multiple.py +293 -31
- junifer/datagrabber/tests/test_pattern.py +577 -18
- junifer/datagrabber/tests/test_pattern_datalad.py +177 -107
- junifer/datagrabber/tests/test_pattern_validation_mixin.py +9 -51
- junifer/datareader/default.py +8 -5
- junifer/datareader/tests/test_default_reader.py +1 -1
- junifer/external/BrainPrint/.codecov.yml +2 -0
- junifer/external/BrainPrint/.codespellignore +2 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/bug-report.md +45 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/documentation.md +12 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/feature-request.md +24 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/questions-help-support.md +28 -0
- junifer/external/BrainPrint/.github/dependabot.yml +6 -0
- junifer/external/BrainPrint/.github/workflows/build.yml +53 -0
- junifer/external/BrainPrint/.github/workflows/code-style.yml +44 -0
- junifer/external/BrainPrint/.github/workflows/doc.yml +65 -0
- junifer/external/BrainPrint/.github/workflows/publish.yml +31 -0
- junifer/external/BrainPrint/.github/workflows/pytest.yml +54 -0
- junifer/external/BrainPrint/.gitignore +123 -0
- junifer/external/BrainPrint/LICENSE +21 -0
- junifer/external/BrainPrint/README.md +108 -0
- junifer/external/BrainPrint/brainprint/cli/__init__.py +11 -0
- junifer/external/BrainPrint/brainprint/cli/help_text.py +169 -0
- junifer/external/BrainPrint/brainprint/cli/parser.py +150 -0
- junifer/external/BrainPrint/brainprint/cli/utils.py +14 -0
- junifer/external/BrainPrint/brainprint/commands/__init__.py +0 -0
- junifer/external/BrainPrint/brainprint/commands/sys_info.py +18 -0
- junifer/external/BrainPrint/brainprint/utils/tests/__init__.py +0 -0
- junifer/external/BrainPrint/brainprint/utils/tests/test_config.py +33 -0
- junifer/external/BrainPrint/doc/Makefile +20 -0
- junifer/external/BrainPrint/doc/_static/.gitkeep +0 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/class.rst +10 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/function.rst +8 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/module.rst +6 -0
- junifer/external/BrainPrint/doc/api/index.rst +11 -0
- junifer/external/BrainPrint/doc/conf.py +272 -0
- junifer/external/BrainPrint/doc/index.rst +140 -0
- junifer/external/BrainPrint/doc/links.inc +36 -0
- junifer/external/BrainPrint/doc/make.bat +35 -0
- junifer/external/BrainPrint/doc/references.bib +23 -0
- junifer/external/BrainPrint/pyproject.toml +170 -0
- junifer/external/BrainPrint/setup.py +3 -0
- junifer/external/__init__.py +5 -0
- junifer/external/__init__.pyi +0 -0
- junifer/external/nilearn/junifer_connectivity_measure.py +95 -39
- junifer/external/nilearn/junifer_nifti_spheres_masker.py +226 -67
- junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +39 -27
- junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +231 -21
- junifer/external/py.typed +0 -0
- junifer/markers/__init__.pyi +6 -3
- junifer/markers/base.py +126 -76
- junifer/markers/brainprint.py +30 -39
- junifer/markers/complexity/__init__.py +20 -3
- junifer/markers/complexity/complexity_base.py +40 -41
- junifer/markers/complexity/hurst_exponent.py +22 -35
- junifer/markers/complexity/multiscale_entropy_auc.py +53 -41
- junifer/markers/complexity/perm_entropy.py +22 -36
- junifer/markers/complexity/range_entropy.py +22 -35
- junifer/markers/complexity/range_entropy_auc.py +27 -36
- junifer/markers/complexity/sample_entropy.py +22 -36
- junifer/markers/complexity/tests/test_complexity_registry.py +48 -0
- junifer/markers/complexity/tests/test_hurst_exponent.py +47 -36
- junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +50 -36
- junifer/markers/complexity/tests/test_perm_entropy.py +48 -36
- junifer/markers/complexity/tests/test_range_entropy.py +47 -36
- junifer/markers/complexity/tests/test_range_entropy_auc.py +47 -36
- junifer/markers/complexity/tests/test_sample_entropy.py +48 -36
- junifer/markers/complexity/tests/test_weighted_perm_entropy.py +50 -36
- junifer/markers/complexity/weighted_perm_entropy.py +22 -36
- junifer/markers/ets_rss.py +35 -31
- junifer/markers/falff/__init__.pyi +7 -1
- junifer/markers/falff/_afni_falff.py +22 -9
- junifer/markers/falff/_junifer_falff.py +47 -31
- junifer/markers/falff/falff_base.py +80 -60
- junifer/markers/falff/falff_maps.py +17 -41
- junifer/markers/falff/falff_parcels.py +26 -51
- junifer/markers/falff/falff_spheres.py +34 -61
- junifer/markers/falff/tests/test_falff_maps.py +20 -23
- junifer/markers/falff/tests/test_falff_mask.py +99 -0
- junifer/markers/falff/tests/test_falff_parcels.py +14 -10
- junifer/markers/falff/tests/test_falff_spheres.py +14 -10
- junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +32 -34
- junifer/markers/functional_connectivity/edge_functional_connectivity_maps.py +12 -25
- junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +19 -34
- junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +24 -44
- junifer/markers/functional_connectivity/functional_connectivity_base.py +50 -40
- junifer/markers/functional_connectivity/functional_connectivity_maps.py +12 -25
- junifer/markers/functional_connectivity/functional_connectivity_parcels.py +19 -34
- junifer/markers/functional_connectivity/functional_connectivity_spheres.py +24 -45
- junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +21 -22
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_maps.py +8 -7
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +8 -4
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +8 -4
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_maps.py +8 -7
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +9 -5
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +8 -12
- junifer/markers/maps_aggregation.py +77 -55
- junifer/markers/parcel_aggregation.py +91 -70
- junifer/markers/reho/__init__.pyi +7 -1
- junifer/markers/reho/_afni_reho.py +23 -14
- junifer/markers/reho/_junifer_reho.py +112 -123
- junifer/markers/reho/reho_base.py +115 -37
- junifer/markers/reho/reho_maps.py +18 -32
- junifer/markers/reho/reho_parcels.py +26 -41
- junifer/markers/reho/reho_spheres.py +33 -54
- junifer/markers/reho/tests/test_junifer_reho.py +178 -0
- junifer/markers/reho/tests/test_reho_maps.py +27 -25
- junifer/markers/reho/tests/test_reho_parcels.py +28 -22
- junifer/markers/reho/tests/test_reho_spheres.py +16 -12
- junifer/markers/sphere_aggregation.py +88 -72
- junifer/markers/temporal_snr/temporal_snr_base.py +32 -30
- junifer/markers/temporal_snr/temporal_snr_maps.py +9 -18
- junifer/markers/temporal_snr/temporal_snr_parcels.py +19 -27
- junifer/markers/temporal_snr/temporal_snr_spheres.py +27 -41
- junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +2 -2
- junifer/markers/temporal_snr/tests/test_temporal_snr_maps.py +17 -22
- junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +11 -3
- junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +9 -9
- junifer/markers/tests/test_brainprint.py +10 -9
- junifer/markers/tests/test_ets_rss.py +7 -3
- junifer/markers/tests/test_lost_regions.py +279 -0
- junifer/markers/tests/test_maps_aggregation.py +67 -114
- junifer/markers/tests/test_marker_utils.py +40 -1
- junifer/markers/tests/test_markers_base.py +275 -6
- junifer/markers/tests/test_parcel_aggregation.py +91 -53
- junifer/markers/tests/test_sphere_aggregation.py +53 -47
- junifer/markers/utils.py +267 -5
- junifer/onthefly/__init__.py +2 -3
- junifer/onthefly/__init__.pyi +4 -0
- junifer/onthefly/_brainprint.py +3 -5
- junifer/onthefly/py.typed +0 -0
- junifer/onthefly/read_transform.py +11 -9
- junifer/onthefly/tests/test_read_transform.py +7 -7
- junifer/pipeline/__init__.pyi +4 -2
- junifer/pipeline/marker_collection.py +14 -10
- junifer/pipeline/pipeline_component_registry.py +25 -6
- junifer/pipeline/pipeline_step_mixin.py +5 -12
- junifer/pipeline/tests/test_data_object_dumper.py +10 -10
- junifer/pipeline/tests/test_marker_collection.py +145 -168
- junifer/pipeline/tests/test_pipeline_component_registry.py +52 -8
- junifer/pipeline/tests/test_pipeline_step_mixin.py +12 -26
- junifer/pipeline/tests/test_update_meta_mixin.py +4 -5
- junifer/pipeline/tests/test_workdir_manager.py +39 -0
- junifer/pipeline/update_meta_mixin.py +13 -10
- junifer/pipeline/utils.py +22 -17
- junifer/pipeline/workdir_manager.py +41 -32
- junifer/preprocess/__init__.pyi +9 -4
- junifer/preprocess/_temporal_filter.py +34 -33
- junifer/preprocess/_temporal_slicer.py +17 -30
- junifer/preprocess/base.py +99 -55
- junifer/preprocess/confounds/__init__.pyi +10 -2
- junifer/preprocess/confounds/fmriprep_confound_remover.py +87 -109
- junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +64 -45
- junifer/preprocess/smoothing/__init__.pyi +2 -2
- junifer/preprocess/smoothing/_afni_smoothing.py +8 -7
- junifer/preprocess/smoothing/_fsl_smoothing.py +6 -4
- junifer/preprocess/smoothing/_nilearn_smoothing.py +7 -5
- junifer/preprocess/smoothing/smoothing.py +59 -40
- junifer/preprocess/smoothing/tests/test_smoothing.py +28 -8
- junifer/preprocess/tests/test_preprocess_base.py +17 -9
- junifer/preprocess/tests/test_temporal_filter.py +37 -16
- junifer/preprocess/tests/test_temporal_slicer.py +12 -12
- junifer/preprocess/warping/__init__.pyi +2 -2
- junifer/preprocess/warping/_ants_warper.py +56 -40
- junifer/preprocess/warping/_fsl_warper.py +49 -36
- junifer/preprocess/warping/_utils.py +106 -0
- junifer/preprocess/warping/space_warper.py +99 -98
- junifer/preprocess/warping/tests/test_space_warper.py +46 -41
- junifer/preprocess/warping/tests/test_warping_utils.py +163 -0
- junifer/stats.py +46 -34
- junifer/storage/__init__.pyi +8 -4
- junifer/storage/base.py +129 -64
- junifer/storage/hdf5.py +307 -199
- junifer/storage/pandas_base.py +46 -24
- junifer/storage/sqlite.py +99 -62
- junifer/storage/tests/data/collected_h5io_fork.hdf5 +0 -0
- junifer/storage/tests/test_hdf5.py +147 -12
- junifer/storage/tests/test_repeated_storage.py +293 -0
- junifer/storage/tests/test_sqlite.py +9 -20
- junifer/storage/tests/test_storage_base.py +18 -21
- junifer/storage/tests/test_utils.py +83 -22
- junifer/storage/utils.py +58 -38
- junifer/testing/__init__.pyi +2 -2
- junifer/testing/datagrabbers.py +480 -44
- junifer/testing/registry.py +12 -0
- junifer/testing/tests/test_adhdtesting_datagrabber.py +24 -0
- junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +5 -0
- junifer/testing/tests/test_partlycloudytesting_datagrabber.py +52 -0
- junifer/testing/tests/test_spmauditory_datagrabber.py +16 -0
- junifer/testing/tests/test_testing_registry.py +31 -0
- junifer/testing/tests/test_testing_utils.py +35 -0
- junifer/testing/tests/test_uclacnpvbmtesting_datagrabber.py +81 -0
- junifer/testing/utils.py +33 -1
- junifer/tests/test_stats.py +1 -5
- junifer/typing/__init__.pyi +2 -0
- junifer/typing/_typing.py +34 -19
- junifer/typing/py.typed +0 -0
- junifer/utils/__init__.pyi +10 -1
- junifer/utils/_config.py +1 -2
- junifer/utils/helpers.py +68 -2
- junifer/utils/logging.py +31 -7
- junifer/utils/tests/test_helpers.py +36 -1
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/METADATA +43 -35
- junifer-0.0.8.dist-info/RECORD +402 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/WHEEL +1 -1
- junifer/cli/tests/test_parser.py +0 -280
- junifer/external/h5io/h5io/__init__.py +0 -15
- junifer/external/h5io/h5io/_h5io.py +0 -767
- junifer/external/h5io/h5io/_version.py +0 -1
- junifer/external/h5io/h5io/chunked_array.py +0 -94
- junifer/external/h5io/h5io/chunked_list.py +0 -65
- junifer/markers/complexity/__init__.pyi +0 -17
- junifer-0.0.7.dev332.dist-info/RECORD +0 -353
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/entry_points.txt +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/AUTHORS.rst +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/LICENSE.md +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/top_level.txt +0 -0
junifer/storage/utils.py
CHANGED
|
@@ -10,8 +10,10 @@ from collections.abc import Sequence
|
|
|
10
10
|
from importlib.metadata import PackageNotFoundError, version
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
|
+
from pydantic import validate_call
|
|
13
14
|
|
|
14
|
-
from ..utils
|
|
15
|
+
from ..utils import raise_error
|
|
16
|
+
from .base import MatrixKind, logger
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
__all__ = [
|
|
@@ -72,10 +74,17 @@ def _meta_hash(meta: dict) -> str:
|
|
|
72
74
|
logger.debug(f"Hashing metadata: {meta}")
|
|
73
75
|
if "dependencies" not in meta:
|
|
74
76
|
raise_error("The metadata must contain the key 'dependencies'")
|
|
75
|
-
# Convert dependencies set into {dependency: version} dictionary
|
|
77
|
+
# Convert dependencies set into {dependency: version} dictionary, with
|
|
78
|
+
# junifer, so that the features computed with different versions of
|
|
79
|
+
# junifer have different hashes
|
|
76
80
|
meta["dependencies"] = {
|
|
77
|
-
dep: get_dependency_version(dep)
|
|
81
|
+
dep: get_dependency_version(dep)
|
|
82
|
+
for dep in {*meta["dependencies"], "junifer"}
|
|
78
83
|
}
|
|
84
|
+
# Remove datadir from datagrabber only if datalad-based
|
|
85
|
+
if meta.get("datagrabber") is not None:
|
|
86
|
+
if meta["datagrabber"].get("uri") is not None:
|
|
87
|
+
_ = meta["datagrabber"].pop("datadir")
|
|
79
88
|
meta_md5 = hashlib.md5(
|
|
80
89
|
json.dumps(meta, sort_keys=True).encode("utf-8")
|
|
81
90
|
).hexdigest()
|
|
@@ -86,8 +95,13 @@ def _meta_hash(meta: dict) -> str:
|
|
|
86
95
|
def process_meta(meta: dict) -> tuple[str, dict, dict]:
|
|
87
96
|
"""Process the metadata for storage.
|
|
88
97
|
|
|
89
|
-
It removes the key "element"
|
|
90
|
-
|
|
98
|
+
It removes the key "element" (the element being processed) and keeps
|
|
99
|
+
"_element_keys", the keys of the element that the data depends on (set by
|
|
100
|
+
the DataGrabber, e.g., only the subject for data that is the same for all
|
|
101
|
+
the tasks of a subject). If not set, all the keys of the element are used.
|
|
102
|
+
The element of the data, with only these keys, is the one to store, so the
|
|
103
|
+
data that does not depend on a key is stored once instead of once for
|
|
104
|
+
each of its values.
|
|
91
105
|
|
|
92
106
|
Parameters
|
|
93
107
|
----------
|
|
@@ -101,12 +115,13 @@ def process_meta(meta: dict) -> tuple[str, dict, dict]:
|
|
|
101
115
|
dict
|
|
102
116
|
The processed metadata for storage.
|
|
103
117
|
dict
|
|
104
|
-
The element.
|
|
118
|
+
The element of the data, with the keys in "_element_keys".
|
|
105
119
|
|
|
106
120
|
Raises
|
|
107
121
|
------
|
|
108
122
|
ValueError
|
|
109
|
-
If ``meta
|
|
123
|
+
If ``meta=None``, if it does not contain the key "element" or if
|
|
124
|
+
"_element_keys" has keys that are not in the element.
|
|
110
125
|
|
|
111
126
|
"""
|
|
112
127
|
if meta is None:
|
|
@@ -124,7 +139,18 @@ def process_meta(meta: dict) -> tuple[str, dict, dict]:
|
|
|
124
139
|
if "type" not in t_meta:
|
|
125
140
|
raise_error(msg="`meta` must contain the key 'type'")
|
|
126
141
|
|
|
127
|
-
|
|
142
|
+
# The keys of the element that the data depends on
|
|
143
|
+
element_keys = t_meta.get("_element_keys") or list(element.keys())
|
|
144
|
+
missing = [k for k in element_keys if k not in element]
|
|
145
|
+
if missing:
|
|
146
|
+
raise_error(
|
|
147
|
+
msg=(
|
|
148
|
+
f"The keys {missing} of `meta['_element_keys']` are not in "
|
|
149
|
+
f"the element: {element}"
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
t_meta["_element_keys"] = list(element_keys)
|
|
153
|
+
element = {k: element[k] for k in element_keys}
|
|
128
154
|
type_ = t_meta["type"]
|
|
129
155
|
name = t_meta["marker"]["name"]
|
|
130
156
|
t_meta["name"] = f"{type_}_{name}"
|
|
@@ -163,8 +189,9 @@ def element_to_prefix(element: dict) -> str:
|
|
|
163
189
|
return f"{prefix}_"
|
|
164
190
|
|
|
165
191
|
|
|
192
|
+
@validate_call
|
|
166
193
|
def store_matrix_checks(
|
|
167
|
-
matrix_kind:
|
|
194
|
+
matrix_kind: MatrixKind,
|
|
168
195
|
diagonal: bool,
|
|
169
196
|
data_shape: tuple[int, int],
|
|
170
197
|
row_names_len: int,
|
|
@@ -174,15 +201,10 @@ def store_matrix_checks(
|
|
|
174
201
|
|
|
175
202
|
Parameters
|
|
176
203
|
----------
|
|
177
|
-
matrix_kind :
|
|
178
|
-
The kind
|
|
179
|
-
|
|
180
|
-
* ``triu`` : store upper triangular only
|
|
181
|
-
* ``tril`` : store lower triangular
|
|
182
|
-
* ``full`` : full matrix
|
|
183
|
-
|
|
204
|
+
matrix_kind : :enum:`.MatrixKind`, optional
|
|
205
|
+
The matrix kind.
|
|
184
206
|
diagonal : bool
|
|
185
|
-
Whether to store the diagonal. If ``matrix_kind
|
|
207
|
+
Whether to store the diagonal. If ``matrix_kind=MatrixKind.Full``,
|
|
186
208
|
setting this to False will raise an error.
|
|
187
209
|
data_shape : tuple of int and int
|
|
188
210
|
The shape of the matrix data to store.
|
|
@@ -194,16 +216,12 @@ def store_matrix_checks(
|
|
|
194
216
|
Raises
|
|
195
217
|
------
|
|
196
218
|
ValueError
|
|
197
|
-
If
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
If the number of
|
|
201
|
-
If the number of column names does not match the number of columns
|
|
219
|
+
If ``diagonal=False`` and ``matrix_kind="full"`` or
|
|
220
|
+
if ``matrix_kind`` is "triu" or "tril" and the matrix is not square or
|
|
221
|
+
if the number of row names does not match the number of rows
|
|
222
|
+
If the number of column names does not match the number of columns.
|
|
202
223
|
|
|
203
224
|
"""
|
|
204
|
-
# Matrix kind validation
|
|
205
|
-
if matrix_kind not in ("triu", "tril", "full"):
|
|
206
|
-
raise_error(msg=f"Invalid kind {matrix_kind}", klass=ValueError)
|
|
207
225
|
# Diagonal validation
|
|
208
226
|
if diagonal is False and matrix_kind not in ["triu", "tril"]:
|
|
209
227
|
raise_error(
|
|
@@ -250,9 +268,9 @@ def store_timeseries_2d_checks(
|
|
|
250
268
|
Raises
|
|
251
269
|
------
|
|
252
270
|
ValueError
|
|
253
|
-
If the data is not a 3D array (timepoints, rows, columns)
|
|
254
|
-
|
|
255
|
-
|
|
271
|
+
If the data is not a 3D array (timepoints, rows, columns) or
|
|
272
|
+
if the number of row names does not match the number of rows or
|
|
273
|
+
if the number of column names does not match the number of columns.
|
|
256
274
|
|
|
257
275
|
"""
|
|
258
276
|
# Data validation
|
|
@@ -280,7 +298,7 @@ def matrix_to_vector(
|
|
|
280
298
|
data: np.ndarray,
|
|
281
299
|
col_names: Sequence[str],
|
|
282
300
|
row_names: Sequence[str],
|
|
283
|
-
matrix_kind:
|
|
301
|
+
matrix_kind: MatrixKind,
|
|
284
302
|
diagonal: bool,
|
|
285
303
|
) -> tuple[np.ndarray, list[str]]:
|
|
286
304
|
"""Convert matrix to vector based on parameters.
|
|
@@ -293,13 +311,8 @@ def matrix_to_vector(
|
|
|
293
311
|
The column labels.
|
|
294
312
|
row_names : list-like of str
|
|
295
313
|
The row labels.
|
|
296
|
-
matrix_kind :
|
|
297
|
-
The kind
|
|
298
|
-
|
|
299
|
-
* ``triu`` : store upper triangular only
|
|
300
|
-
* ``tril`` : store lower triangular
|
|
301
|
-
* ``full`` : full matrix
|
|
302
|
-
|
|
314
|
+
matrix_kind : :enum:`.MatrixKind`
|
|
315
|
+
The matrix kind.
|
|
303
316
|
diagonal : bool
|
|
304
317
|
Whether to store the diagonal.
|
|
305
318
|
|
|
@@ -310,6 +323,11 @@ def matrix_to_vector(
|
|
|
310
323
|
list of str
|
|
311
324
|
The column labels.
|
|
312
325
|
|
|
326
|
+
Raises
|
|
327
|
+
------
|
|
328
|
+
ValueError
|
|
329
|
+
If the matrix kind is invalid.
|
|
330
|
+
|
|
313
331
|
"""
|
|
314
332
|
# Prepare data indexing based on matrix kind
|
|
315
333
|
if matrix_kind == "triu":
|
|
@@ -318,17 +336,19 @@ def matrix_to_vector(
|
|
|
318
336
|
elif matrix_kind == "tril":
|
|
319
337
|
k = 0 if diagonal is True else -1
|
|
320
338
|
data_idx = np.tril_indices(data.shape[0], k=k)
|
|
321
|
-
|
|
339
|
+
elif matrix_kind == "full": # full
|
|
322
340
|
data_idx = (
|
|
323
341
|
np.repeat(np.arange(data.shape[0]), data.shape[1]),
|
|
324
342
|
np.tile(np.arange(data.shape[1]), data.shape[0]),
|
|
325
343
|
)
|
|
344
|
+
else:
|
|
345
|
+
raise_error(f"Invalid matrix kind: {matrix_kind}")
|
|
326
346
|
# Subset data as 1D
|
|
327
347
|
flat_data = data[data_idx]
|
|
328
348
|
# Generate flat 1D row X column names
|
|
329
349
|
columns = [
|
|
330
350
|
f"{row_names[i]}~{col_names[j]}"
|
|
331
|
-
for i, j in zip(data_idx[0], data_idx[1])
|
|
351
|
+
for i, j in zip(data_idx[0], data_idx[1], strict=False)
|
|
332
352
|
]
|
|
333
353
|
|
|
334
354
|
return flat_data, columns
|
junifer/testing/__init__.pyi
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
__all__ = ["datagrabbers", "registry", "get_testing_data"]
|
|
1
|
+
__all__ = ["datagrabbers", "registry", "config_override", "get_testing_data"]
|
|
2
2
|
|
|
3
3
|
from . import datagrabbers, registry
|
|
4
|
-
from .utils import get_testing_data
|
|
4
|
+
from .utils import config_override, get_testing_data
|