From 1ecade2729fada3a385fc76128b134c52a1a8aff Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 12:27:47 -0400 Subject: [PATCH 01/78] Enable pre-commit autofixes --- .github/workflows/pydesigner_ci.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 5eafe0d..cb3ba66 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -20,9 +20,8 @@ jobs: pre-commit_version: latest python_version: 3.8 system: true - # - name: Auto-commit changed files - # uses: stefanzweifel/git-auto-commit-action@v5 - # with: - # commit_message: "Pre-commit fixes" - - \ No newline at end of file + - name: Auto-commit changed files + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "Pre-commit fixes" + tokem: ${{ secrets.GH_BRIDGE_PAT }} From 60d9ba1295f62483807e7ff5c743f85aced11fa4 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 12:31:09 -0400 Subject: [PATCH 02/78] Refine pre-commit action --- .github/workflows/pydesigner_ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index cb3ba66..cf00d95 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -17,8 +17,6 @@ jobs: - name: Run Pre-Commit uses: pre-commit/action@v3.0.0 with: - pre-commit_version: latest - python_version: 3.8 system: true - name: Auto-commit changed files uses: stefanzweifel/git-auto-commit-action@v5 From b656dc6f426e1e48958d559e2573b39633ed8709 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 12:32:33 -0400 Subject: [PATCH 03/78] f --- .github/workflows/pydesigner_ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index cf00d95..f26594e 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -16,8 +16,6 @@ jobs: uses: actions/setup-python@v3 - name: Run Pre-Commit uses: pre-commit/action@v3.0.0 - with: - system: true - name: Auto-commit changed files uses: stefanzweifel/git-auto-commit-action@v5 with: From efb77025bbb8d8f91a37c7643fdfcd0f238aed32 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 12:36:46 -0400 Subject: [PATCH 04/78] Resolve pre-commit issues --- .github/workflows/pydesigner_ci.yml | 3 + .pre-commit-config.yaml | 2 +- Dockerfile | 186 ++++++++++++++-------------- 3 files changed, 97 insertions(+), 94 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index f26594e..4d2cb8a 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -14,6 +14,9 @@ jobs: uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v3 + with: + python-version: 3.12 + architecture: 'x64' - name: Run Pre-Commit uses: pre-commit/action@v3.0.0 - name: Auto-commit changed files diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5d610c9..2cc8fdb 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,5 +33,5 @@ repos: rev: '1.6.0' hooks: - id: poetry-check - # - id: poetry-lock + - id: poetry-lock - id: poetry-export diff --git a/Dockerfile b/Dockerfile index 723a0cd..a665375 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,104 +1,104 @@ -# ============================================================================== -# NeuroDock -# A docker container that contains all PyDesigner dependencies such as MRTRIX3, -# FSL, and Python to preprocess diffusion MRI images. -# -# Maintainer: Siddhartha Dhiman -# ------------------------------------------------------------------------------ -# Current Dependencies -# 1.) FSL -# 2.) MRTRIX3 -# 3.) Python 2.7 -# 4.) Python 3.6 -# 6.) PyDesigner -# ============================================================================== +# # ============================================================================== +# # NeuroDock +# # A docker container that contains all PyDesigner dependencies such as MRTRIX3, +# # FSL, and Python to preprocess diffusion MRI images. +# # +# # Maintainer: Siddhartha Dhiman +# # ------------------------------------------------------------------------------ +# # Current Dependencies +# # 1.) FSL +# # 2.) MRTRIX3 +# # 3.) Python 2.7 +# # 4.) Python 3.6 +# # 6.) PyDesigner +# # ============================================================================== -# Load base Ubuntu image -FROM python:3.11-bullseye +# # Load base Ubuntu image +# FROM python:3.11-bullseye -# Labels -LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" -LABEL org.label-schema.schema-version="1.0.0-rc1" -LABEL org.label-schema.name="dmri/pydesigner" -LABEL org.label-schema.description="A state-of-the-art difusion and kurtosis MRI processing pipeline" -LABEL org.label-schema.url="https://github.com/m-ama/" -LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" -LABEL org.label-schema.vendor="MUSC BRIDGE" +# # Labels +# LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" +# LABEL org.label-schema.schema-version="1.0.0-rc1" +# LABEL org.label-schema.name="dmri/pydesigner" +# LABEL org.label-schema.description="A state-of-the-art difusion and kurtosis MRI processing pipeline" +# LABEL org.label-schema.url="https://github.com/m-ama/" +# LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" +# LABEL org.label-schema.vendor="MUSC BRIDGE" -# ARG DEBIAN_FRONTEND=noninteractive +# # ARG DEBIAN_FRONTEND=noninteractive -# Initial update -RUN apt update && \ - apt-get install -y \ - apt-utils \ - wget \ - curl \ - nano \ - software-properties-common \ - python3 \ - python3-pip \ - jq \ - libblas-dev \ - liblapack-dev \ - libatlas-base-dev \ - gfortran \ - git \ - g++ \ - python \ - libeigen3-dev \ - zlib1g-dev \ - libqt5opengl5-dev \ - libqt5svg5-dev \ - libgl1-mesa-dev \ - libfftw3-dev \ - libtiff5-dev \ - libpng-dev +# # Initial update +# RUN apt update && \ +# apt-get install -y \ +# apt-utils \ +# wget \ +# curl \ +# nano \ +# software-properties-common \ +# python3 \ +# python3-pip \ +# jq \ +# libblas-dev \ +# liblapack-dev \ +# libatlas-base-dev \ +# gfortran \ +# git \ +# g++ \ +# python \ +# libeigen3-dev \ +# zlib1g-dev \ +# libqt5opengl5-dev \ +# libqt5svg5-dev \ +# libgl1-mesa-dev \ +# libfftw3-dev \ +# libtiff5-dev \ +# libpng-dev -# Copy and install PyDesigner -RUN mkdir -p /pydesigner -COPY /pydesigner /app/pydesigner -COPY pyproject.toml app/ -RUN ls -RUN ls -la /app -WORKDIR /app -ENV PYTHONPATH=${PYTHONPATH}:${PWD} -RUN pip3 install poetry -RUN poetry config virtualenvs.create false -RUN poetry install --no-dev +# # Copy and install PyDesigner +# RUN mkdir -p /pydesigner +# COPY /pydesigner /app/pydesigner +# COPY pyproject.toml app/ +# RUN ls +# RUN ls -la /app +# WORKDIR /app +# ENV PYTHONPATH=${PYTHONPATH}:${PWD} +# RUN pip3 install poetry +# RUN poetry config virtualenvs.create false +# RUN poetry install --no-dev -# Install Python dependencies -RUN pip3 install --upgrade setuptools && \ - pip3 install numpy \ - pandas \ - scipy \ - joblib \ - multiprocess \ - tqdm \ - nibabel \ - cvxpy +# # Install Python dependencies +# RUN pip3 install --upgrade setuptools && \ +# pip3 install numpy \ +# pandas \ +# scipy \ +# joblib \ +# multiprocess \ +# tqdm \ +# nibabel \ +# cvxpy -# Install FSL -RUN curl https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py -o /tmp/fslinstaller.py -RUN echo "/usr/local/fsl" | python2 /tmp/fslinstaller.py -V 6.0.3 +# # Install FSL +# RUN curl https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py -o /tmp/fslinstaller.py +# RUN echo "/usr/local/fsl" | python2 /tmp/fslinstaller.py -V 6.0.3 -# Configure FSL Environment -ENV FSLDIR=/usr/local/fsl -ENV FSLOUTPUTTYPE=NIFTI_GZ -ENV PATH=$PATH:$FSLDIR/bin -ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FSLDIR +# # Configure FSL Environment +# ENV FSLDIR=/usr/local/fsl +# ENV FSLOUTPUTTYPE=NIFTI_GZ +# ENV PATH=$PATH:$FSLDIR/bin +# ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FSLDIR -# Build and Configure MRTRIX3 -RUN git clone https://github.com/MRtrix3/mrtrix3.git /usr/lib/mrtrix3 -ENV CXX=/usr/bin/clang++ -ENV ARCH=native -RUN cd /usr/lib/mrtrix3 && \ - ./configure -nogui -openmp && \ - ./build && \ - ./set_path -ENV PATH=$PATH:/usr/lib/mrtrix3/bin +# # Build and Configure MRTRIX3 +# RUN git clone https://github.com/MRtrix3/mrtrix3.git /usr/lib/mrtrix3 +# ENV CXX=/usr/bin/clang++ +# ENV ARCH=native +# RUN cd /usr/lib/mrtrix3 && \ +# ./configure -nogui -openmp && \ +# ./build && \ +# ./set_path +# ENV PATH=$PATH:/usr/lib/mrtrix3/bin -# Remove unwanted packages -RUN apt-get autoremove && apt-get clean -RUN rm /tmp/fslinstaller.py && rm -r /tmp/PyDesigner +# # Remove unwanted packages +# RUN apt-get autoremove && apt-get clean +# RUN rm /tmp/fslinstaller.py && rm -r /tmp/PyDesigner -USER bridge +# USER bridge From b3709c0648ed18b6237698ffcbd5fab956e4fab0 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 13:04:29 -0400 Subject: [PATCH 05/78] Modify poetry-export hook --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2cc8fdb..3cfdfcf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -35,3 +35,4 @@ repos: - id: poetry-check - id: poetry-lock - id: poetry-export + args: ["--dev", "-f", "requirements-dev.txt", "-o", "requirements.txt"] From 0ccd59fdd7adfe4b2495c3205510e20ec52b3d33 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 13:12:00 -0400 Subject: [PATCH 06/78] Update poetry-export hook --- .pre-commit-config.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3cfdfcf..38672f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,5 +34,8 @@ repos: hooks: - id: poetry-check - id: poetry-lock + args: ["--no-update"] - id: poetry-export - args: ["--dev", "-f", "requirements-dev.txt", "-o", "requirements.txt"] + args: ["--without-hashes", "-f", "requirements.txt", "-o", "requirements.txt"] + - id: poetry-export + args: ["--without-hashes", "--only", "dev", "-f", "requirements.txt", "-o", "requirements-dev.txt"] From d8491ed2a91cdfb05a5012b7d6d24f979ed9b6f9 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 13:12:55 -0400 Subject: [PATCH 07/78] Fix pre-commit issues --- .github/workflows/pydesigner_ci.yml | 2 +- Dockerfile | 2 +- requirements-dev.txt | 5 + requirements.txt | 578 ++-------------------------- 4 files changed, 37 insertions(+), 550 deletions(-) create mode 100644 requirements-dev.txt diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 4d2cb8a..da499da 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -5,7 +5,7 @@ on: push: branches: [main] - + jobs: pre-commit: runs-on: ubuntu-latest diff --git a/Dockerfile b/Dockerfile index a665375..782abe2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -61,7 +61,7 @@ # RUN ls # RUN ls -la /app # WORKDIR /app -# ENV PYTHONPATH=${PYTHONPATH}:${PWD} +# ENV PYTHONPATH=${PYTHONPATH}:${PWD} # RUN pip3 install poetry # RUN poetry config virtualenvs.create false # RUN poetry install --no-dev diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..d0d2387 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" +iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" +pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" +pytest==7.4.2 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 23f1738..b43c24b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,548 +1,30 @@ -clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:2e0b1891d8e507eb0bfc7e0b981584c388b2ab28658056e600997dbbc23f1ab4 \ - --hash=sha256:4f366de79b8bc66bef8dc170987840b672ccab9222e710c09536d78ef47f606d \ - --hash=sha256:5a6be4df9fed98b6f73f034836def913a1ecd52e8b79ca230ddf7cd66ebcdee7 \ - --hash=sha256:73ed408c975a8ea021c3d8262d5d023a18e1ac3f6bb59a37cd69a11dba8f86ed \ - --hash=sha256:9946d3b5db346421b6d839d868e7b1151b590f871344fe95113bfd55b5be2433 \ - --hash=sha256:e737d2818b9ca10e92ccd3fa9ad1a805b039976016415a0c45adef3427d70792 \ - --hash=sha256:edcebbfc14073cd32bfb664317fd2555716c96be8b2a54efdb2b728453582bea \ - --hash=sha256:ef909a393e72981ca10b1d866d9cc7fb6295ece20ae035def764338894961184 -colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 -contourpy==1.1.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6 \ - --hash=sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33 \ - --hash=sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8 \ - --hash=sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d \ - --hash=sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d \ - --hash=sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c \ - --hash=sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf \ - --hash=sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e \ - --hash=sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e \ - --hash=sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163 \ - --hash=sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532 \ - --hash=sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2 \ - --hash=sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8 \ - --hash=sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1 \ - --hash=sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b \ - --hash=sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9 \ - --hash=sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916 \ - --hash=sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23 \ - --hash=sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb \ - --hash=sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a \ - --hash=sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e \ - --hash=sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442 \ - --hash=sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684 \ - --hash=sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34 \ - --hash=sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d \ - --hash=sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d \ - --hash=sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9 \ - --hash=sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45 \ - --hash=sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718 \ - --hash=sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab \ - --hash=sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3 \ - --hash=sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae \ - --hash=sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb \ - --hash=sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5 \ - --hash=sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba \ - --hash=sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0 \ - --hash=sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217 \ - --hash=sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887 \ - --hash=sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887 \ - --hash=sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62 \ - --hash=sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431 \ - --hash=sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b \ - --hash=sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce \ - --hash=sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b \ - --hash=sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f \ - --hash=sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85 \ - --hash=sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e \ - --hash=sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7 \ - --hash=sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251 \ - --hash=sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970 \ - --hash=sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0 \ - --hash=sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7 -cvxpy==1.4.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:03588055b660c043848f5281fe24dbd21f005b34bd8bd3b56906d8ad457c14ae \ - --hash=sha256:0f1482558b785f2db51c76b9c6e91cc85dbd146675b126a799e7d7aab5b15354 \ - --hash=sha256:163caffd7f7f27b6cb151f4ccff283068e063c3673158793048761690cbe4bbe \ - --hash=sha256:2f84687d15d11f9b49ca902f20103a2076efd47773c399cace71237ef53cdadc \ - --hash=sha256:315609ff96adeda4970471b349bc19d44ff4043e15630cf5ac70c029658fe8fc \ - --hash=sha256:372c0825cc6e6bb03ecc550d83718761a1bbdbbb48010fec6f9718581ebd45b5 \ - --hash=sha256:41cfaecf86f85162ca53c7be7377b4143e316204fb9b6a7df8b7a08c826e3806 \ - --hash=sha256:55e08ffb973d62b3fabc675ad464cb6013ea5ce69799f330b33a084a2e580d8d \ - --hash=sha256:57593a852c563ce77bdb075a3e75f23d36d4b3162ebf3199b54cc7fe75088ef2 \ - --hash=sha256:5a3ec054279880a9ebf5fd9d2ac4109acf944b8c45ea8b24e461680e34f3d7b5 \ - --hash=sha256:6b0f17dca85b2a410e73f5d84b28f35f57a20cfec1b0adc9b16f0f8aabff9961 \ - --hash=sha256:71a95aaccf22431fd25a63bcb12d583e1b0baeaeb4fafa3e25857cec03b9e2f3 \ - --hash=sha256:7a46ef722c8d1590875e86360d5781703dfcbd08be73eb98a2fc91a280870064 \ - --hash=sha256:7a9ef34e3c57ff8c844d86f0a3834fb5575af19233947639de0ba577c6122e3e \ - --hash=sha256:9318c4e679b3db470e76e7f23cce362b038bd2d68c4a7326a7c21577ddbdc542 \ - --hash=sha256:9d3bae3bf31e4eb6ed6407f78c6bc3c7bc4b4145cdbbb9ba8c61c3fc541d7067 \ - --hash=sha256:d220a7ee55907da9b55b98e5238d03735118d03b82855ba87b872cb2e6977367 \ - --hash=sha256:d6bfbd535fdaabc5fa55f28de7a1d40f3a803a27fe3fec86e90700fa159a3afc \ - --hash=sha256:db89b55025514bad821b1f1781bed373cbb6aa22fe84420431efd510dbe7f858 \ - --hash=sha256:edf66010e49b64d3f2dd1a7abde8fa3e615ce7a2b3eb185ab744b0beb3a6adb9 \ - --hash=sha256:f24067c54979b09910aea0a03256247121d8a8169538facf087c1923e9e2701a -cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ - --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c -dill==0.3.7 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e \ - --hash=sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03 -dipy==1.7.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:21bd7b14048f80ef7b74cd52a6ffeaf2b8b7337f5cf4e88e95af9827cfea7f96 \ - --hash=sha256:34f1c6323f4e884dcd0e3f1dd51666d9059f1abb146fd78105aaf4c33f45184c \ - --hash=sha256:4ff4cc129fed6f30d11f925350dc79edda6eda7815b04a59b486415746faa6a9 \ - --hash=sha256:53cac93c25e0ee5c3ecbbc17a1fcef6607564098ae1eedfbd5f548dbdde74bdd \ - --hash=sha256:59bb647128aae7793215c813bb8ea35dae260ac9f0d938c724064f0af5a05cc3 \ - --hash=sha256:67b55e6f379396c55fbe9dde9e888b9e60543285839110e0f096030bdb5d0968 \ - --hash=sha256:77cf294ac16fe548cbbca4aaea2a9c993e1d2e4230416926973d50aebae91b43 \ - --hash=sha256:83fd19a0347d52590ed45d5fa4ca0e6723a6c96a455c46f3696dc4feba131f53 \ - --hash=sha256:a6e0b216b91e3f98dbb2140a8668daff9d0b469630eeaab3482975034d791aed \ - --hash=sha256:a8ea49b11abf423fb8abcd28dc8549467e4ea32a297db1c89301cfb49c57eb99 \ - --hash=sha256:c4b7f8acc389065ee62c16d5087a625de0545fc1fcdbd28866749b7195e3f761 \ - --hash=sha256:c5df095b3bf41d8bb8568efe3b6a83ec87fe4bbc6bdc5895d0160a1688961e21 \ - --hash=sha256:cce5db9595e4910fe5818f50d1ef45f29239a47ddb06e46c3c43559abe30aadb \ - --hash=sha256:d21c069950ea7319e9580c5513c84232f5d06c68b4c047ab4bd8a11b2bcf51b5 \ - --hash=sha256:d2dff5b1b19d3df497ff2252cb25a2610390068d1e6cd1e822719732d8701d7f \ - --hash=sha256:d70498b8950a75f250059362244a63e4c597f9ab70b5d8ad1537d311b92b7303 \ - --hash=sha256:e333506d3eb29c8474fa2431928684cc04a79531d23647e7e9906c0753817ea9 \ - --hash=sha256:ffe4638780d2224871c139a74b83ab4dfb443705e405f8dbf1ee5956a5d413aa -ecos==2.0.12 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:29d00164eaea66ed54697a3b361c575284a8bca54f2623381a0635806c7303a7 \ - --hash=sha256:3e42bd4c19af6e04f76ccc85d941b1f1adc7faeee4d06d482395a6beb7bec895 \ - --hash=sha256:4979dc2d1cb6667e371a45a61887068505c1305437eef104ed6ef16f4b6aa0e3 \ - --hash=sha256:4e86671397d1d2cd7cccff8a9c45be0541b0c60af8b92a0ff3581c9ed869db67 \ - --hash=sha256:5184a9d8521ad1af90ffcd9902a6fa75c7bc473f37d30d86f97beda1033dfca2 \ - --hash=sha256:528b02f53835bd1baeb2e23f8153b8d6cc2b3704e1768be6a1a972f542241670 \ - --hash=sha256:608bc822ee8e070927ab3519169b13a1a0fe88f3d562212d6b5dbb1039776360 \ - --hash=sha256:617be25d74222849622b0f82b94a11abcf1fae78ccaf69977b328321ee6ffa0b \ - --hash=sha256:6def54336a15b5a49bc3bfcaa36035e8557cae8a4853b17ca84f5a29c93bcaea \ - --hash=sha256:7af08941552fce108bd80145cdb6be7fa74477a20bacdac170800442cc7027d4 \ - --hash=sha256:835298a299c88c207b3402fba60ad9b5688b59bbbf2ac34a46de5b37165d773a \ - --hash=sha256:858a4dd3177bdc8cc6e362031732f5177b62138a1e4ef91c0dc3c6bd7d2d1248 \ - --hash=sha256:da8fbbca3feb83a9e27075d29b3765417d0c80af8ea83cbdc4a558cae7b564af \ - --hash=sha256:eba07599084724eedc20b2862d5580eebebb09609f4740baadc78401cb99827c \ - --hash=sha256:f48816d73b87ae325556ea537b7c8743187311403c80e3832035224156337c4e \ - --hash=sha256:f70e4547966f530fd7715756f7a65d5b9b90b312b9d37f243ef9356c05e7d74c -fonttools==4.43.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad \ - --hash=sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c \ - --hash=sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba \ - --hash=sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212 \ - --hash=sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86 \ - --hash=sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477 \ - --hash=sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f \ - --hash=sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef \ - --hash=sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02 \ - --hash=sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860 \ - --hash=sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72 \ - --hash=sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3 \ - --hash=sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b \ - --hash=sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184 \ - --hash=sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7 \ - --hash=sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5 \ - --hash=sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9 \ - --hash=sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7 \ - --hash=sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b \ - --hash=sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933 \ - --hash=sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0 \ - --hash=sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6 \ - --hash=sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8 \ - --hash=sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c \ - --hash=sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590 \ - --hash=sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215 \ - --hash=sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680 \ - --hash=sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8 \ - --hash=sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0 \ - --hash=sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b \ - --hash=sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca \ - --hash=sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3 \ - --hash=sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6 \ - --hash=sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13 \ - --hash=sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204 \ - --hash=sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f \ - --hash=sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273 \ - --hash=sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b \ - --hash=sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd \ - --hash=sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a \ - --hash=sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d \ - --hash=sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896 -h5py==3.10.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c \ - --hash=sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99 \ - --hash=sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc \ - --hash=sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339 \ - --hash=sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97 \ - --hash=sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3 \ - --hash=sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229 \ - --hash=sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641 \ - --hash=sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52 \ - --hash=sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd \ - --hash=sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52 \ - --hash=sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03 \ - --hash=sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20 \ - --hash=sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7 \ - --hash=sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684 \ - --hash=sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f \ - --hash=sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3 \ - --hash=sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770 \ - --hash=sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824 \ - --hash=sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f \ - --hash=sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039 \ - --hash=sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3 \ - --hash=sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049 \ - --hash=sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d \ - --hash=sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af -joblib==1.3.2 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1 \ - --hash=sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9 -kiwisolver==1.4.5 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf \ - --hash=sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e \ - --hash=sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af \ - --hash=sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f \ - --hash=sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046 \ - --hash=sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3 \ - --hash=sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5 \ - --hash=sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71 \ - --hash=sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee \ - --hash=sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3 \ - --hash=sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9 \ - --hash=sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b \ - --hash=sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985 \ - --hash=sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea \ - --hash=sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16 \ - --hash=sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89 \ - --hash=sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c \ - --hash=sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9 \ - --hash=sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712 \ - --hash=sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342 \ - --hash=sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a \ - --hash=sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958 \ - --hash=sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d \ - --hash=sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a \ - --hash=sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130 \ - --hash=sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff \ - --hash=sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898 \ - --hash=sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b \ - --hash=sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f \ - --hash=sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265 \ - --hash=sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93 \ - --hash=sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929 \ - --hash=sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635 \ - --hash=sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709 \ - --hash=sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b \ - --hash=sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb \ - --hash=sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a \ - --hash=sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920 \ - --hash=sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e \ - --hash=sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544 \ - --hash=sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45 \ - --hash=sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390 \ - --hash=sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77 \ - --hash=sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355 \ - --hash=sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff \ - --hash=sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4 \ - --hash=sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7 \ - --hash=sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20 \ - --hash=sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c \ - --hash=sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162 \ - --hash=sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228 \ - --hash=sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437 \ - --hash=sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc \ - --hash=sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a \ - --hash=sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901 \ - --hash=sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4 \ - --hash=sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770 \ - --hash=sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525 \ - --hash=sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad \ - --hash=sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a \ - --hash=sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29 \ - --hash=sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90 \ - --hash=sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250 \ - --hash=sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d \ - --hash=sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3 \ - --hash=sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54 \ - --hash=sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f \ - --hash=sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1 \ - --hash=sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da \ - --hash=sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238 \ - --hash=sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa \ - --hash=sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523 \ - --hash=sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0 \ - --hash=sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205 \ - --hash=sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3 \ - --hash=sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4 \ - --hash=sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac \ - --hash=sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9 \ - --hash=sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb \ - --hash=sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced \ - --hash=sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd \ - --hash=sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0 \ - --hash=sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da \ - --hash=sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18 \ - --hash=sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9 \ - --hash=sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276 \ - --hash=sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333 \ - --hash=sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b \ - --hash=sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db \ - --hash=sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126 \ - --hash=sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9 \ - --hash=sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09 \ - --hash=sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0 \ - --hash=sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec \ - --hash=sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7 \ - --hash=sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff \ - --hash=sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9 \ - --hash=sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192 \ - --hash=sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8 \ - --hash=sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d \ - --hash=sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6 \ - --hash=sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797 \ - --hash=sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892 \ - --hash=sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f -matplotlib==3.8.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:061ee58facb3580cd2d046a6d227fb77e9295599c5ec6ad069f06b5821ad1cfc \ - --hash=sha256:0b11f354aae62a2aa53ec5bb09946f5f06fc41793e351a04ff60223ea9162955 \ - --hash=sha256:0d5ee602ef517a89d1f2c508ca189cfc395dd0b4a08284fb1b97a78eec354644 \ - --hash=sha256:0e723f5b96f3cd4aad99103dc93e9e3cdc4f18afdcc76951f4857b46f8e39d2d \ - --hash=sha256:23ed11654fc83cd6cfdf6170b453e437674a050a452133a064d47f2f1371f8d3 \ - --hash=sha256:2ea6886e93401c22e534bbfd39201ce8931b75502895cfb115cbdbbe2d31f287 \ - --hash=sha256:31e793c8bd4ea268cc5d3a695c27b30650ec35238626961d73085d5e94b6ab68 \ - --hash=sha256:36eafe2128772195b373e1242df28d1b7ec6c04c15b090b8d9e335d55a323900 \ - --hash=sha256:3cc3776836d0f4f22654a7f2d2ec2004618d5cf86b7185318381f73b80fd8a2d \ - --hash=sha256:5dc945a9cb2deb7d197ba23eb4c210e591d52d77bf0ba27c35fc82dec9fa78d4 \ - --hash=sha256:5de39dc61ca35342cf409e031f70f18219f2c48380d3886c1cf5ad9f17898e06 \ - --hash=sha256:60a6e04dfd77c0d3bcfee61c3cd335fff1b917c2f303b32524cd1235e194ef99 \ - --hash=sha256:6c49a2bd6981264bddcb8c317b6bd25febcece9e2ebfcbc34e7f4c0c867c09dc \ - --hash=sha256:6f25ffb6ad972cdffa7df8e5be4b1e3cadd2f8d43fc72085feb1518006178394 \ - --hash=sha256:7b37b74f00c4cb6af908cb9a00779d97d294e89fd2145ad43f0cdc23f635760c \ - --hash=sha256:7f54b9fb87ca5acbcdd0f286021bedc162e1425fa5555ebf3b3dfc167b955ad9 \ - --hash=sha256:87df75f528020a6299f76a1d986c0ed4406e3b2bd44bc5e306e46bca7d45e53e \ - --hash=sha256:90d74a95fe055f73a6cd737beecc1b81c26f2893b7a3751d52b53ff06ca53f36 \ - --hash=sha256:a33bd3045c7452ca1fa65676d88ba940867880e13e2546abb143035fa9072a9d \ - --hash=sha256:c3499c312f5def8f362a2bf761d04fa2d452b333f3a9a3f58805273719bf20d9 \ - --hash=sha256:c4940bad88a932ddc69734274f6fb047207e008389489f2b6f77d9ca485f0e7a \ - --hash=sha256:d670b9348e712ec176de225d425f150dc8e37b13010d85233c539b547da0be39 \ - --hash=sha256:dae97fdd6996b3a25da8ee43e3fc734fff502f396801063c6b76c20b56683196 \ - --hash=sha256:dd386c80a98b5f51571b9484bf6c6976de383cd2a8cd972b6a9562d85c6d2087 \ - --hash=sha256:df8505e1c19d5c2c26aff3497a7cbd3ccfc2e97043d1e4db3e76afa399164b69 \ - --hash=sha256:eee482731c8c17d86d9ddb5194d38621f9b0f0d53c99006275a12523ab021732 \ - --hash=sha256:f691b4ef47c7384d0936b2e8ebdeb5d526c81d004ad9403dfb9d4c76b9979a93 \ - --hash=sha256:f8b5a1bf27d078453aa7b5b27f52580e16360d02df6d3dc9504f3d2ce11f6309 -multiprocess==0.70.15 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:0eac53214d664c49a34695e5824872db4006b1a465edd7459a251809c3773370 \ - --hash=sha256:134f89053d82c9ed3b73edd3a2531eb791e602d4f4156fc92a79259590bd9670 \ - --hash=sha256:18f9f2c7063346d1617bd1684fdcae8d33380ae96b99427260f562e1a1228b67 \ - --hash=sha256:1a51dd34096db47fb21fa2b839e615b051d51b97af9a67afbcdaa67186b44883 \ - --hash=sha256:20e024018c46d0d1602024c613007ac948f9754659e3853b0aa705e83f6931d8 \ - --hash=sha256:3e0953f5d52b4c76f1c973eaf8214554d146f2be5decb48e928e55c7a2d19338 \ - --hash=sha256:4271647bd8a49c28ecd6eb56a7fdbd3c212c45529ad5303b40b3c65fc6928e5f \ - --hash=sha256:73db2e7b32dcc7f9b0f075c2ffa45c90b6729d3f1805f27e88534c8d321a1be5 \ - --hash=sha256:7dd58e33235e83cf09d625e55cffd7b0f0eede7ee9223cdd666a87624f60c21a \ - --hash=sha256:aa36c7ed16f508091438687fe9baa393a7a8e206731d321e443745e743a0d4e5 \ - --hash=sha256:bee9afba476c91f9ebee7beeee0601face9eff67d822e893f9a893725fbd6316 \ - --hash=sha256:cf981fb998d6ec3208cb14f0cf2e9e80216e834f5d51fd09ebc937c32b960902 \ - --hash=sha256:e576062981c91f0fe8a463c3d52506e598dfc51320a8dd8d78b987dfca91c5db \ - --hash=sha256:e73f497e6696a0f5433ada2b3d599ae733b87a6e8b008e387c62ac9127add177 \ - --hash=sha256:f20eed3036c0ef477b07a4177cf7c1ba520d9a2677870a4f47fe026f0cd6787e \ - --hash=sha256:f7d4a1629bccb433114c3b4885f69eccc200994323c80f6feee73b0edc9199c5 -nibabel==5.1.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:b3deb8130c835b9d26e80880b0d5e443d9e3f30972b3b0302dd2fafa3ca629f8 \ - --hash=sha256:ce73ca5e957209e7219a223cb71f77235c9df2acf4d3f27f861ba38e9481ac53 -numpy==1.25.2 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2 \ - --hash=sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55 \ - --hash=sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf \ - --hash=sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01 \ - --hash=sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca \ - --hash=sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901 \ - --hash=sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d \ - --hash=sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4 \ - --hash=sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf \ - --hash=sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380 \ - --hash=sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044 \ - --hash=sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545 \ - --hash=sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f \ - --hash=sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f \ - --hash=sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3 \ - --hash=sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364 \ - --hash=sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9 \ - --hash=sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418 \ - --hash=sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f \ - --hash=sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295 \ - --hash=sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3 \ - --hash=sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187 \ - --hash=sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926 \ - --hash=sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357 \ - --hash=sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760 -osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:0084e3d733c75687d68bc133bc380ce471dfe6f7724af2718a43491782eec8d6 \ - --hash=sha256:03e460e683ec2ce0f839353ddfa3c4c8ffa509ab8cf6a2b2afbb586fa453e180 \ - --hash=sha256:0441c10f7fe5f46692a9b44a57138977bb112ae3f8127151671968c5d9ec5dbb \ - --hash=sha256:146b89f2cfbf59eaeb2c47e3a312f2034138df78d80ce052364810dc0ef70fc4 \ - --hash=sha256:1b2049b2c42565dcaa63ddca1c4028b1fb20aab141453f5d77e8ff5b1a99a2cf \ - --hash=sha256:1b573fe1cd0e82239a279c58817c1d365187ef862e928b2b9c828c3c516ad3c2 \ - --hash=sha256:1c548a0b3691850e7e22f3624a128d8af33416d70a9b5976a47d4d832028dcd8 \ - --hash=sha256:30fbc3b3c028c06a6c5f1e66be7b7106ad48a29e0dc5bd82393f82dd68235ef8 \ - --hash=sha256:387e7abd737dfe32c9ec00ad74af25328cdd0d0f634d79530655c040a5cb9590 \ - --hash=sha256:3cbb6efdaffb7387dc0037dfe3259d4803e5ad7217e6f20fb605c92953214b9d \ - --hash=sha256:3f3a3c6d2708868e5e3fe2da300d6523cbf68a3d8734ce9c5043db37391969f5 \ - --hash=sha256:41f304d1d7f91af07d8f0b01e5af29ec3bb8824f0102c7fd8b13b497be120da4 \ - --hash=sha256:60abec3593870990b16f00bd5017096a7091fb00b68d0db3383fc048ca8e55c9 \ - --hash=sha256:6c3951ef505177b858c6cd34de980346014cae3d2234c93db960b12c5885f9a2 \ - --hash=sha256:71d9f611823af4a8b241c86805920e5382cd65c7f94fd3615b4eef999ed94c7c \ - --hash=sha256:7eafa3f3e82dd36c52f3f4ef19a95142405c807c272c4b53c5971c53535d7804 \ - --hash=sha256:b15e65a307fbbabf60248bb9bc204e61d5d4ae64e00427a69e2dad9622f4c29d \ - --hash=sha256:b73bdd9589901841af83c5ed6a4092b4fac5a0beff9e32682d8526d1f16a728c \ - --hash=sha256:c07b1a4b538aab629b0fae69f644b7e76f81f94d65230014d482e296dacd046b \ - --hash=sha256:dc18f87c9549032c163ce590a5e32079df94ee656c8fb357ba607aa9d78fab81 \ - --hash=sha256:e1445e10a94e01698e13c87a7debf6ac1a15f3acd1f8f6340cb1ad945db4732b \ - --hash=sha256:e1dfda08c38c3521012740a73ef782f97dfc54a41deae4b0bc4afd18d0e74da0 \ - --hash=sha256:e6b7d923c836f1d07115057e595245ccc1694ecae730a1affda78fc6f3c8d239 \ - --hash=sha256:ea7d8c92bcdf4fef98d777f13d39060d425ef2e8778ed487c96a6fa10848cdea \ - --hash=sha256:fe57e4bde071b388518ecb068f26319506dd9cb107363d3d80c12d2e59fc1e81 -packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ - --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 -pillow==10.0.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff \ - --hash=sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f \ - --hash=sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21 \ - --hash=sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635 \ - --hash=sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a \ - --hash=sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f \ - --hash=sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1 \ - --hash=sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d \ - --hash=sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db \ - --hash=sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849 \ - --hash=sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7 \ - --hash=sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876 \ - --hash=sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3 \ - --hash=sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317 \ - --hash=sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91 \ - --hash=sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d \ - --hash=sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b \ - --hash=sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd \ - --hash=sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed \ - --hash=sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500 \ - --hash=sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7 \ - --hash=sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a \ - --hash=sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a \ - --hash=sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0 \ - --hash=sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf \ - --hash=sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f \ - --hash=sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1 \ - --hash=sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088 \ - --hash=sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971 \ - --hash=sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a \ - --hash=sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205 \ - --hash=sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54 \ - --hash=sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08 \ - --hash=sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21 \ - --hash=sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d \ - --hash=sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08 \ - --hash=sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e \ - --hash=sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf \ - --hash=sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b \ - --hash=sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145 \ - --hash=sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2 \ - --hash=sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d \ - --hash=sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d \ - --hash=sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf \ - --hash=sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad \ - --hash=sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d \ - --hash=sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1 \ - --hash=sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4 \ - --hash=sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2 \ - --hash=sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19 \ - --hash=sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37 \ - --hash=sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4 \ - --hash=sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68 \ - --hash=sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1 -pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4 \ - --hash=sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3 -pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb \ - --hash=sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db -python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 -qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:092f6606690a2b9bd3c939f3147887e02de13bb068fbed5ffdc7459034def623 \ - --hash=sha256:0e3f06e8a49ddd834b24fc3d7afbba4fec0923101045aa2666e18d2a9980e329 \ - --hash=sha256:26aa3d6f0da7779265d72e8f418094003e75fa53c515a53bc03fd8b9bcfbf7de \ - --hash=sha256:3a81c46522dd6b3042e2348fa98128bb5c0e466f42bce214e80cfb766ff40930 \ - --hash=sha256:40e5d6753310377451ed4dc09b1ef28faf40108b713e7f55c8a8ae94d679a672 \ - --hash=sha256:4a86155f3de66c5db0e21544b7a2421c671028fa20da407686d2a8d0e9b57e51 \ - --hash=sha256:717cb1892b033c01a0aae84ededcfa1f05bcb97013095d779c497e6c32f90dac \ - --hash=sha256:718d8e141832e96ba71ca1807a74813836c6403110faaa3d33a67de1af3b29c4 \ - --hash=sha256:8ab02e8b9ff86bd644a1935718387c82fbe04c31e3309cf9f7a121d02b1deda8 \ - --hash=sha256:8fc35432913085d94b2327242cf51388467ef7a37ac0d71eb31b594b575dd498 \ - --hash=sha256:981ca8672e9506976c663552c1eb6f6daf9726d62650b3bf5900260946156166 \ - --hash=sha256:aa208703b44337a7e77f6f2663f7a452144becb4421970d534ff8297b92e1e10 \ - --hash=sha256:ae161342529852b6248ace4642bc4ee371a7c1e0707b7bc43a43ef7e73c06ca3 \ - --hash=sha256:b42649484f7c0d8ee659224ecaac0a3e97f12531018207f4d7323e4071320eb1 \ - --hash=sha256:b8ec670d97cf756f9159dc0a11de5cf054e88aefe84bea1c7282f00334642843 \ - --hash=sha256:c1dd0e570e65aaf35e10b7fb345f7ac763fd05a2227b9c06ce65e07993fc4984 \ - --hash=sha256:e55bcd6962178029faf543addd49db145302dd51e19855fefa71b5fd55840eea \ - --hash=sha256:f346a114c8342ee6d4dbd6471eef314199fb268d3bf7b95885ca351fde2b023f \ - --hash=sha256:fd5cfd8c50f33ddacb830594a63b8c1093a24aea45312b9d2ed826cea5ece08a -scipy==1.9.3 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31 \ - --hash=sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108 \ - --hash=sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0 \ - --hash=sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b \ - --hash=sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e \ - --hash=sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e \ - --hash=sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5 \ - --hash=sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840 \ - --hash=sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58 \ - --hash=sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523 \ - --hash=sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd \ - --hash=sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab \ - --hash=sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c \ - --hash=sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb \ - --hash=sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096 \ - --hash=sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0 \ - --hash=sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc \ - --hash=sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9 \ - --hash=sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c \ - --hash=sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95 \ - --hash=sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027 -scs==3.2.3 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:2d835a74c283be73bff6e1978d3ae77a60d9e87db1fdd12916464fa2a1dda517 \ - --hash=sha256:368194620918301bf5309a35a7cd0444f1b1992b182c0a29033c26eb97b3dcb2 \ - --hash=sha256:3eb601738b260e3dcad117f3e02aceaca5d1e8eac2be225be1c0f9cbf83e75cb \ - --hash=sha256:6a80727167ad73151ced202a1ac6c0c7644b00b2e2607edec8a8807fc0443ac8 \ - --hash=sha256:715ca4532de39b462bd393f9e8b4bf57be4122e20f0780d00db3cab1450a585d \ - --hash=sha256:79d7d6c42ee636821460d317b8250945ce04363a47a63aef6b1eae0bd7a418fc \ - --hash=sha256:81511fda3254c0d29089443dcd2305e81d203509e4d77afd160e9174b15ad75a \ - --hash=sha256:91f5194cfabe354c9b1f0ea1de82114028d81c5a4a633177b8da2fe36f301758 \ - --hash=sha256:9a14a7c80efb34b469eb4dbaf26a9104dd2ca93e477985f948d8f28cd4b1a2ba \ - --hash=sha256:9d7f7fd2d2cd88938c159b15e8915d9536610e50a9c34ecf36ce0290807afe55 \ - --hash=sha256:c0d15f21e9053c5df37dab0d700da55fcc71f2f454748f364b9de594988b2ab3 \ - --hash=sha256:ddaa5af34a0e1f636d312eb1901bd407383f0b04dda50fba7242d56e618c0966 \ - --hash=sha256:e3bd779e7e977e3ae5a2f2035aa4c2a309e29082d59a722d5d6592edc4bdb4b3 \ - --hash=sha256:e6f64d23247797cfa289095fb5ddea6eeff5adf98961e953da90233278827e0c \ - --hash=sha256:f1b24176de97ecedf698596086f85da6dad472fe38a4b21cf4b460f87cae2c37 \ - --hash=sha256:fcf4b985a787135b3e83682a4c5b9bce9c6290cfead1d7225c38f34f5ead7187 -setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f \ - --hash=sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7 -setuptools==68.2.2 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87 \ - --hash=sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a -six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 -tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386 \ - --hash=sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7 -typing-extensions==4.8.0 ; python_version >= "3.11" and python_version < "4.0" \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" +contourpy==1.1.1 ; python_version >= "3.11" and python_version < "4.0" +cvxpy==1.4.1 ; python_version >= "3.11" and python_version < "4.0" +cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" +dill==0.3.7 ; python_version >= "3.11" and python_version < "4.0" +dipy==1.7.0 ; python_version >= "3.11" and python_version < "4.0" +ecos==2.0.12 ; python_version >= "3.11" and python_version < "4.0" +fonttools==4.43.1 ; python_version >= "3.11" and python_version < "4.0" +h5py==3.10.0 ; python_version >= "3.11" and python_version < "4.0" +joblib==1.3.2 ; python_version >= "3.11" and python_version < "4.0" +kiwisolver==1.4.5 ; python_version >= "3.11" and python_version < "4.0" +matplotlib==3.8.0 ; python_version >= "3.11" and python_version < "4.0" +multiprocess==0.70.15 ; python_version >= "3.11" and python_version < "4.0" +nibabel==5.1.0 ; python_version >= "3.11" and python_version < "4.0" +numpy==1.25.2 ; python_version >= "3.11" and python_version < "4.0" +osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" +pillow==10.0.1 ; python_version >= "3.11" and python_version < "4.0" +pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" +pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" +qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" +scipy==1.9.3 ; python_version >= "3.11" and python_version < "4.0" +scs==3.2.3 ; python_version >= "3.11" and python_version < "4.0" +setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" +setuptools==68.2.2 ; python_version >= "3.11" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" +tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" +typing-extensions==4.8.0 ; python_version >= "3.11" and python_version < "4.0" From 39bda17e453943a94de605cda57179e2eb80235d Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 13:34:57 -0400 Subject: [PATCH 08/78] Refile CI workflow --- .github/workflows/pydesigner_ci.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index da499da..f720972 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -11,16 +11,30 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout + id: checkout uses: actions/checkout@v3 + - name: Set up Python + id: setup-python uses: actions/setup-python@v3 with: python-version: 3.12 architecture: 'x64' + - name: Run Pre-Commit + id: pre-commit uses: pre-commit/action@v3.0.0 + continue-on-error: true + with: + extra_args: --all-files + - name: Auto-commit changed files + id: git-auto-commit uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "Pre-commit fixes" - tokem: ${{ secrets.GH_BRIDGE_PAT }} + token: ${{ secrets.GH_BRIDGE_PAT }} + + - name: Return pre-commit response + if: steps.pre-commit.outcome == 'failure' + run: exit 1 From 05935db947cf8d1860cf75110af4064f2077841d Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Fri, 3 Nov 2023 17:37:05 +0000 Subject: [PATCH 09/78] Pre-commit fixes --- poetry.lock | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 4cf6f52..d80847f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.0 and should not be changed by hand. [[package]] name = "clarabel" @@ -46,6 +46,7 @@ files = [ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, @@ -54,6 +55,7 @@ files = [ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, @@ -62,6 +64,7 @@ files = [ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, @@ -70,6 +73,7 @@ files = [ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, From 8722fee2b3298aae62df9266ffbd66f6b3eaae55 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 13:41:58 -0400 Subject: [PATCH 10/78] Fix token --- .github/workflows/pydesigner_ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index f720972..ea8e536 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -13,6 +13,8 @@ jobs: - name: Checkout id: checkout uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_BRIDGE_PAT }} - name: Set up Python id: setup-python @@ -32,8 +34,7 @@ jobs: id: git-auto-commit uses: stefanzweifel/git-auto-commit-action@v5 with: - commit_message: "Pre-commit fixes" - token: ${{ secrets.GH_BRIDGE_PAT }} + commit_message: "Pre-commit autofix" - name: Return pre-commit response if: steps.pre-commit.outcome == 'failure' From 05077d9401d7b13be9148a1239e924f51e2e5f3d Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 3 Nov 2023 13:47:29 -0400 Subject: [PATCH 11/78] Test hook --- .readthedocs.yml | 2 +- installer | 112 ------------------------------------------- poetry.lock | 4 -- requirements-dev.txt | 5 -- requirements.txt | 30 ------------ 5 files changed, 1 insertion(+), 152 deletions(-) delete mode 100755 installer delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml index 3349b28..ec5e0fa 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -20,6 +20,6 @@ sphinx: # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - - requirements: docs/requirements.txt + - requirements: docs/requirements.txt - method: pip path: . diff --git a/installer b/installer deleted file mode 100755 index fd989e7..0000000 --- a/installer +++ /dev/null @@ -1,112 +0,0 @@ -#!/bin/bash -# This script installs PyDesigner and all dependencies within -# Debian-based systems -# Author: Siddhartha Dhiman -# -# Note: -# The scipt will ask for root password if not run by root user - -# Declate predefined variables -ISFSL=0 -ISMRTRIX=0 -ISPYD=0 -FSLINSTALL=/usr/local/fsl -MRTRIXINSTALL=/usr/local/mrtrix3 -RED='\033[0;31m' -GREEN='\033[32m' -NC='\033[0m' - - -# Install dependencies -sudo apt-get update && \ - sudo apt-get install -y \ - apt-utils \ - wget \ - curl \ - nano \ - software-properties-common \ - python2.7 python-pip \ - python3 python3-pip \ - jq - -sudo apt-get install -y --no-install-recommends \ - clang \ - git \ - python-numpy \ - libeigen3-dev \ - zlib1g-dev \ - libqt4-opengl-dev \ - libgl1-mesa-dev \ - libfftw3-dev \ - libtiff5-dev \ - libomp-dev - -# Check installation of FSL, MRtrix3 and PyDesigner -if [[ $(echo $FSLDIR) ]]; then - echo -e "${GREEN}Existing FSL installation found${NC}\n" - ISFSL=1 -else - echo -e "${RED}FSL installation not found...marked for installation\n${NC}" - ISFSL=0 -fi - -if [[ $(which dwipreproc) ]]; then - echo -e "${GREEN}Existing MRtrix3 installation found\n${NC}" - ISMRTRIX=1 -else - echo -e "${RED}MRtrix3 installation not found...marked for installation\n${NC}" - ISMRTRIX=0 -fi - -if [[ $(which pydesigner) ]]; then - echo -e "${GREEN}Existing PyDesigner installation found\n${NC}" - ISPYD=1 -else - echo -e "${RED}PyDesigner installation not found...marked for installation\n${NC}" - ISPYD=0 -fi - -# Install PyDesigner -if [ "$ISPYD" -eq "0" ]; then - sudo mkdir -p /tmp/PyDesigner - export PYDVER=$(curl -s https://api.github.com/repos/m-ama/PyDesigner/releases | jq -r '.[0] | .tag_name') - export URL=$(curl -s https://api.github.com/repos/m-ama/PyDesigner/releases | jq -r '.[0] | .tarball_url') - echo -e "${NC}Installing PyDesigner $PYDVER${NC}" - sudo wget -q -O - $URL | sudo tar -xzf - -C /tmp/PyDesigner --strip 1 - sudo pip3 install /tmp/PyDesigner - sudo rm -r /tmp/PyDesigner -else - : -fi - -# Install FSL -if [ "$ISFSL" -eq "0" ]; then - echo -e "${NC}Installing FSL${NC}" - curl https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py -o /tmp/fslinstaller.py - sudo echo $FSLINSTALL| python2 /tmp/fslinstaller.py -V 6.0.3 - sudo echo 'export FSLDIR=/usr/local/fsl' >> ~/.bashrc - sudo echo 'export FSLOUTPUTTYPE=NIFTI_GZ' >> ~/.bashrc - sudo echo 'export PATH=$PATH:$FSLDIR/bin' >> ~/.bashrc - sudo echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FSLDIR' >> ~/.bashrc -else - : -fi - -# Install MRtrix3 -if [ "$ISMRTRIX" -eq "0" ]; then - echo -e "${NC}Installing MRTrix3${NC}" - sudo git clone https://github.com/MRtrix3/mrtrix3.git /usr/local/mrtrix3 - CXX=/usr/bin/clang++ - ARCH=native - ./usr/local/mrtrix3/configure && \ - ./usr/local/mrtrix3/build && \ - ./usr/local/mrtrix3/set_path - sudo echo 'export PATH=$PATH:/usr/local/mrtrix3/bin' >> ~/.bashrc -else - : -fi - -source ~/.bashrc -echo -e "${GREEN}Installation Complete" -echo -e "Please close this Terminal window and reopen a new window for" -echo -e "changes to take effect\n${NC}" diff --git a/poetry.lock b/poetry.lock index d80847f..8bdb8d4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -46,7 +46,6 @@ files = [ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, @@ -55,7 +54,6 @@ files = [ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, @@ -64,7 +62,6 @@ files = [ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, @@ -73,7 +70,6 @@ files = [ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index d0d2387..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,5 +0,0 @@ -colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" -iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" -pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" -pytest==7.4.2 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index b43c24b..0000000 --- a/requirements.txt +++ /dev/null @@ -1,30 +0,0 @@ -clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" -contourpy==1.1.1 ; python_version >= "3.11" and python_version < "4.0" -cvxpy==1.4.1 ; python_version >= "3.11" and python_version < "4.0" -cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" -dill==0.3.7 ; python_version >= "3.11" and python_version < "4.0" -dipy==1.7.0 ; python_version >= "3.11" and python_version < "4.0" -ecos==2.0.12 ; python_version >= "3.11" and python_version < "4.0" -fonttools==4.43.1 ; python_version >= "3.11" and python_version < "4.0" -h5py==3.10.0 ; python_version >= "3.11" and python_version < "4.0" -joblib==1.3.2 ; python_version >= "3.11" and python_version < "4.0" -kiwisolver==1.4.5 ; python_version >= "3.11" and python_version < "4.0" -matplotlib==3.8.0 ; python_version >= "3.11" and python_version < "4.0" -multiprocess==0.70.15 ; python_version >= "3.11" and python_version < "4.0" -nibabel==5.1.0 ; python_version >= "3.11" and python_version < "4.0" -numpy==1.25.2 ; python_version >= "3.11" and python_version < "4.0" -osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" -pillow==10.0.1 ; python_version >= "3.11" and python_version < "4.0" -pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" -pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" -python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" -qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" -scipy==1.9.3 ; python_version >= "3.11" and python_version < "4.0" -scs==3.2.3 ; python_version >= "3.11" and python_version < "4.0" -setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" -setuptools==68.2.2 ; python_version >= "3.11" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" -tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" -typing-extensions==4.8.0 ; python_version >= "3.11" and python_version < "4.0" From df52aabf3fe9a54c63a978d32f5015524263a80f Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Fri, 3 Nov 2023 17:48:36 +0000 Subject: [PATCH 12/78] Pre-commit autofix --- .readthedocs.yml | 2 +- poetry.lock | 4 ++++ requirements-dev.txt | 5 +++++ requirements.txt | 30 ++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 requirements-dev.txt create mode 100644 requirements.txt diff --git a/.readthedocs.yml b/.readthedocs.yml index ec5e0fa..3349b28 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -20,6 +20,6 @@ sphinx: # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - - requirements: docs/requirements.txt + - requirements: docs/requirements.txt - method: pip path: . diff --git a/poetry.lock b/poetry.lock index 8bdb8d4..d80847f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -46,6 +46,7 @@ files = [ {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, + {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, @@ -54,6 +55,7 @@ files = [ {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, + {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, @@ -62,6 +64,7 @@ files = [ {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, + {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, @@ -70,6 +73,7 @@ files = [ {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, + {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..d0d2387 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,5 @@ +colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" +iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" +pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" +pytest==7.4.2 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b43c24b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,30 @@ +clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" +contourpy==1.1.1 ; python_version >= "3.11" and python_version < "4.0" +cvxpy==1.4.1 ; python_version >= "3.11" and python_version < "4.0" +cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" +dill==0.3.7 ; python_version >= "3.11" and python_version < "4.0" +dipy==1.7.0 ; python_version >= "3.11" and python_version < "4.0" +ecos==2.0.12 ; python_version >= "3.11" and python_version < "4.0" +fonttools==4.43.1 ; python_version >= "3.11" and python_version < "4.0" +h5py==3.10.0 ; python_version >= "3.11" and python_version < "4.0" +joblib==1.3.2 ; python_version >= "3.11" and python_version < "4.0" +kiwisolver==1.4.5 ; python_version >= "3.11" and python_version < "4.0" +matplotlib==3.8.0 ; python_version >= "3.11" and python_version < "4.0" +multiprocess==0.70.15 ; python_version >= "3.11" and python_version < "4.0" +nibabel==5.1.0 ; python_version >= "3.11" and python_version < "4.0" +numpy==1.25.2 ; python_version >= "3.11" and python_version < "4.0" +osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" +pillow==10.0.1 ; python_version >= "3.11" and python_version < "4.0" +pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" +pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" +qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" +scipy==1.9.3 ; python_version >= "3.11" and python_version < "4.0" +scs==3.2.3 ; python_version >= "3.11" and python_version < "4.0" +setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" +setuptools==68.2.2 ; python_version >= "3.11" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" +tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" +typing-extensions==4.8.0 ; python_version >= "3.11" and python_version < "4.0" From 3442c57367d22aba826d567f0da33dd05d7bd32b Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Fri, 12 Jan 2024 17:20:14 -0500 Subject: [PATCH 13/78] Fix version metadata --- pydesigner/__init__.py | 3 +++ pydesigner/main.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pydesigner/__init__.py b/pydesigner/__init__.py index e69de29..8417488 100644 --- a/pydesigner/__init__.py +++ b/pydesigner/__init__.py @@ -0,0 +1,3 @@ +from importlib.metadata import version + +__version__ = version(__name__) \ No newline at end of file diff --git a/pydesigner/main.py b/pydesigner/main.py index 6b7070b..2a60d07 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -13,8 +13,8 @@ import numpy as np # array, ndarray +from . import __version__ from .fitting import dwipy as dp -from .info import __version__ from .plotting import motionplot, snrplot from .postprocessing import filters from .preprocessing import mrinfoutil, mrpreproc, util From 202652d014a328cc057ebd891cc5d5a8c77e5cda Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 17 Jan 2024 13:45:13 -0500 Subject: [PATCH 14/78] Refinements --- poetry.lock | 894 +++++++++++++++++++++++++------------------ pydesigner/main.py | 4 +- pyproject.toml | 3 +- requirements-dev.txt | 4 +- requirements.txt | 26 +- 5 files changed, 539 insertions(+), 392 deletions(-) diff --git a/poetry.lock b/poetry.lock index d80847f..c759090 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,23 @@ -# This file is automatically @generated by Poetry 1.6.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] [[package]] name = "clarabel" @@ -34,136 +53,66 @@ files = [ [[package]] name = "contourpy" -version = "1.1.0" -description = "Python library for calculating contours of 2D quadrilateral grids" -optional = false -python-versions = ">=3.8" -files = [ - {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, - {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, - {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, - {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, - {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, - {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, - {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, - {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, - {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, - {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, - {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, -] - -[package.dependencies] -numpy = ">=1.16" - -[package.extras] -bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] -test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] - -[[package]] -name = "contourpy" -version = "1.1.1" +version = "1.2.0" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, - {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, - {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, - {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, - {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, - {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, - {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, - {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, - {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, - {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, - {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, - {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, - {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, - {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, - {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, - {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, - {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, - {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, - {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, - {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, - {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, - {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, - {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, - {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, - {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, - {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, - {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, - {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, - {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, ] [package.dependencies] -numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} +numpy = ">=1.20,<2.0" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "cvxpy" @@ -238,6 +187,91 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "cython" +version = "3.0.8" +description = "The Cython compiler for writing C extensions in the Python language." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636"}, + {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520"}, + {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39"}, + {file = "Cython-3.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f"}, + {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782"}, + {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd"}, + {file = "Cython-3.0.8-cp310-cp310-win32.whl", hash = "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12"}, + {file = "Cython-3.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539"}, + {file = "Cython-3.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba"}, + {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3"}, + {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee"}, + {file = "Cython-3.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1"}, + {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b"}, + {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795"}, + {file = "Cython-3.0.8-cp311-cp311-win32.whl", hash = "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871"}, + {file = "Cython-3.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02"}, + {file = "Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f"}, + {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419"}, + {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6"}, + {file = "Cython-3.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717"}, + {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658"}, + {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388"}, + {file = "Cython-3.0.8-cp312-cp312-win32.whl", hash = "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c"}, + {file = "Cython-3.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a"}, + {file = "Cython-3.0.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:870d2a0a7e3cbd5efa65aecdb38d715ea337a904ea7bb22324036e78fb7068e7"}, + {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e8f2454128974905258d86534f4fd4f91d2f1343605657ecab779d80c9d6d5e"}, + {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1949d6aa7bc792554bee2b67a9fe41008acbfe22f4f8df7b6ec7b799613a4b3"}, + {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9f2c6e1b8f3bcd6cb230bac1843f85114780bb8be8614855b1628b36bb510e0"}, + {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:05d7eddc668ae7993643f32c7661f25544e791edb745758672ea5b1a82ecffa6"}, + {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bfabe115deef4ada5d23c87bddb11289123336dcc14347011832c07db616dd93"}, + {file = "Cython-3.0.8-cp36-cp36m-win32.whl", hash = "sha256:0c38c9f0bcce2df0c3347285863621be904ac6b64c5792d871130569d893efd7"}, + {file = "Cython-3.0.8-cp36-cp36m-win_amd64.whl", hash = "sha256:6c46939c3983217d140999de7c238c3141f56b1ea349e47ca49cae899969aa2c"}, + {file = "Cython-3.0.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:115f0a50f752da6c99941b103b5cb090da63eb206abbc7c2ad33856ffc73f064"}, + {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c0f29246734561c90f36e70ed0506b61aa3d044e4cc4cba559065a2a741fae"}, + {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab75242869ff71e5665fe5c96f3378e79e792fa3c11762641b6c5afbbbbe026"}, + {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6717c06e9cfc6c1df18543cd31a21f5d8e378a40f70c851fa2d34f0597037abc"}, + {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9d3f74388db378a3c6fd06e79a809ed98df3f56484d317b81ee762dbf3c263e0"}, + {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae7ac561fd8253a9ae96311e91d12af5f701383564edc11d6338a7b60b285a6f"}, + {file = "Cython-3.0.8-cp37-cp37m-win32.whl", hash = "sha256:97b2a45845b993304f1799664fa88da676ee19442b15fdcaa31f9da7e1acc434"}, + {file = "Cython-3.0.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9e2be2b340fea46fb849d378f9b80d3c08ff2e81e2bfbcdb656e2e3cd8c6b2dc"}, + {file = "Cython-3.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2cde23c555470db3f149ede78b518e8274853745289c956a0e06ad8d982e4db9"}, + {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7990ca127e1f1beedaf8fc8bf66541d066ef4723ad7d8d47a7cbf842e0f47580"}, + {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b983c8e6803f016146c26854d9150ddad5662960c804ea7f0c752c9266752f0"}, + {file = "Cython-3.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a973268d7ca1a2bdf78575e459a94a78e1a0a9bb62a7db0c50041949a73b02ff"}, + {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:61a237bc9dd23c7faef0fcfce88c11c65d0c9bb73c74ccfa408b3a012073c20e"}, + {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a3d67f079598af49e90ff9655bf85bd358f093d727eb21ca2708f467c489cae"}, + {file = "Cython-3.0.8-cp38-cp38-win32.whl", hash = "sha256:17a642bb01a693e34c914106566f59844b4461665066613913463a719e0dd15d"}, + {file = "Cython-3.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:2cdfc32252f3b6dc7c94032ab744dcedb45286733443c294d8f909a4854e7f83"}, + {file = "Cython-3.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa97893d99385386925d00074654aeae3a98867f298d1e12ceaf38a9054a9bae"}, + {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05c0bf9d085c031df8f583f0d506aa3be1692023de18c45d0aaf78685bbb944"}, + {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7"}, + {file = "Cython-3.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:314f2355a1f1d06e3c431eaad4708cf10037b5e91e4b231d89c913989d0bdafd"}, + {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:78825a3774211e7d5089730f00cdf7f473042acc9ceb8b9eeebe13ed3a5541de"}, + {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df8093deabc55f37028190cf5e575c26aad23fc673f34b85d5f45076bc37ce39"}, + {file = "Cython-3.0.8-cp39-cp39-win32.whl", hash = "sha256:1aca1b97e0095b3a9a6c33eada3f661a4ed0d499067d121239b193e5ba3bb4f0"}, + {file = "Cython-3.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:16873d78be63bd38ffb759da7ab82814b36f56c769ee02b1d5859560e4c3ac3c"}, + {file = "Cython-3.0.8-py2.py3-none-any.whl", hash = "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6"}, + {file = "Cython-3.0.8.tar.gz", hash = "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6"}, +] + +[[package]] +name = "deepdiff" +version = "6.7.1" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.7" +files = [ + {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, + {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, +] + +[package.dependencies] +ordered-set = ">=4.0.2,<4.2.0" + +[package.extras] +cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] +optimize = ["orjson"] + [[package]] name = "dill" version = "0.3.7" @@ -254,43 +288,58 @@ graph = ["objgraph (>=1.7.2)"] [[package]] name = "dipy" -version = "1.7.0" -description = "Diffusion MRI utilities in python" +version = "1.8.0" +description = "Diffusion MRI Imaging in Python" optional = false -python-versions = ">= 3.6" +python-versions = ">=3.8" files = [ - {file = "dipy-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:34f1c6323f4e884dcd0e3f1dd51666d9059f1abb146fd78105aaf4c33f45184c"}, - {file = "dipy-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8ea49b11abf423fb8abcd28dc8549467e4ea32a297db1c89301cfb49c57eb99"}, - {file = "dipy-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77cf294ac16fe548cbbca4aaea2a9c993e1d2e4230416926973d50aebae91b43"}, - {file = "dipy-1.7.0-cp310-none-win_amd64.whl", hash = "sha256:c5df095b3bf41d8bb8568efe3b6a83ec87fe4bbc6bdc5895d0160a1688961e21"}, - {file = "dipy-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cce5db9595e4910fe5818f50d1ef45f29239a47ddb06e46c3c43559abe30aadb"}, - {file = "dipy-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:83fd19a0347d52590ed45d5fa4ca0e6723a6c96a455c46f3696dc4feba131f53"}, - {file = "dipy-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ff4cc129fed6f30d11f925350dc79edda6eda7815b04a59b486415746faa6a9"}, - {file = "dipy-1.7.0-cp311-none-win_amd64.whl", hash = "sha256:53cac93c25e0ee5c3ecbbc17a1fcef6607564098ae1eedfbd5f548dbdde74bdd"}, - {file = "dipy-1.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c4b7f8acc389065ee62c16d5087a625de0545fc1fcdbd28866749b7195e3f761"}, - {file = "dipy-1.7.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d21c069950ea7319e9580c5513c84232f5d06c68b4c047ab4bd8a11b2bcf51b5"}, - {file = "dipy-1.7.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ffe4638780d2224871c139a74b83ab4dfb443705e405f8dbf1ee5956a5d413aa"}, - {file = "dipy-1.7.0-cp38-none-win_amd64.whl", hash = "sha256:d70498b8950a75f250059362244a63e4c597f9ab70b5d8ad1537d311b92b7303"}, - {file = "dipy-1.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e333506d3eb29c8474fa2431928684cc04a79531d23647e7e9906c0753817ea9"}, - {file = "dipy-1.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2dff5b1b19d3df497ff2252cb25a2610390068d1e6cd1e822719732d8701d7f"}, - {file = "dipy-1.7.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67b55e6f379396c55fbe9dde9e888b9e60543285839110e0f096030bdb5d0968"}, - {file = "dipy-1.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21bd7b14048f80ef7b74cd52a6ffeaf2b8b7337f5cf4e88e95af9827cfea7f96"}, - {file = "dipy-1.7.0-cp39-none-win_amd64.whl", hash = "sha256:a6e0b216b91e3f98dbb2140a8668daff9d0b469630eeaab3482975034d791aed"}, - {file = "dipy-1.7.0.tar.gz", hash = "sha256:59bb647128aae7793215c813bb8ea35dae260ac9f0d938c724064f0af5a05cc3"}, + {file = "dipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:73ed2a3f61f0ce7b6ccd6bac077c74e1d22e83821435b7db08484081ad54c35e"}, + {file = "dipy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bb763b773745d1fb49118a5c15cf5d672097e0dd1ab92046387cca17675a5a1"}, + {file = "dipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b03824d44dd4d1c02e593f7464d40591e96f79fb9e22bb07462d369d3391909f"}, + {file = "dipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335383d87206cc5a86119352e323e3ccda7e459f2297672dbdfdb34186564f58"}, + {file = "dipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:a59dbaa1dd20aa17f81b28a624efe4a77d83c998e033c981c99bbe11bf23eefc"}, + {file = "dipy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8095377f4f13d0e33e564d28fd4a1556935ce4c34e754545c2e57d2a636b04aa"}, + {file = "dipy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:875fd4caac15a48b1304e22f9411ebd2df867a5bea2f90dfd81ebe2ef0d8c0d5"}, + {file = "dipy-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:355a7b521b84b20d707893cc280666490d79c513fdc97859a1e1072d34cda1e7"}, + {file = "dipy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ba7d8a4645c66f9fa6a65ddb794e7d8ccfe79f447dfbde74b4a6dc3d9fb872"}, + {file = "dipy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:e2984d4058e294584510119605e802e2a5fa4aed5b3c5435c02d3d1245ba9610"}, + {file = "dipy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:37cb73c27f346b868d67c35140a0a9b54268fa564df495e90e266c64c08fb487"}, + {file = "dipy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bfdb7c4247db24362fee942d2ad2cbaecf4ce7dd77b67e468e9f4271fe913d14"}, + {file = "dipy-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9c18f87eacaca27a2bf9f0b24691bc28b8e38bc1315ebb191ea209e7c4a4dad"}, + {file = "dipy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55cd4beb24a973079069d64fff1fd73e1b91d6f03d124798a6b256a96f0f2fbb"}, + {file = "dipy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:fafbb3f4593f379e88848b4ca699e22903eb516191b140c3356ba9041059223b"}, + {file = "dipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea3075643a81a0af1367886c58c28dfbc7e5a5ef500f4724345885be9990f8ac"}, + {file = "dipy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5430b48941992b0e23b95933fe13423e67acfe234cc924a56d909f81a3a80ea3"}, + {file = "dipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf0910fece4b77432b38e8a4e9e5cdaaf1a27c7b043f4504c46c9436962efa4"}, + {file = "dipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:238d96379539861977998f3289bd5625189727aac61e147d812652a97e4ce28b"}, + {file = "dipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7e14db9fed595f236763e9f14bc7f9bc3e02de05188d2f26397cf1e8d0764ccf"}, + {file = "dipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f9f3c5458ebb2e4d2f1a637c9e63bda5cf290e55ef4ef6c57fa0c3cf241f877"}, + {file = "dipy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2b6198f7b27337a5b5eea43f78351065613162ffd5e848907a8ca16c85444d8"}, + {file = "dipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5e48614f6ea0babad00989f8a4da1b3e8659d10f25ba82af79db770b2c63596"}, + {file = "dipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:442cba11e27ef8edb0b83c08cb75ec244b4929e106da5d171cb661f9ce61b1dc"}, + {file = "dipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e343d959a69787c0db25a772a46efcf632534c26e5fa8597bef26ddf9c31caa8"}, + {file = "dipy-1.8.0.tar.gz", hash = "sha256:cc3845585b6ccd5d7bf43094d52a00eb73111072eee36c2149fabdb1b071f008"}, ] [package.dependencies] -h5py = ">=2.8.0" +cython = ">=0.29.24,<0.29.29 || >0.29.29" +h5py = ">=3.1.0" nibabel = ">=3.0.0" -scipy = ">=1.1" +numpy = ">=1.22.4" +packaging = ">=21" +scipy = ">=1.8" tqdm = ">=4.30.0" +trx-python = ">=0.2.9" [package.extras] -all = ["boto3", "coverage", "coveralls", "cvxpy", "cython", "fury (>=0.8.0)", "h5py", "h5py (<3.0.0)", "matplotlib", "nibabel (>=3.0.0)", "numpy", "pandas", "pytest", "scikit-image", "scikit-learn", "scipy", "statsmodels", "tables", "tensorflowtensorflow-addons"] -doc = ["boto3", "cvxpy", "cython", "fury (>=0.8.0)", "h5py", "h5py (<3.0.0)", "matplotlib", "nibabel (>=3.0.0)", "numpy", "pandas", "scikit-image", "scikit-learn", "scipy", "statsmodels", "tables"] -ml = ["pandas", "scikit-learn", "statsmodels", "tables", "tensorflowtensorflow-addons"] -test = ["coverage", "coveralls", "pytest"] -viz = ["fury (>=0.8.0)", "matplotlib"] +all = ["dipy[dev,doc,extra,ml,style,test,viz]"] +dev = ["Cython (>=0.29.32)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.22)", "packaging (>=21)", "setuptools (>=67)", "spin (>=0.5)", "wheel"] +doc = ["Jinja2", "grg-sphinx-theme (>=0.2.0)", "numpydoc", "sphinx (>=5.3,<6.0)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli", "tomli (>=2.0.1)"] +extra = ["boto3", "cvxpy", "dipy[ml,viz]", "scikit-image"] +ml = ["pandas", "scikit_learn", "statsmodels (>=0.14.0)", "tables", "tensorflow", "tensorflow-addons"] +style = ["flake8", "isort"] +test = ["asv", "codecov", "coverage", "coveralls", "pytest"] +viz = ["fury (>=0.9.0)", "matplotlib"] [[package]] name = "ecos" @@ -323,59 +372,59 @@ scipy = ">=0.9" [[package]] name = "fonttools" -version = "4.43.1" +version = "4.47.2" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273"}, - {file = "fonttools-4.43.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c"}, - {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca"}, - {file = "fonttools-4.43.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6"}, - {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184"}, - {file = "fonttools-4.43.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7"}, - {file = "fonttools-4.43.1-cp310-cp310-win32.whl", hash = "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02"}, - {file = "fonttools-4.43.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef"}, - {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b"}, - {file = "fonttools-4.43.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f"}, - {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0"}, - {file = "fonttools-4.43.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8"}, - {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd"}, - {file = "fonttools-4.43.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b"}, - {file = "fonttools-4.43.1-cp311-cp311-win32.whl", hash = "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204"}, - {file = "fonttools-4.43.1-cp311-cp311-win_amd64.whl", hash = "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8"}, - {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5"}, - {file = "fonttools-4.43.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c"}, - {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680"}, - {file = "fonttools-4.43.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215"}, - {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3"}, - {file = "fonttools-4.43.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b"}, - {file = "fonttools-4.43.1-cp312-cp312-win32.whl", hash = "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f"}, - {file = "fonttools-4.43.1-cp312-cp312-win_amd64.whl", hash = "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72"}, - {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590"}, - {file = "fonttools-4.43.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7"}, - {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6"}, - {file = "fonttools-4.43.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d"}, - {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0"}, - {file = "fonttools-4.43.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933"}, - {file = "fonttools-4.43.1-cp38-cp38-win32.whl", hash = "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b"}, - {file = "fonttools-4.43.1-cp38-cp38-win_amd64.whl", hash = "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896"}, - {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba"}, - {file = "fonttools-4.43.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13"}, - {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477"}, - {file = "fonttools-4.43.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860"}, - {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86"}, - {file = "fonttools-4.43.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3"}, - {file = "fonttools-4.43.1-cp39-cp39-win32.whl", hash = "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad"}, - {file = "fonttools-4.43.1-cp39-cp39-win_amd64.whl", hash = "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a"}, - {file = "fonttools-4.43.1-py3-none-any.whl", hash = "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9"}, - {file = "fonttools-4.43.1.tar.gz", hash = "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212"}, + {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, + {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, + {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, + {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, + {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, + {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, + {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, + {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, + {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, + {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, + {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, + {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, + {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, + {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, + {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, + {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, + {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, + {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, + {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, + {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, + {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, + {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, + {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, + {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, + {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, + {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, + {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, + {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, + {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, + {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, + {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, + {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, + {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, + {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, + {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, + {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, + {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, + {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, + {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, + {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, + {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, + {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0,<5)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] @@ -383,7 +432,7 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -560,52 +609,51 @@ files = [ [[package]] name = "matplotlib" -version = "3.8.0" +version = "3.8.2" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c4940bad88a932ddc69734274f6fb047207e008389489f2b6f77d9ca485f0e7a"}, - {file = "matplotlib-3.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a33bd3045c7452ca1fa65676d88ba940867880e13e2546abb143035fa9072a9d"}, - {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ea6886e93401c22e534bbfd39201ce8931b75502895cfb115cbdbbe2d31f287"}, - {file = "matplotlib-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d670b9348e712ec176de225d425f150dc8e37b13010d85233c539b547da0be39"}, - {file = "matplotlib-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7b37b74f00c4cb6af908cb9a00779d97d294e89fd2145ad43f0cdc23f635760c"}, - {file = "matplotlib-3.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:0e723f5b96f3cd4aad99103dc93e9e3cdc4f18afdcc76951f4857b46f8e39d2d"}, - {file = "matplotlib-3.8.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5dc945a9cb2deb7d197ba23eb4c210e591d52d77bf0ba27c35fc82dec9fa78d4"}, - {file = "matplotlib-3.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8b5a1bf27d078453aa7b5b27f52580e16360d02df6d3dc9504f3d2ce11f6309"}, - {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f25ffb6ad972cdffa7df8e5be4b1e3cadd2f8d43fc72085feb1518006178394"}, - {file = "matplotlib-3.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee482731c8c17d86d9ddb5194d38621f9b0f0d53c99006275a12523ab021732"}, - {file = "matplotlib-3.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:36eafe2128772195b373e1242df28d1b7ec6c04c15b090b8d9e335d55a323900"}, - {file = "matplotlib-3.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:061ee58facb3580cd2d046a6d227fb77e9295599c5ec6ad069f06b5821ad1cfc"}, - {file = "matplotlib-3.8.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3cc3776836d0f4f22654a7f2d2ec2004618d5cf86b7185318381f73b80fd8a2d"}, - {file = "matplotlib-3.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c49a2bd6981264bddcb8c317b6bd25febcece9e2ebfcbc34e7f4c0c867c09dc"}, - {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ed11654fc83cd6cfdf6170b453e437674a050a452133a064d47f2f1371f8d3"}, - {file = "matplotlib-3.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae97fdd6996b3a25da8ee43e3fc734fff502f396801063c6b76c20b56683196"}, - {file = "matplotlib-3.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:87df75f528020a6299f76a1d986c0ed4406e3b2bd44bc5e306e46bca7d45e53e"}, - {file = "matplotlib-3.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:90d74a95fe055f73a6cd737beecc1b81c26f2893b7a3751d52b53ff06ca53f36"}, - {file = "matplotlib-3.8.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c3499c312f5def8f362a2bf761d04fa2d452b333f3a9a3f58805273719bf20d9"}, - {file = "matplotlib-3.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31e793c8bd4ea268cc5d3a695c27b30650ec35238626961d73085d5e94b6ab68"}, - {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d5ee602ef517a89d1f2c508ca189cfc395dd0b4a08284fb1b97a78eec354644"}, - {file = "matplotlib-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5de39dc61ca35342cf409e031f70f18219f2c48380d3886c1cf5ad9f17898e06"}, - {file = "matplotlib-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dd386c80a98b5f51571b9484bf6c6976de383cd2a8cd972b6a9562d85c6d2087"}, - {file = "matplotlib-3.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f691b4ef47c7384d0936b2e8ebdeb5d526c81d004ad9403dfb9d4c76b9979a93"}, - {file = "matplotlib-3.8.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b11f354aae62a2aa53ec5bb09946f5f06fc41793e351a04ff60223ea9162955"}, - {file = "matplotlib-3.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f54b9fb87ca5acbcdd0f286021bedc162e1425fa5555ebf3b3dfc167b955ad9"}, - {file = "matplotlib-3.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:60a6e04dfd77c0d3bcfee61c3cd335fff1b917c2f303b32524cd1235e194ef99"}, - {file = "matplotlib-3.8.0.tar.gz", hash = "sha256:df8505e1c19d5c2c26aff3497a7cbd3ccfc2e97043d1e4db3e76afa399164b69"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, + {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, + {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, + {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, + {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, + {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, + {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, + {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, + {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, + {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, + {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, + {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, + {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, + {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, + {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, + {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, + {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, + {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, + {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, ] [package.dependencies] contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" -kiwisolver = ">=1.0.1" +kiwisolver = ">=1.3.1" numpy = ">=1.21,<2" packaging = ">=20.0" -pillow = ">=6.2.0" +pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "multiprocess" @@ -637,67 +685,92 @@ dill = ">=0.3.7" [[package]] name = "nibabel" -version = "5.1.0" +version = "5.2.0" description = "Access a multitude of neuroimaging data formats" optional = false python-versions = ">=3.8" files = [ - {file = "nibabel-5.1.0-py3-none-any.whl", hash = "sha256:b3deb8130c835b9d26e80880b0d5e443d9e3f30972b3b0302dd2fafa3ca629f8"}, - {file = "nibabel-5.1.0.tar.gz", hash = "sha256:ce73ca5e957209e7219a223cb71f77235c9df2acf4d3f27f861ba38e9481ac53"}, + {file = "nibabel-5.2.0-py3-none-any.whl", hash = "sha256:77724af6e29fd9c4173702e4d031e7d8c45b5963887905a0f90edab880381b7f"}, + {file = "nibabel-5.2.0.tar.gz", hash = "sha256:3df8f1ab981d1bd92f4331d565528d126ab9717fdbd4cfe68f43fcd1c2bf3f52"}, ] [package.dependencies] -numpy = ">=1.19" +numpy = ">=1.20" packaging = ">=17" [package.extras] -all = ["nibabel[dev,dicomfs,doc,minc2,spm,style,test,zstd]"] -dev = ["gitpython", "nibabel[style]", "twine"] +all = ["nibabel[dicomfs,minc2,spm,zstd]"] +dev = ["tox"] dicom = ["pydicom (>=1.0.0)"] dicomfs = ["nibabel[dicom]", "pillow"] -doc = ["matplotlib (>=1.5.3)", "numpydoc", "sphinx (>=5.3,<6.0)", "texext", "tomli"] -doctest = ["nibabel[doc,test]"] +doc = ["matplotlib (>=1.5.3)", "numpydoc", "sphinx", "texext", "tomli"] +doctest = ["tox"] minc2 = ["h5py"] spm = ["scipy"] -style = ["blue", "flake8", "isort"] -test = ["coverage", "pytest (!=5.3.4)", "pytest-cov", "pytest-doctestplus", "pytest-httpserver", "pytest-xdist"] -typing = ["importlib-resources", "mypy", "pydicom", "pytest", "pyzstd", "types-pillow", "types-setuptools"] +style = ["tox"] +test = ["pytest", "pytest-cov", "pytest-doctestplus", "pytest-httpserver", "pytest-xdist"] +typing = ["tox"] zstd = ["pyzstd (>=0.14.3)"] [[package]] name = "numpy" -version = "1.25.2" +version = "1.26.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3"}, - {file = "numpy-1.25.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187"}, - {file = "numpy-1.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357"}, - {file = "numpy-1.25.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9"}, - {file = "numpy-1.25.2-cp310-cp310-win32.whl", hash = "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044"}, - {file = "numpy-1.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418"}, - {file = "numpy-1.25.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2"}, - {file = "numpy-1.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf"}, - {file = "numpy-1.25.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364"}, - {file = "numpy-1.25.2-cp311-cp311-win32.whl", hash = "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d"}, - {file = "numpy-1.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3"}, - {file = "numpy-1.25.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca"}, - {file = "numpy-1.25.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295"}, - {file = "numpy-1.25.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f"}, - {file = "numpy-1.25.2-cp39-cp39-win32.whl", hash = "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01"}, - {file = "numpy-1.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901"}, - {file = "numpy-1.25.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf"}, - {file = "numpy-1.25.2.tar.gz", hash = "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, + {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, + {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, + {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, + {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, + {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, + {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, + {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, + {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, + {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, + {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, + {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, + {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, + {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, + {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, + {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, + {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, + {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, + {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, + {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, + {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, + {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, + {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, +] + +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, ] +[package.extras] +dev = ["black", "mypy", "pytest"] + [[package]] name = "osqp" version = "0.6.3" @@ -750,70 +823,88 @@ files = [ [[package]] name = "pillow" -version = "10.0.1" +version = "10.2.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a"}, - {file = "Pillow-10.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f"}, - {file = "Pillow-10.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf"}, - {file = "Pillow-10.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd"}, - {file = "Pillow-10.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1"}, - {file = "Pillow-10.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205"}, - {file = "Pillow-10.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b"}, - {file = "Pillow-10.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1"}, - {file = "Pillow-10.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b"}, - {file = "Pillow-10.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a"}, - {file = "Pillow-10.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4"}, - {file = "Pillow-10.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08"}, - {file = "Pillow-10.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a"}, - {file = "Pillow-10.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d"}, - {file = "Pillow-10.0.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a"}, - {file = "Pillow-10.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7"}, - {file = "Pillow-10.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849"}, - {file = "Pillow-10.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f"}, - {file = "Pillow-10.0.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2"}, - {file = "Pillow-10.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf"}, - {file = "Pillow-10.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4"}, - {file = "Pillow-10.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d"}, - {file = "Pillow-10.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d"}, - {file = "Pillow-10.0.1.tar.gz", hash = "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pluggy" @@ -860,13 +951,13 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.4.2" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] @@ -878,6 +969,25 @@ pluggy = ">=0.12,<2.0" [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-docker" +version = "2.0.1" +description = "Simple pytest fixtures for Docker and Docker Compose based tests" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-docker-2.0.1.tar.gz", hash = "sha256:1c17e9202a566f85ed5ef269fe2815bd4899e90eb639622e5d14277372ca7524"}, + {file = "pytest_docker-2.0.1-py3-none-any.whl", hash = "sha256:7103f97b8c479c826b63d73cfb83383dc1970d35105ed1ce78a722c90c7fe650"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +pytest = ">=4.0,<8.0" + +[package.extras] +docker-compose-v1 = ["docker-compose (>=1.27.3,<2.0)"] +tests = ["pytest-pycodestyle (>=2.0.0,<3.0)", "pytest-pylint (>=0.14.1,<1.0)", "requests (>=2.22.0,<3.0)"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -926,84 +1036,92 @@ scipy = ">=0.13.2" [[package]] name = "scipy" -version = "1.9.3" +version = "1.11.4" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, + {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, + {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, + {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, + {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, + {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, + {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, + {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, + {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, + {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, + {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, + {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, + {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, + {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, + {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, + {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, + {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, + {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, ] [package.dependencies] -numpy = ">=1.18.5,<1.26.0" +numpy = ">=1.21.6,<1.28.0" [package.extras] -dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] -doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] -test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] +doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scs" -version = "3.2.3" -description = "scs: splitting conic solver" +version = "3.2.4.post1" +description = "Splitting conic solver" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "scs-3.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d7f7fd2d2cd88938c159b15e8915d9536610e50a9c34ecf36ce0290807afe55"}, - {file = "scs-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368194620918301bf5309a35a7cd0444f1b1992b182c0a29033c26eb97b3dcb2"}, - {file = "scs-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:2d835a74c283be73bff6e1978d3ae77a60d9e87db1fdd12916464fa2a1dda517"}, - {file = "scs-3.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81511fda3254c0d29089443dcd2305e81d203509e4d77afd160e9174b15ad75a"}, - {file = "scs-3.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715ca4532de39b462bd393f9e8b4bf57be4122e20f0780d00db3cab1450a585d"}, - {file = "scs-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fcf4b985a787135b3e83682a4c5b9bce9c6290cfead1d7225c38f34f5ead7187"}, - {file = "scs-3.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:91f5194cfabe354c9b1f0ea1de82114028d81c5a4a633177b8da2fe36f301758"}, - {file = "scs-3.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0d15f21e9053c5df37dab0d700da55fcc71f2f454748f364b9de594988b2ab3"}, - {file = "scs-3.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6a80727167ad73151ced202a1ac6c0c7644b00b2e2607edec8a8807fc0443ac8"}, - {file = "scs-3.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79d7d6c42ee636821460d317b8250945ce04363a47a63aef6b1eae0bd7a418fc"}, - {file = "scs-3.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f64d23247797cfa289095fb5ddea6eeff5adf98961e953da90233278827e0c"}, - {file = "scs-3.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:9a14a7c80efb34b469eb4dbaf26a9104dd2ca93e477985f948d8f28cd4b1a2ba"}, - {file = "scs-3.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3eb601738b260e3dcad117f3e02aceaca5d1e8eac2be225be1c0f9cbf83e75cb"}, - {file = "scs-3.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1b24176de97ecedf698596086f85da6dad472fe38a4b21cf4b460f87cae2c37"}, - {file = "scs-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:ddaa5af34a0e1f636d312eb1901bd407383f0b04dda50fba7242d56e618c0966"}, - {file = "scs-3.2.3.tar.gz", hash = "sha256:e3bd779e7e977e3ae5a2f2035aa4c2a309e29082d59a722d5d6592edc4bdb4b3"}, + {file = "scs-3.2.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51fed30d2a4a1e6fbfc1e52b4cb3adeecbe89d7c47f3539b49afbb852415fe19"}, + {file = "scs-3.2.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0524c0b9c3ed0d65dae161475accf3efa8e170938eb93251a60e9709b156ee"}, + {file = "scs-3.2.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:534519819eea96f18902a9fce15c4ec562b99d23b38dc843a48cb137b5641613"}, + {file = "scs-3.2.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d04ee4d19ac6d0f5053663bc48fcd5c5faed534272f13b10a4e173c814eea69"}, + {file = "scs-3.2.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c23b4299ab77ff5f654573d5667dc982292a8ef2b979053b38c40663919f13"}, + {file = "scs-3.2.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ae4624938d3e3a8b7e508029275c6ad7a978fd48c158d0818f69f4ae764bf945"}, + {file = "scs-3.2.4.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40294e22bfe509bdf7fd65a6b77c38cec22dcb3567ff5a75f3c41a1faf2ef1d5"}, + {file = "scs-3.2.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2337acb0604770b6df1473254065a51c210ff9c82fc7c4490595510287a337"}, + {file = "scs-3.2.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8689e75a57e59846e65d1c4b9d57e9964b00fcbb8e67fc77f98cf6e0a0530abd"}, + {file = "scs-3.2.4.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad991b00d0a87c85db57bf2f1863c21bdc4e2f13837f6c35e809f5936bc6f165"}, + {file = "scs-3.2.4.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28af160a44268e726a59d6cf340629b82940c1a643c4c87fe777e9cbe550d75"}, + {file = "scs-3.2.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:f6283f725f3fee63d4631c2532d01a5b2ea65883b04d3da3be06084b1c60171b"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b3a622cf2120ae765f0f3ad5c6f4f86796d317e29132bab2ad4af3c14d9bf4d"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4b5259137c263304effa2b28d0125437ac23569e6e7753c115ae1206ec5033fd"}, + {file = "scs-3.2.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424710bc19b0506feee7e05e6d2b7af98acf09af5bd5353126164cbd46ac923f"}, + {file = "scs-3.2.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:e21bdc8046648846e2c204a6c5cf24eaaedd2b8f5e0a2ab41a647b0247b8d592"}, + {file = "scs-3.2.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cea0f7e9473f43f7edf1641d020ead7e39653a81c540fbdba8f3b7b8480038c9"}, + {file = "scs-3.2.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6126f1d7ed5ff368cb8c1836715b17a50074314579eefc6d511995a3ab93d70"}, + {file = "scs-3.2.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:18788befa5284bb1f49149bac7f813703de60ef5b6bf7698a9f1c3a5a49b78e4"}, + {file = "scs-3.2.4.post1.tar.gz", hash = "sha256:7015d7a56d1d5b53264fd277289ea169949309e26101677ff88cd0e5030d032f"}, ] [package.dependencies] -numpy = ">=1.7" -scipy = ">=0.13.2" +numpy = "*" +scipy = "*" [[package]] name = "setuptools" -version = "68.2.2" +version = "69.0.3" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] @@ -1059,18 +1177,40 @@ notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] +[[package]] +name = "trx-python" +version = "0.2.9" +description = "Experiments with new file format for tractography" +optional = false +python-versions = ">=3.8" +files = [ + {file = "trx-python-0.2.9.tar.gz", hash = "sha256:16b4104d7c991879c601f60e8d587decac50ce60388aae8d0c754a92136d1caf"}, + {file = "trx_python-0.2.9-py3-none-any.whl", hash = "sha256:234438b7f103c49768ab98e5f46e7b2624327065cd23fbfce5e681c32e8b4a3f"}, +] + +[package.dependencies] +deepdiff = "*" +nibabel = ">=5" +numpy = ">=1.22" +setuptools-scm = "*" + +[package.extras] +all = ["astroid (==2.15.8)", "flake8", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest (>=7)", "pytest-console-scripts (>=0)", "sphinx", "sphinx-autoapi"] +doc = ["astroid (==2.15.8)", "numpydoc", "pydata-sphinx-theme", "sphinx", "sphinx-autoapi"] +test = ["flake8", "psutil", "pytest (>=7)", "pytest-console-scripts (>=0)"] + [[package]] name = "typing-extensions" -version = "4.8.0" +version = "4.9.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] [metadata] lock-version = "2.0" python-versions = ">=3.11, <4.0" -content-hash = "3bae969f933471e95154b83aa690405a5379de1358aa6c31c20f0e4e4d0bcdd4" +content-hash = "ac8aa6f37aff1ef69b02c8717ef0fb1ffd8c2136f46ae37bfa2fb1c0e96e46bb" diff --git a/pydesigner/main.py b/pydesigner/main.py index 2a60d07..6a3bf37 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -25,7 +25,7 @@ # Locate mrtrix3 via which-ing dwidenoise dwidenoise_location = shutil.which("dwidenoise") if dwidenoise_location is None: - raise Exception("Cannot find mrtrix3, please see " "https://github.com/m-ama/PyDesigner/wiki" " to troubleshoot.") + raise OSError("Cannot find mrtrix3, please see " "https://github.com/m-ama/PyDesigner/wiki" " to troubleshoot.") # Extract mrtrix3 path from dwidenoise_location mrtrix3path = op.dirname(dwidenoise_location) @@ -33,7 +33,7 @@ # Locate FSL via which-ing fsl fsl_location = shutil.which("fsl") if fsl_location is None: - raise Exception("Cannot find FSL, please see " "https://github.com/m-ama/PyDesigner/wiki" " to troubleshoot.") + raise OSError("Cannot find FSL, please see " "https://github.com/m-ama/PyDesigner/wiki" " to troubleshoot.") # Extract FSL path from fsl_location fslpath = op.dirname(fsl_location) diff --git a/pyproject.toml b/pyproject.toml index fb89f3c..4cfb330 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.11, <4.0" -numpy = ">=1.20.0, <1.26.0" +numpy = ">=1.20.0, <1.30.0" scipy = ">=1.5.0, <2.0.0" joblib = ">=1.2.0, <2.0.0" tqdm = ">=4.65.0, <5.0.0" @@ -43,6 +43,7 @@ pydesigner = "pydesigner.main:main" [tool.poetry.group.dev.dependencies] pytest = ">=7.4.0, <8.0.0" +pytest-docker = ">=2.0.0, <3.0.0" [build-system] requires = ["poetry-core"] diff --git a/requirements-dev.txt b/requirements-dev.txt index d0d2387..94429c7 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,7 @@ +attrs==23.2.0 ; python_version >= "3.11" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" -pytest==7.4.2 ; python_version >= "3.11" and python_version < "4.0" +pytest-docker==2.0.1 ; python_version >= "3.11" and python_version < "4.0" +pytest==7.4.4 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index b43c24b..6acf0ff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,30 +1,34 @@ clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" -contourpy==1.1.1 ; python_version >= "3.11" and python_version < "4.0" +contourpy==1.2.0 ; python_version >= "3.11" and python_version < "4.0" cvxpy==1.4.1 ; python_version >= "3.11" and python_version < "4.0" cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" +cython==3.0.8 ; python_version >= "3.11" and python_version < "4.0" +deepdiff==6.7.1 ; python_version >= "3.11" and python_version < "4.0" dill==0.3.7 ; python_version >= "3.11" and python_version < "4.0" -dipy==1.7.0 ; python_version >= "3.11" and python_version < "4.0" +dipy==1.8.0 ; python_version >= "3.11" and python_version < "4.0" ecos==2.0.12 ; python_version >= "3.11" and python_version < "4.0" -fonttools==4.43.1 ; python_version >= "3.11" and python_version < "4.0" +fonttools==4.47.2 ; python_version >= "3.11" and python_version < "4.0" h5py==3.10.0 ; python_version >= "3.11" and python_version < "4.0" joblib==1.3.2 ; python_version >= "3.11" and python_version < "4.0" kiwisolver==1.4.5 ; python_version >= "3.11" and python_version < "4.0" -matplotlib==3.8.0 ; python_version >= "3.11" and python_version < "4.0" +matplotlib==3.8.2 ; python_version >= "3.11" and python_version < "4.0" multiprocess==0.70.15 ; python_version >= "3.11" and python_version < "4.0" -nibabel==5.1.0 ; python_version >= "3.11" and python_version < "4.0" -numpy==1.25.2 ; python_version >= "3.11" and python_version < "4.0" +nibabel==5.2.0 ; python_version >= "3.11" and python_version < "4.0" +numpy==1.26.3 ; python_version >= "3.11" and python_version < "4.0" +ordered-set==4.1.0 ; python_version >= "3.11" and python_version < "4.0" osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" -pillow==10.0.1 ; python_version >= "3.11" and python_version < "4.0" +pillow==10.2.0 ; python_version >= "3.11" and python_version < "4.0" pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" -scipy==1.9.3 ; python_version >= "3.11" and python_version < "4.0" -scs==3.2.3 ; python_version >= "3.11" and python_version < "4.0" +scipy==1.11.4 ; python_version >= "3.11" and python_version < "4.0" +scs==3.2.4.post1 ; python_version >= "3.11" and python_version < "4.0" setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" -setuptools==68.2.2 ; python_version >= "3.11" and python_version < "4.0" +setuptools==69.0.3 ; python_version >= "3.11" and python_version < "4.0" six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" -typing-extensions==4.8.0 ; python_version >= "3.11" and python_version < "4.0" +trx-python==0.2.9 ; python_version >= "3.11" and python_version < "4.0" +typing-extensions==4.9.0 ; python_version >= "3.11" and python_version < "4.0" From 5b63fa69522a85ae2cdc053979389a255bd04f14 Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Wed, 17 Jan 2024 18:47:02 +0000 Subject: [PATCH 15/78] Pre-commit autofix --- pydesigner/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydesigner/__init__.py b/pydesigner/__init__.py index 8417488..9dd81be 100644 --- a/pydesigner/__init__.py +++ b/pydesigner/__init__.py @@ -1,3 +1,3 @@ from importlib.metadata import version -__version__ = version(__name__) \ No newline at end of file +__version__ = version(__name__) From 38b5e2a84a08314a2a5155afc536c7ebaf797b2a Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 4 May 2024 01:09:31 -0400 Subject: [PATCH 16/78] Save work --- .github/workflows/pydesigner_build.yml | 39 ---- .gitignore | 4 +- Dockerfile | 146 ++++-------- LICENSE | 0 extras/dke_parameters.txt | 0 poetry.lock | 153 ++++++++++--- pydesigner/preprocessing/mrpreproc.py | 10 +- pyproject.toml | 2 +- requirements-dev.txt | 2 - requirements.txt | 3 + tests/conftest.py | 29 +++ tests/data/{ => hifi}/brain_mask.nii | Bin .../hifi_splenium_4vox no_sidecar.nii | Bin tests/data/{ => hifi}/hifi_splenium_4vox.bval | 0 tests/data/{ => hifi}/hifi_splenium_4vox.bvec | 0 tests/data/{ => hifi}/hifi_splenium_4vox.json | 0 tests/data/{ => hifi}/hifi_splenium_4vox.mif | 0 tests/data/{ => hifi}/hifi_splenium_4vox.nii | Bin .../data/{ => hifi}/hifi_splenium_mrgrid.mif | 0 tests/data/{ => hifi}/mean_b0.mif | 0 tests/test_fitting_dwipy.py | 78 +++---- tests/test_preprocessing_mrinfoutil.py | 211 +++++++++--------- tests/test_preprocessing_mrpreproc.py | 26 ++- 23 files changed, 361 insertions(+), 342 deletions(-) delete mode 100644 .github/workflows/pydesigner_build.yml mode change 100755 => 100644 LICENSE mode change 100755 => 100644 extras/dke_parameters.txt create mode 100644 tests/conftest.py rename tests/data/{ => hifi}/brain_mask.nii (100%) rename tests/data/{ => hifi}/hifi_splenium_4vox no_sidecar.nii (100%) rename tests/data/{ => hifi}/hifi_splenium_4vox.bval (100%) mode change 100755 => 100644 rename tests/data/{ => hifi}/hifi_splenium_4vox.bvec (100%) mode change 100755 => 100644 rename tests/data/{ => hifi}/hifi_splenium_4vox.json (100%) mode change 100755 => 100644 rename tests/data/{ => hifi}/hifi_splenium_4vox.mif (100%) rename tests/data/{ => hifi}/hifi_splenium_4vox.nii (100%) rename tests/data/{ => hifi}/hifi_splenium_mrgrid.mif (100%) rename tests/data/{ => hifi}/mean_b0.mif (100%) diff --git a/.github/workflows/pydesigner_build.yml b/.github/workflows/pydesigner_build.yml deleted file mode 100644 index ef11bce..0000000 --- a/.github/workflows/pydesigner_build.yml +++ /dev/null @@ -1,39 +0,0 @@ -# name: Docker Build and Push - -# on: -# push: -# tags: -# - '**' - -# jobs: -# docker: -# runs-on: ubuntu-latest -# steps: -# - -# name: Checkout -# uses: actions/checkout@v3 -# - -# name: Fetch version -# uses: SebRollen/toml-action@v1.0.2 -# id: version -# with: -# file: 'pyproject.toml' -# field: 'tool.poetry.version' -# - -# name: Set up QEMU -# uses: docker/setup-qemu-action@v3 -# - -# name: Set up Docker Buildx -# uses: docker/setup-buildx-action@v3 -# - -# name: Login to Docker Hub -# uses: docker/login-action@v3 -# with: -# username: ${{ secrets.DOCKERHUB_USERNAME }} -# password: ${{ secrets.DOCKERHUB_TOKEN }} -# - -# name: Build and push -# uses: docker/build-push-action@v5 -# with: -# push: true -# tags: dmri/neurodock:latest,dmri/neurodock:${{ steps.version.outputs.value }} diff --git a/.gitignore b/.gitignore index cbb3406..2394a8b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,8 @@ docs/html/ docs/doctrees/ # Files to ignore -.DS_Store +**.DS_Store +**._. +**._./ designer/._DESIGNER.py .nii diff --git a/Dockerfile b/Dockerfile index 782abe2..662658c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,104 +1,42 @@ -# # ============================================================================== -# # NeuroDock -# # A docker container that contains all PyDesigner dependencies such as MRTRIX3, -# # FSL, and Python to preprocess diffusion MRI images. -# # -# # Maintainer: Siddhartha Dhiman -# # ------------------------------------------------------------------------------ -# # Current Dependencies -# # 1.) FSL -# # 2.) MRTRIX3 -# # 3.) Python 2.7 -# # 4.) Python 3.6 -# # 6.) PyDesigner -# # ============================================================================== - -# # Load base Ubuntu image -# FROM python:3.11-bullseye - -# # Labels -# LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" -# LABEL org.label-schema.schema-version="1.0.0-rc1" -# LABEL org.label-schema.name="dmri/pydesigner" -# LABEL org.label-schema.description="A state-of-the-art difusion and kurtosis MRI processing pipeline" -# LABEL org.label-schema.url="https://github.com/m-ama/" -# LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" -# LABEL org.label-schema.vendor="MUSC BRIDGE" - -# # ARG DEBIAN_FRONTEND=noninteractive - -# # Initial update -# RUN apt update && \ -# apt-get install -y \ -# apt-utils \ -# wget \ -# curl \ -# nano \ -# software-properties-common \ -# python3 \ -# python3-pip \ -# jq \ -# libblas-dev \ -# liblapack-dev \ -# libatlas-base-dev \ -# gfortran \ -# git \ -# g++ \ -# python \ -# libeigen3-dev \ -# zlib1g-dev \ -# libqt5opengl5-dev \ -# libqt5svg5-dev \ -# libgl1-mesa-dev \ -# libfftw3-dev \ -# libtiff5-dev \ -# libpng-dev - -# # Copy and install PyDesigner -# RUN mkdir -p /pydesigner -# COPY /pydesigner /app/pydesigner -# COPY pyproject.toml app/ -# RUN ls -# RUN ls -la /app -# WORKDIR /app -# ENV PYTHONPATH=${PYTHONPATH}:${PWD} -# RUN pip3 install poetry -# RUN poetry config virtualenvs.create false -# RUN poetry install --no-dev - -# # Install Python dependencies -# RUN pip3 install --upgrade setuptools && \ -# pip3 install numpy \ -# pandas \ -# scipy \ -# joblib \ -# multiprocess \ -# tqdm \ -# nibabel \ -# cvxpy - -# # Install FSL -# RUN curl https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py -o /tmp/fslinstaller.py -# RUN echo "/usr/local/fsl" | python2 /tmp/fslinstaller.py -V 6.0.3 - -# # Configure FSL Environment -# ENV FSLDIR=/usr/local/fsl -# ENV FSLOUTPUTTYPE=NIFTI_GZ -# ENV PATH=$PATH:$FSLDIR/bin -# ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FSLDIR - -# # Build and Configure MRTRIX3 -# RUN git clone https://github.com/MRtrix3/mrtrix3.git /usr/lib/mrtrix3 -# ENV CXX=/usr/bin/clang++ -# ENV ARCH=native -# RUN cd /usr/lib/mrtrix3 && \ -# ./configure -nogui -openmp && \ -# ./build && \ -# ./set_path -# ENV PATH=$PATH:/usr/lib/mrtrix3/bin - -# # Remove unwanted packages -# RUN apt-get autoremove && apt-get clean -# RUN rm /tmp/fslinstaller.py && rm -r /tmp/PyDesigner - -# USER bridge +# ============================================================================== +# NeuroDock +# A docker container that contains all PyDesigner dependencies such as MRTRIX3, +# FSL, and Python to preprocess diffusion MRI images. +# +# Maintainer: Siddhartha Dhiman +# ============================================================================== + +# Load base Ubuntu image +FROM dmri/ci-cd AS base + +# Labels +LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" +LABEL org.label-schema.name="dmri/pydesigner" +LABEL org.label-schema.description="A state-of-the-art difusion and kurtosis MRI processing pipeline" +LABEL org.label-schema.url="https://github.com/m-ama/" +LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" +LABEL org.label-schema.vendor="MUSC BRIDGE" + +# Copy and install PyDesigner +FROM base as dependencies +WORKDIR /src +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt + +FROM dependencies as development +COPY requirements-dev.txt ./ +RUN pip install --no-cache-dir -r requirements-dev.txt +COPY . . +RUN pip install --no-cache-dir --no-deps --editable . + +FROM dependencies as pyc +COPY . . +RUN python -m compileall -bqj0 . +RUN find . -name "*.py" -not -name "__init__.py" -delete + +FROM pyc as production +COPY --from=pyc /src . +RUN pip install --no-cache-dir --no-deps --editable . + +RUN useradd -ms /bin/bash bridge +USER bridge diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/extras/dke_parameters.txt b/extras/dke_parameters.txt old mode 100755 new mode 100644 diff --git a/poetry.lock b/poetry.lock index c759090..dd94105 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,24 +1,16 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] -name = "attrs" -version = "23.2.0" -description = "Classes Without Boilerplate" +name = "annotated-types" +version = "0.6.0" +description = "Reusable constraint types to use with typing.Annotated" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, + {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, ] -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] - [[package]] name = "clarabel" version = "0.6.0" @@ -935,6 +927,116 @@ files = [ [package.extras] global = ["pybind11-global (==2.11.1)"] +[[package]] +name = "pydantic" +version = "2.7.0" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic-2.7.0-py3-none-any.whl", hash = "sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352"}, + {file = "pydantic-2.7.0.tar.gz", hash = "sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"}, +] + +[package.dependencies] +annotated-types = ">=0.4.0" +pydantic-core = "2.18.1" +typing-extensions = ">=4.6.1" + +[package.extras] +email = ["email-validator (>=2.0.0)"] + +[[package]] +name = "pydantic-core" +version = "2.18.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6"}, + {file = "pydantic_core-2.18.1-cp310-none-win32.whl", hash = "sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649"}, + {file = "pydantic_core-2.18.1-cp310-none-win_amd64.whl", hash = "sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win32.whl", hash = "sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb"}, + {file = "pydantic_core-2.18.1-cp311-none-win_amd64.whl", hash = "sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win_arm64.whl", hash = "sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b"}, + {file = "pydantic_core-2.18.1-cp312-none-win32.whl", hash = "sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411"}, + {file = "pydantic_core-2.18.1-cp312-none-win_amd64.whl", hash = "sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6"}, + {file = "pydantic_core-2.18.1-cp312-none-win_arm64.whl", hash = "sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622"}, + {file = "pydantic_core-2.18.1-cp38-none-win32.whl", hash = "sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad"}, + {file = "pydantic_core-2.18.1-cp38-none-win_amd64.whl", hash = "sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6"}, + {file = "pydantic_core-2.18.1-cp39-none-win32.whl", hash = "sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b"}, + {file = "pydantic_core-2.18.1-cp39-none-win_amd64.whl", hash = "sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6"}, + {file = "pydantic_core-2.18.1.tar.gz", hash = "sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + [[package]] name = "pyparsing" version = "3.1.1" @@ -969,25 +1071,6 @@ pluggy = ">=0.12,<2.0" [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] -[[package]] -name = "pytest-docker" -version = "2.0.1" -description = "Simple pytest fixtures for Docker and Docker Compose based tests" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-docker-2.0.1.tar.gz", hash = "sha256:1c17e9202a566f85ed5ef269fe2815bd4899e90eb639622e5d14277372ca7524"}, - {file = "pytest_docker-2.0.1-py3-none-any.whl", hash = "sha256:7103f97b8c479c826b63d73cfb83383dc1970d35105ed1ce78a722c90c7fe650"}, -] - -[package.dependencies] -attrs = ">=19.2.0" -pytest = ">=4.0,<8.0" - -[package.extras] -docker-compose-v1 = ["docker-compose (>=1.27.3,<2.0)"] -tests = ["pytest-pycodestyle (>=2.0.0,<3.0)", "pytest-pylint (>=0.14.1,<1.0)", "requests (>=2.22.0,<3.0)"] - [[package]] name = "python-dateutil" version = "2.8.2" @@ -1213,4 +1296,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <4.0" -content-hash = "ac8aa6f37aff1ef69b02c8717ef0fb1ffd8c2136f46ae37bfa2fb1c0e96e46bb" +content-hash = "67698073d558d92ca6c1afd3258393bc50521bf9f5bfd85f2a637a34cd3f6077" diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index c40f1db..79b9e34 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -41,7 +41,7 @@ def miftonii(input, output, nthreads=None, force=True, verbose=False): niitomif """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise IOError("Input path does not exist. Please ensure that " "the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -49,14 +49,14 @@ def miftonii(input, output, nthreads=None, force=True, verbose=False): "directory.".format(op.dirname(output)) ) if op.splitext(output)[-1] != ".nii": - raise OSError("Output specified does not possess the .nii " "extension.") + raise IOError("Output specified does not possess the .nii " "extension.") if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise TypeError("Please specify the number of threads as an " "integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise TypeError("Please specify whether forced overwrite is True " "or False.") if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") + raise TypeError("Please specify whether verbose is True or False.") arg = ["mrconvert"] if force: arg.append("-force") diff --git a/pyproject.toml b/pyproject.toml index 4cfb330..2ad2a9d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,13 +37,13 @@ nibabel = ">=5.0.0, <6.0.0" dipy = ">=1.7.0, <2.0.0" cvxpy = ">1.3.0, <2.0.0" matplotlib = ">=3.7.0, <4.0.0" +pydantic = "^2.7.0" [tool.poetry.scripts] pydesigner = "pydesigner.main:main" [tool.poetry.group.dev.dependencies] pytest = ">=7.4.0, <8.0.0" -pytest-docker = ">=2.0.0, <3.0.0" [build-system] requires = ["poetry-core"] diff --git a/requirements-dev.txt b/requirements-dev.txt index 94429c7..523f7fc 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,5 @@ -attrs==23.2.0 ; python_version >= "3.11" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" -pytest-docker==2.0.1 ; python_version >= "3.11" and python_version < "4.0" pytest==7.4.4 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 6acf0ff..f26dc53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +annotated-types==0.6.0 ; python_version >= "3.11" and python_version < "4.0" clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" contourpy==1.2.0 ; python_version >= "3.11" and python_version < "4.0" @@ -21,6 +22,8 @@ osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" pillow==10.2.0 ; python_version >= "3.11" and python_version < "4.0" pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" +pydantic-core==2.18.1 ; python_version >= "3.11" and python_version < "4.0" +pydantic==2.7.0 ; python_version >= "3.11" and python_version < "4.0" pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..6b6ca71 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,29 @@ +import os +import pytest +from pathlib import Path + +TEST_DIR = Path(__file__).parent +DATA_DIR = os.path.join(TEST_DIR, "data") + +def load_data(type:str="hifi") -> dict: + """Loads sample dataset paths. + + Args: + type (str): Type of data to load. Defaults to "hifi". + + Returns: + dict: Sample data paths. + """ + if type == "hifi": + data_path = os.path.join(DATA_DIR, type) + data = { + "nifti": os.path.join(data_path, "hifi_splenium_4vox.nii"), + "mif": os.path.join(data_path, "hifi_splenium_4vox.mif"), + "bval": os.path.join(data_path, "hifi_splenium_4vox.bval"), + "bvec": os.path.join(data_path, "hifi_splenium_4vox.bvec"), + "json": os.path.join(data_path, "hifi_splenium_4vox.json"), + "mask": os.path.join(data_path, "brain_mask.nii"), + "mean_b0": os.path.join(data_path, "mean_b0.mif"), + "no_sidecar": os.path.join(data_path, "no_sidecar.nii"), + } + return data diff --git a/tests/data/brain_mask.nii b/tests/data/hifi/brain_mask.nii similarity index 100% rename from tests/data/brain_mask.nii rename to tests/data/hifi/brain_mask.nii diff --git a/tests/data/hifi_splenium_4vox no_sidecar.nii b/tests/data/hifi/hifi_splenium_4vox no_sidecar.nii similarity index 100% rename from tests/data/hifi_splenium_4vox no_sidecar.nii rename to tests/data/hifi/hifi_splenium_4vox no_sidecar.nii diff --git a/tests/data/hifi_splenium_4vox.bval b/tests/data/hifi/hifi_splenium_4vox.bval old mode 100755 new mode 100644 similarity index 100% rename from tests/data/hifi_splenium_4vox.bval rename to tests/data/hifi/hifi_splenium_4vox.bval diff --git a/tests/data/hifi_splenium_4vox.bvec b/tests/data/hifi/hifi_splenium_4vox.bvec old mode 100755 new mode 100644 similarity index 100% rename from tests/data/hifi_splenium_4vox.bvec rename to tests/data/hifi/hifi_splenium_4vox.bvec diff --git a/tests/data/hifi_splenium_4vox.json b/tests/data/hifi/hifi_splenium_4vox.json old mode 100755 new mode 100644 similarity index 100% rename from tests/data/hifi_splenium_4vox.json rename to tests/data/hifi/hifi_splenium_4vox.json diff --git a/tests/data/hifi_splenium_4vox.mif b/tests/data/hifi/hifi_splenium_4vox.mif similarity index 100% rename from tests/data/hifi_splenium_4vox.mif rename to tests/data/hifi/hifi_splenium_4vox.mif diff --git a/tests/data/hifi_splenium_4vox.nii b/tests/data/hifi/hifi_splenium_4vox.nii similarity index 100% rename from tests/data/hifi_splenium_4vox.nii rename to tests/data/hifi/hifi_splenium_4vox.nii diff --git a/tests/data/hifi_splenium_mrgrid.mif b/tests/data/hifi/hifi_splenium_mrgrid.mif similarity index 100% rename from tests/data/hifi_splenium_mrgrid.mif rename to tests/data/hifi/hifi_splenium_mrgrid.mif diff --git a/tests/data/mean_b0.mif b/tests/data/hifi/mean_b0.mif similarity index 100% rename from tests/data/mean_b0.mif rename to tests/data/hifi/mean_b0.mif diff --git a/tests/test_fitting_dwipy.py b/tests/test_fitting_dwipy.py index 95430ac..d0fe706 100644 --- a/tests/test_fitting_dwipy.py +++ b/tests/test_fitting_dwipy.py @@ -1,19 +1,15 @@ -import os -from pathlib import Path - import numpy as np import pytest +from conftest import load_data from pydesigner.fitting.dwipy import DWI -TEST_DIR = Path(__file__).parent -PATH_DWI = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.nii") -PATH_DWI_NOSIDECAR = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox_nosidecar.nii") -PATH_BVEC = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.bvec") -PATH_BVAL = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.bval") -PATH_JSON = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.json") -PATH_MIF = os.path.join(TEST_DIR, "data", "hifi_splenium_mrgrid.mif") -PATH_MASK = os.path.join(TEST_DIR, "data", "brain_mask.nii") +DATA = load_data(type="hifi") +DATA["nifti"] = DATA["nifti"] +DATA["bvec"] = DATA["bvec"] +DATA["bval"] = DATA["bval"] +PATH_JSON = DATA["json"] +PATH_MIF = DATA["mif"] def test_dwi_image_path_nonexistent(): @@ -25,30 +21,30 @@ def test_dwi_image_path_nonexistent(): def test_dwi_bvec_path_invalid(): """Tests whether function raises TypeError when bvec file input is invalid""" with pytest.raises(TypeError): - DWI(PATH_DWI, bvecPath=10) + DWI(DATA["nifti"], bvecPath=10) def test_dwi_bvec_path_nonexistent(): """Tests whether function raises OSError when bvec file is not found""" with pytest.raises(OSError): - DWI(PATH_DWI, bvecPath="foo") + DWI(DATA["nifti"], bvecPath="foo") def test_dwi_bval_path_invalid(): """Tests whether function raises TypeError when bval file input is invalid""" with pytest.raises(TypeError): - DWI(PATH_DWI, bvalPath=10) + DWI(DATA["nifti"], bvalPath=10) def test_dwi_bval_path_nonexistent(): """Tests whether function raises OSError when bval file is not found""" with pytest.raises(OSError): - DWI(PATH_DWI, bvalPath="foo") + DWI(DATA["nifti"], bvalPath="foo") def test_dwi_mask_path_nonexistent(capsys): """Tests whether function raises OSError when mask file is not found""" - DWI(PATH_DWI, mask="foo") + DWI(DATA["nifti"], mask="foo") captured = capsys.readouterr() assert "No brain mask supplied" in captured.out @@ -56,24 +52,24 @@ def test_dwi_mask_path_nonexistent(capsys): def test_dwi_path_nosidecar(): """Tests whether function raises OSError when sidecar files are not found""" with pytest.raises(OSError): - DWI(PATH_DWI_NOSIDECAR) + DWI(DATA["no_sidecar"]) def test_dwi_nthreads_nonint(): """Tests whether function raises TypeError when nthreads is not an int""" with pytest.raises(TypeError): - DWI(PATH_DWI, nthreads="foo") + DWI(DATA["nifti"], nthreads="foo") def test_dwi_nthreads_negative_int(): """Tests whether function raises ValueError when nthreads is negative""" with pytest.raises(ValueError): - DWI(PATH_DWI, nthreads=-5) + DWI(DATA["nifti"], nthreads=-5) def test_dwi_paths_valid(capsys): """Tests whether function responds normally when all paths are valid""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) captured = capsys.readouterr() print(captured.out) assert dwi is not None @@ -84,7 +80,7 @@ def test_dwi_paths_valid(capsys): def test_dwi_get_bvals(): """Tests whether function returns correct bvals""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) bvals = dwi.getBvals() assert bvals.dtype == np.float64 assert len(bvals) == 337 @@ -96,7 +92,7 @@ def test_dwi_get_bvals(): def test_dwi_get_bvecs(): """Tests whether function returns correct bvecs""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) bvecs = dwi.getBvecs() assert bvecs.dtype == np.float64 assert bvecs.shape == (337, 3) @@ -104,35 +100,35 @@ def test_dwi_get_bvecs(): def test_dwi_max_bval(): """Tests whether function returns correct max bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) dwi.maxBval() == float assert dwi.maxBval() == 8 def test_dwi_max_dti_bval(): """Tests whether function returns correct max DTI bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) dwi.maxDTIBval() == float assert dwi.maxDTIBval() == 1 def test_dwi_max_dki_bval(): """Tests whether function returns correct max DKI bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) dwi.maxDKIBval() == float assert dwi.maxDKIBval() == 2 def test_max_fbi_bval(): """Tests whether function returns correct max FBI bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) dwi.maxFBIBval() == float assert dwi.maxFBIBval() == 8 def test_dwi_idx_b0(): """Tests whether function returns correct index of b0""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) idx = dwi.idxb0() assert idx.dtype == bool assert len(idx) == 337 @@ -141,7 +137,7 @@ def test_dwi_idx_b0(): def test_dwi_idx_dti(): """Tests whether function returns correct index of DTI b-values""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) idx = dwi.idxdti() assert idx.dtype == bool assert len(idx) == 337 @@ -150,7 +146,7 @@ def test_dwi_idx_dti(): def test_dwi_idx_dki(): """Tests whether function returns correct index of DKI b-values""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) idx = dwi.idxdki() assert idx.dtype == bool assert len(idx) == 337 @@ -159,7 +155,7 @@ def test_dwi_idx_dki(): def test_idx_fbi(): """Tests whether function returns correct index of FBI b-values""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) idx = dwi.idxfbi() assert idx.dtype == bool assert len(idx) == 337 @@ -168,13 +164,13 @@ def test_idx_fbi(): def test_dwi_n_dirs(): """Tests whether function returns correct number of directions""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) assert dwi.getndirs() == 30 def test_dwi_tensor_type(): """Tests whether function returns correct tensor type""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) tensor = dwi.tensorType() assert isinstance(tensor, list) assert "dti" in tensor @@ -185,38 +181,38 @@ def test_dwi_tensor_type(): def test_dwi_is_dti(): """Tests whether function returns correct boolean for DTI dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) assert dwi.isdti() is True def test_dwi_is_dki(): """Tests whether function returns correct boolean for DKI dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) assert dwi.isdki() is True def test_dwi_is_fbi(): """Tests whether function returns correct boolean for FBI dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) assert dwi.isfbi() is True def test_dwi_is_fbwm(): """Tests whether function returns correct boolean for FBWM dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) assert dwi.isfbwm() is True def test_dwi_tensor_order_invalid_order(): """Tests whether function returns correct tensor order""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) with pytest.raises(ValueError): cnt, ind = dwi.createTensorOrder(5) def test_dwi_tensor_order_valid_order(): """Tests whether function returns correct tensor order""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) cnt, ind = dwi.createTensorOrder(2) assert len(cnt) == 6 assert np.shape(ind) == (6, 2) @@ -224,7 +220,7 @@ def test_dwi_tensor_order_valid_order(): def test_dwi_tensor_order_auto_detect(): """Tests whether function returns correct tensor order""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) cnt, ind = dwi.createTensorOrder() assert len(cnt) == 15 assert np.shape(ind) == (15, 4) @@ -232,14 +228,14 @@ def test_dwi_tensor_order_auto_detect(): def test_fibonacci_sphere_invalid_samnples(): """Tests whether function returns correct response from invalid samples type""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) with pytest.raises(TypeError): dwi.fibonacciSphere(samples=5.2) def test_fibonacci_sphere(): """Tests whether function returns correct response""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=PATH_MASK) + dwi = DWI(DATA["nifti"], bvecPath=DATA["bvec"], bvalPath=DATA["bval"], mask=DATA["mask"]) sphere = dwi.fibonacciSphere(samples=5) assert sphere.dtype == np.float64 assert np.shape(sphere) == (5, 3) diff --git a/tests/test_preprocessing_mrinfoutil.py b/tests/test_preprocessing_mrinfoutil.py index b0739bb..c81420c 100644 --- a/tests/test_preprocessing_mrinfoutil.py +++ b/tests/test_preprocessing_mrinfoutil.py @@ -1,164 +1,165 @@ -import os from pathlib import Path import pytest +from conftest import load_data from pydesigner.preprocessing import mrinfoutil TEST_DIR = Path(__file__).parent -PATH_DWI = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.nii") -PATH_BVEC = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.bvec") -PATH_BVAL = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.bval") -PATH_JSON = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.json") -PATH_MIF = os.path.join(TEST_DIR, "data", "hifi_splenium_mrgrid.mif") +DATA = load_data(type="hifi") +PATH_DWI = DATA["nifti"] +PATH_BVEC = DATA["bvec"] +PATH_BVAL = DATA["bval"] +PATH_JSON = DATA["json"] +PATH_MIF = DATA["mif"] -def test_getconsole_error_exists(): - """Tests whether function raises OSError when input is not found""" - with pytest.raises(OSError): - mrinfoutil.getconsole("nonexistentfile", "--size") +# def test_getconsole_error_exists(): +# """Tests whether function raises OSError when input is not found""" +# with pytest.raises(OSError): +# mrinfoutil.getconsole("nonexistentfile", "--size") -def test_getconsole_error_flag_non_string(): - """Tests whether function raises TypeError when flag is not a string""" - with pytest.raises(TypeError): - mrinfoutil.getconsole(PATH_DWI, 420) +# def test_getconsole_error_flag_non_string(): +# """Tests whether function raises TypeError when flag is not a string""" +# with pytest.raises(TypeError): +# mrinfoutil.getconsole(PATH_DWI, 420) -def test_getconsole_invalid_flag(): - """Tests whether function raises ValueError when flag is not valid""" - with pytest.raises(OSError): - mrinfoutil.getconsole(PATH_DWI, "--foo") +# def test_getconsole_invalid_flag(): +# """Tests whether function raises ValueError when flag is not valid""" +# with pytest.raises(OSError): +# mrinfoutil.getconsole(PATH_DWI, "--foo") -def test_getconsole_valid_flag(): - """Test normal function of getconsole""" - assert mrinfoutil.getconsole(PATH_DWI, "--format") == "NIfTI-1.1" +# def test_getconsole_valid_flag(): +# """Test normal function of getconsole""" +# assert mrinfoutil.getconsole(PATH_DWI, "--format") == "NIfTI-1.1" -def test_console_dtype(): - """Test whether function returns string type""" - assert isinstance(mrinfoutil.getconsole(PATH_DWI, "--format"), str) +# def test_console_dtype(): +# """Test whether function returns string type""" +# assert isinstance(mrinfoutil.getconsole(PATH_DWI, "--format"), str) -def test_format(): - """Test whether function returns correct format""" - assert mrinfoutil.format(PATH_DWI) == "NIfTI-1.1" +# def test_format(): +# """Test whether function returns correct format""" +# assert mrinfoutil.format(PATH_DWI) == "NIfTI-1.1" -def test_format_dtype(): - """Test whether function returns string type""" - assert isinstance(mrinfoutil.format(PATH_DWI), str) +# def test_format_dtype(): +# """Test whether function returns string type""" +# assert isinstance(mrinfoutil.format(PATH_DWI), str) -def test_ndim(): - """Test whether function returns correct number of dimensions""" - assert mrinfoutil.ndim(PATH_DWI) == 4 +# def test_ndim(): +# """Test whether function returns correct number of dimensions""" +# assert mrinfoutil.ndim(PATH_DWI) == 4 -def test_ndim_dtype(): - """Test whether function returns int type""" - assert isinstance(mrinfoutil.ndim(PATH_DWI), int) +# def test_ndim_dtype(): +# """Test whether function returns int type""" +# assert isinstance(mrinfoutil.ndim(PATH_DWI), int) -def test_size(): - """Test whether function returns correct size""" - assert mrinfoutil.size(PATH_DWI) == (2, 2, 2, 337) +# def test_size(): +# """Test whether function returns correct size""" +# assert mrinfoutil.size(PATH_DWI) == (2, 2, 2, 337) -def test_size_dtype(): - """Test whether function returns tuple type""" - assert isinstance(mrinfoutil.size(PATH_DWI), tuple) +# def test_size_dtype(): +# """Test whether function returns tuple type""" +# assert isinstance(mrinfoutil.size(PATH_DWI), tuple) -def test_spacing(): - """Test whether function returns correct spacing""" - assert any(t in (3.0, 3.0, 3.0) for t in mrinfoutil.spacing(PATH_DWI)) is True +# def test_spacing(): +# """Test whether function returns correct spacing""" +# assert any(t in (3.0, 3.0, 3.0) for t in mrinfoutil.spacing(PATH_DWI)) is True -def test_spacing_dtype(): - """Test whether function returns tuple type""" - assert isinstance(mrinfoutil.spacing(PATH_DWI), tuple) +# def test_spacing_dtype(): +# """Test whether function returns tuple type""" +# assert isinstance(mrinfoutil.spacing(PATH_DWI), tuple) -def test_datatype(): - """Test whether function returns correct datatype""" - assert mrinfoutil.datatype(PATH_DWI) == "Float32LE" +# def test_datatype(): +# """Test whether function returns correct datatype""" +# assert mrinfoutil.datatype(PATH_DWI) == "Float32LE" -def test_datatype_dtype(): - """Test whether function returns string type""" - assert isinstance(mrinfoutil.datatype(PATH_DWI), str) +# def test_datatype_dtype(): +# """Test whether function returns string type""" +# assert isinstance(mrinfoutil.datatype(PATH_DWI), str) -def test_strides(): - """Test whether function returns correct strides""" - assert mrinfoutil.strides(PATH_DWI) == (1, 2, 3, 4) +# def test_strides(): +# """Test whether function returns correct strides""" +# assert mrinfoutil.strides(PATH_DWI) == (1, 2, 3, 4) -def test_strides_dtype(): - """Test whether function returns tuple type""" - assert isinstance(mrinfoutil.strides(PATH_DWI), tuple) +# def test_strides_dtype(): +# """Test whether function returns tuple type""" +# assert isinstance(mrinfoutil.strides(PATH_DWI), tuple) -def test_offset(): - """Test whether function returns correct offset""" - assert mrinfoutil.offset(PATH_DWI) == 0 +# def test_offset(): +# """Test whether function returns correct offset""" +# assert mrinfoutil.offset(PATH_DWI) == 0 -def test_offset_dtype(): - """Test whether function returns int type""" - assert isinstance(mrinfoutil.offset(PATH_DWI), float) +# def test_offset_dtype(): +# """Test whether function returns int type""" +# assert isinstance(mrinfoutil.offset(PATH_DWI), float) -def test_multiplier(): - """Test whether function returns correct multiplier""" - assert mrinfoutil.multiplier(PATH_DWI) == 1.0 +# def test_multiplier(): +# """Test whether function returns correct multiplier""" +# assert mrinfoutil.multiplier(PATH_DWI) == 1.0 -def test_multiplier_dtype(): - """Test whether function returns float type""" - assert isinstance(mrinfoutil.multiplier(PATH_DWI), float) +# def test_multiplier_dtype(): +# """Test whether function returns float type""" +# assert isinstance(mrinfoutil.multiplier(PATH_DWI), float) -def test_transform(): - """Test whether function returns correct transform""" - result = ( - ["0.994345310289832", "2.73896740248844", "08", "-0.106195121171422", "-7.16012287139893"], - ["-0.0163522207646128", "0.988073569252652", "-0.153111814252808", "-15.8305568695068"], - ["0.104928588957842", "0.153982537140822", "0.982486319790561", "-10.7536220550537"], - ["0", "0", "0", "1"], - ) - assert mrinfoutil.transform(PATH_DWI) == result +# def test_transform(): +# """Test whether function returns correct transform""" +# result = ( +# ["0.994345310289832", "2.73896740248844", "08", "-0.106195121171422", "-7.16012287139893"], +# ["-0.0163522207646128", "0.988073569252652", "-0.153111814252808", "-15.8305568695068"], +# ["0.104928588957842", "0.153982537140822", "0.982486319790561", "-10.7536220550537"], +# ["0", "0", "0", "1"], +# ) +# assert mrinfoutil.transform(PATH_DWI) == result -def test_transform_dtype(): - """Test whether function returns tuple type""" - assert isinstance(mrinfoutil.transform(PATH_DWI), tuple) +# def test_transform_dtype(): +# """Test whether function returns tuple type""" +# assert isinstance(mrinfoutil.transform(PATH_DWI), tuple) -def test_commandhistory_invalid(): - """Test whether function raises OSError when input is invalid""" - with pytest.raises(OSError): - mrinfoutil.commandhistory(PATH_DWI) +# def test_commandhistory_invalid(): +# """Test whether function raises OSError when input is invalid""" +# with pytest.raises(OSError): +# mrinfoutil.commandhistory(PATH_DWI) -def test_commandhistory_valid(): - """Test normal function of commandhistory""" - result = [ - "variable", - "mrcat -axis 3 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi0.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi1.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi2.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif", - "dwidenoise -noise /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/noisemap.nii -extent 5,5,5 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/1_dwi_denoised.mif", - "mrdegibbs /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/2_dwi_degibbs.mif", - "/usr/local/mrtrix3/bin/dwifslpreproc -se_epi /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/B0_EPI.mif -eddy_options --repol --data_is_shelled -rpe_header -eddyqc_all /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/metrics_qc/eddy /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/3_dwi_undistorted.mif", - "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/4_dwi_smoothed.mif", - "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif", - "mrconvert -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.json /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif", - "mrgrid /Users/siddhiman/Datasets/IAM_HiFI/out/pydesigner/working.mif regrid -size 1,1,1 /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_mrgrid.mif", - ] - assert mrinfoutil.commandhistory(PATH_MIF) == result +# def test_commandhistory_valid(): +# """Test normal function of commandhistory""" +# result = [ +# "variable", +# "mrcat -axis 3 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi0.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi1.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi2.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif", +# "dwidenoise -noise /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/noisemap.nii -extent 5,5,5 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/1_dwi_denoised.mif", +# "mrdegibbs /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/2_dwi_degibbs.mif", +# "/usr/local/mrtrix3/bin/dwifslpreproc -se_epi /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/B0_EPI.mif -eddy_options --repol --data_is_shelled -rpe_header -eddyqc_all /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/metrics_qc/eddy /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/3_dwi_undistorted.mif", +# "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/4_dwi_smoothed.mif", +# "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif", +# "mrconvert -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.json /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif", +# "mrgrid /Users/siddhiman/Datasets/IAM_HiFI/out/pydesigner/working.mif regrid -size 1,1,1 /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_mrgrid.mif", +# ] +# assert mrinfoutil.commandhistory(PATH_MIF) == result -def test_commandhistory_dtype(): - """Test whether function returns list type""" - assert isinstance(mrinfoutil.commandhistory(PATH_MIF), list) +# def test_commandhistory_dtype(): +# """Test whether function returns list type""" +# assert isinstance(mrinfoutil.commandhistory(PATH_MIF), list) diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index 2a1d90c..9cbe699 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -1,9 +1,17 @@ -import os -from pathlib import Path - -TEST_DIR = Path(__file__).parent -PATH_DWI = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.nii") -PATH_BVEC = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.bvec") -PATH_BVAL = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.bval") -PATH_JSON = os.path.join(TEST_DIR, "data", "hifi_splenium_4vox.json") -PATH_MIF = os.path.join(TEST_DIR, "data", "hifi_splenium_mrgrid.mif") +import pytest +from conftest import load_data + +from pydesigner.preprocessing import mrpreproc + +DATA = load_data(type="hifi") +PATH_DWI = DATA["nifti"] +PATH_BVEC = DATA["bvec"] +PATH_BVAL = DATA["bval"] +PATH_JSON = DATA["json"] +PATH_MIF = DATA["mif"] + + +def test_miftonii_error_path(): + """Test whether function `miftonii` raises error on invalid path""" + with pytest.raises(IOError): + mrpreproc.miftonii("nonexistentfile", "output.nii") From b20dd3cd6b7f315a10ee9a8917e03a26a5f05a68 Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Sat, 4 May 2024 05:11:00 +0000 Subject: [PATCH 17/78] Pre-commit autofix --- tests/conftest.py | 6 +++--- tests/test_preprocessing_mrinfoutil.py | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 6b6ca71..c282f83 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,13 +1,13 @@ import os -import pytest from pathlib import Path TEST_DIR = Path(__file__).parent DATA_DIR = os.path.join(TEST_DIR, "data") -def load_data(type:str="hifi") -> dict: + +def load_data(type: str = "hifi") -> dict: """Loads sample dataset paths. - + Args: type (str): Type of data to load. Defaults to "hifi". diff --git a/tests/test_preprocessing_mrinfoutil.py b/tests/test_preprocessing_mrinfoutil.py index c81420c..57f5b82 100644 --- a/tests/test_preprocessing_mrinfoutil.py +++ b/tests/test_preprocessing_mrinfoutil.py @@ -1,10 +1,7 @@ from pathlib import Path -import pytest from conftest import load_data -from pydesigner.preprocessing import mrinfoutil - TEST_DIR = Path(__file__).parent DATA = load_data(type="hifi") PATH_DWI = DATA["nifti"] From 94b3ab9cb741b506828e536e96092ae8bfe1f48e Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 4 May 2024 02:11:03 -0400 Subject: [PATCH 18/78] Add missing requirements --- .github/workflows/pydesigner_ci.yml | 4 +- poetry.lock | 119 +++++++++++++++++++++++++++- pyproject.toml | 3 +- requirements.txt | 4 + 4 files changed, 126 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index ea8e536..e42dba6 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -3,7 +3,9 @@ name: CI on: pull_request: push: - branches: [main] + branches: master + tags: + - "**" jobs: diff --git a/poetry.lock b/poetry.lock index dd94105..a7d666d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.0 and should not be changed by hand. [[package]] name = "annotated-types" @@ -813,6 +813,78 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] +[[package]] +name = "pandas" +version = "2.2.2" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, + {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, + {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, + {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, + {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, + {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, + {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, + {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, + {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, + {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, + {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, + {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, + {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, + {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, + {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, + {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, + {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, + {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + [[package]] name = "pillow" version = "10.2.0" @@ -1085,6 +1157,17 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + [[package]] name = "qdldl" version = "0.1.7.post0" @@ -1192,6 +1275,27 @@ files = [ numpy = "*" scipy = "*" +[[package]] +name = "seaborn" +version = "0.13.2" +description = "Statistical data visualization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, + {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, +] + +[package.dependencies] +matplotlib = ">=3.4,<3.6.1 || >3.6.1" +numpy = ">=1.20,<1.24.0 || >1.24.0" +pandas = ">=1.2" + +[package.extras] +dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] +docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] + [[package]] name = "setuptools" version = "69.0.3" @@ -1293,7 +1397,18 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + [metadata] lock-version = "2.0" python-versions = ">=3.11, <4.0" -content-hash = "67698073d558d92ca6c1afd3258393bc50521bf9f5bfd85f2a637a34cd3f6077" +content-hash = "6e6d33c397000e34b37775ad236458b5736f594f3b35a6c4f6eda25c289aef22" diff --git a/pyproject.toml b/pyproject.toml index 2ad2a9d..6b86ff2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,8 +35,9 @@ tqdm = ">=4.65.0, <5.0.0" multiprocess = ">=0.70.00, <0.80.00" nibabel = ">=5.0.0, <6.0.0" dipy = ">=1.7.0, <2.0.0" -cvxpy = ">1.3.0, <2.0.0" +cvxpy = ">=1.3.0, <2.0.0" matplotlib = ">=3.7.0, <4.0.0" +seaborn = ">=0.13.0, <0.14.0" pydantic = "^2.7.0" [tool.poetry.scripts] diff --git a/requirements.txt b/requirements.txt index f26dc53..5ab3d09 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,18 +20,22 @@ numpy==1.26.3 ; python_version >= "3.11" and python_version < "4.0" ordered-set==4.1.0 ; python_version >= "3.11" and python_version < "4.0" osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" +pandas==2.2.2 ; python_version >= "3.11" and python_version < "4.0" pillow==10.2.0 ; python_version >= "3.11" and python_version < "4.0" pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" pydantic-core==2.18.1 ; python_version >= "3.11" and python_version < "4.0" pydantic==2.7.0 ; python_version >= "3.11" and python_version < "4.0" pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" +pytz==2024.1 ; python_version >= "3.11" and python_version < "4.0" qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" scipy==1.11.4 ; python_version >= "3.11" and python_version < "4.0" scs==3.2.4.post1 ; python_version >= "3.11" and python_version < "4.0" +seaborn==0.13.2 ; python_version >= "3.11" and python_version < "4.0" setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" setuptools==69.0.3 ; python_version >= "3.11" and python_version < "4.0" six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" trx-python==0.2.9 ; python_version >= "3.11" and python_version < "4.0" typing-extensions==4.9.0 ; python_version >= "3.11" and python_version < "4.0" +tzdata==2024.1 ; python_version >= "3.11" and python_version < "4.0" From 6ecdb4b413f31fb3849bb6f36bd3631b5e01edd3 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 4 May 2024 22:16:25 -0400 Subject: [PATCH 19/78] Fix outdated ref to seaborn plot style --- pydesigner/plotting/motionplot.py | 4 ++-- pydesigner/plotting/outlierplot.py | 2 +- pydesigner/plotting/snrplot.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pydesigner/plotting/motionplot.py b/pydesigner/plotting/motionplot.py index 49de075..405ed9c 100644 --- a/pydesigner/plotting/motionplot.py +++ b/pydesigner/plotting/motionplot.py @@ -24,7 +24,7 @@ def plot(input: str, output: str, voxel: Union[Tuple[float], None] = None) -> No See Also -------- - outlierplot : plots outliers from IRLLS + outlierplot : plots outliers from IRLLSp snrplot : plots DWI's SNR """ print("Plotting motion...") @@ -63,7 +63,7 @@ def plot(input: str, output: str, voxel: Union[Tuple[float], None] = None) -> No relbef = dat[:, 1] x = np.arange(start=1, stop=nvols + 1, step=1) # Plot - plt.style.use("seaborn") + plt.style.use("seaborn-v0_8") fig, ax = plt.subplots() ax.plot(x, relone, linewidth=1, label="Relative to first volume") ax.plot(x, relbef, linewidth=1, label="Relative to previous volume") diff --git a/pydesigner/plotting/outlierplot.py b/pydesigner/plotting/outlierplot.py index 9428964..21fa5e6 100644 --- a/pydesigner/plotting/outlierplot.py +++ b/pydesigner/plotting/outlierplot.py @@ -82,7 +82,7 @@ def plot( # Normalize to percentage of voxels y = (y / np.count_nonzero(bw)) * 100 # Plot - plt.style.use("seaborn") + plt.style.use("seaborn-v0_8") fig, ax = plt.subplots() plt.plot(x, y, "-", lw=1, color="black", alpha=0.40) scat = plt.scatter(x, y, c=bvals, s=10, linewidths=0, alpha=1, cmap="Set1") diff --git a/pydesigner/plotting/snrplot.py b/pydesigner/plotting/snrplot.py index 4b0d697..f22e2c5 100644 --- a/pydesigner/plotting/snrplot.py +++ b/pydesigner/plotting/snrplot.py @@ -246,7 +246,7 @@ def makeplot(self, path: str, smooth: bool = True, smoothfactor: int = 5) -> Non count_interp[:, y, z] = spl(binval_interp) count = count_interp binval = binval_interp - plt.style.use("seaborn") + plt.style.use("seaborn-v0_8") nplots = unibvals.size titles = ["B" + str(i * 1000) for i in unibvals] fig = plt.figure(figsize=(8, 10)) From d7dc6048d3da8c1264c3df7c81291b0152a3341c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 1 Jun 2024 21:54:43 -0400 Subject: [PATCH 20/78] Save progress --- .github/workflows/neurodock.yml | 47 +++++++++++ .pre-commit-config.yaml | 5 +- Dockerfile_pytest | 7 ++ poetry.lock | 119 +-------------------------- pydesigner/system/models.py | 57 +++++++++++++ pydesigner/tractography/dsistudio.py | 9 ++ pyproject.toml | 1 - 7 files changed, 125 insertions(+), 120 deletions(-) create mode 100644 .github/workflows/neurodock.yml create mode 100644 Dockerfile_pytest create mode 100644 pydesigner/system/models.py diff --git a/.github/workflows/neurodock.yml b/.github/workflows/neurodock.yml new file mode 100644 index 0000000..d1588d3 --- /dev/null +++ b/.github/workflows/neurodock.yml @@ -0,0 +1,47 @@ +name: Docker Build and Publish + +on: + push: + branches: + - master + tags: + - "**" + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_BRIDGE_PAT }} + + - name: Fetch version + id: version + uses: SebRollen/toml-action@v1.0.2 + with: + file: 'pyproject.toml' + field: 'tool.poetry.version' + + - name: Setup QEMU + id: qemu + uses: docker/setup-qemu-action@v3 + + - name: Setup Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + id: login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push + id: docker_build_push + uses: docker/build-push-action@v5 + with: + push: true + tags: dmri/neurodock:latest,dmri/neurodock:${{ steps.version.outputs.value }} diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 38672f1..a0cdb2f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,14 +27,15 @@ repos: rev: 'v0.1.0' hooks: - id: ruff - args: [--fix, --exit-non-zero-on-fix] + args: [--config, pyproject.toml, --fix, --exit-non-zero-on-fix] + - id: ruff_format - repo: https://github.com/python-poetry/poetry rev: '1.6.0' hooks: - - id: poetry-check - id: poetry-lock args: ["--no-update"] + - id: poetry-check - id: poetry-export args: ["--without-hashes", "-f", "requirements.txt", "-o", "requirements.txt"] - id: poetry-export diff --git a/Dockerfile_pytest b/Dockerfile_pytest new file mode 100644 index 0000000..ab89a68 --- /dev/null +++ b/Dockerfile_pytest @@ -0,0 +1,7 @@ +FROM dmri/ci-cd:latest as builder + +WORKDIR /scr +COPY . . + +RUN poetry install +ENTRYPOINT ["poetry run pytest"] \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index a7d666d..21850cc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "annotated-types" @@ -813,78 +813,6 @@ files = [ {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, ] -[[package]] -name = "pandas" -version = "2.2.2" -description = "Powerful data structures for data analysis, time series, and statistics" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pandas-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce"}, - {file = "pandas-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08"}, - {file = "pandas-2.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51"}, - {file = "pandas-2.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99"}, - {file = "pandas-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288"}, - {file = "pandas-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b"}, - {file = "pandas-2.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db"}, - {file = "pandas-2.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1"}, - {file = "pandas-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef"}, - {file = "pandas-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad"}, - {file = "pandas-2.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76"}, - {file = "pandas-2.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32"}, - {file = "pandas-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2"}, - {file = "pandas-2.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863"}, - {file = "pandas-2.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a"}, - {file = "pandas-2.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57"}, - {file = "pandas-2.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4"}, - {file = "pandas-2.2.2.tar.gz", hash = "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54"}, -] - -[package.dependencies] -numpy = [ - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, -] -python-dateutil = ">=2.8.2" -pytz = ">=2020.1" -tzdata = ">=2022.7" - -[package.extras] -all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] -aws = ["s3fs (>=2022.11.0)"] -clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] -compression = ["zstandard (>=0.19.0)"] -computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] -consortium-standard = ["dataframe-api-compat (>=0.1.7)"] -excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] -feather = ["pyarrow (>=10.0.1)"] -fss = ["fsspec (>=2022.11.0)"] -gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] -hdf5 = ["tables (>=3.8.0)"] -html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] -mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] -output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] -parquet = ["pyarrow (>=10.0.1)"] -performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] -plot = ["matplotlib (>=3.6.3)"] -postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] -pyarrow = ["pyarrow (>=10.0.1)"] -spss = ["pyreadstat (>=1.2.0)"] -sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] -test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] -xml = ["lxml (>=4.9.2)"] - [[package]] name = "pillow" version = "10.2.0" @@ -1157,17 +1085,6 @@ files = [ [package.dependencies] six = ">=1.5" -[[package]] -name = "pytz" -version = "2024.1" -description = "World timezone definitions, modern and historical" -optional = false -python-versions = "*" -files = [ - {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, - {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, -] - [[package]] name = "qdldl" version = "0.1.7.post0" @@ -1275,27 +1192,6 @@ files = [ numpy = "*" scipy = "*" -[[package]] -name = "seaborn" -version = "0.13.2" -description = "Statistical data visualization" -optional = false -python-versions = ">=3.8" -files = [ - {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, - {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, -] - -[package.dependencies] -matplotlib = ">=3.4,<3.6.1 || >3.6.1" -numpy = ">=1.20,<1.24.0 || >1.24.0" -pandas = ">=1.2" - -[package.extras] -dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] -docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] -stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] - [[package]] name = "setuptools" version = "69.0.3" @@ -1397,18 +1293,7 @@ files = [ {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, ] -[[package]] -name = "tzdata" -version = "2024.1" -description = "Provider of IANA time zone data" -optional = false -python-versions = ">=2" -files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, -] - [metadata] lock-version = "2.0" python-versions = ">=3.11, <4.0" -content-hash = "6e6d33c397000e34b37775ad236458b5736f594f3b35a6c4f6eda25c289aef22" +content-hash = "65b1f12bd74be06572d70ecb547d982224f19ee4693d6ff873dd31a1e9bee4ce" diff --git a/pydesigner/system/models.py b/pydesigner/system/models.py new file mode 100644 index 0000000..d0d9285 --- /dev/null +++ b/pydesigner/system/models.py @@ -0,0 +1,57 @@ +import os.path as op +from typing import Optional +from pydantic import BaseModel, ValidationInfo, field_validator + +class modelmrtrix(BaseModel): + """Define model validation for MRtrix3 CLI""" + file_input: str = None + file_output: Optional[str] = None + nthreads: Optional[bool] = None + force: Optional[bool] = True + verbose: Optional[bool] = False + + @field_validator('file_input') + @classmethod + def file_input_valid(cls, var: str, info: ValidationInfo): + """Validate that input file is correct type and exists.""" + if not isinstance(var, str): + raise TypeError( + f"Input file path {info.field_name}: {var} is not a string " + f"type. Type entered is {type(var)}." + ) + if not op.exists(var): + raise FileNotFoundError( + f"Input file {info.field_name}: {var} does not exist." + ) + + + @field_validator('file_output') + @classmethod + def file_output_valid(cls, var: str, info: ValidationInfo): + """Validate output filename and parent folder.""" + if not isinstance(var, str): + raise TypeError( + f"Output file path {info.field_name}: {var} is not a string " + f"type. Type entered is {type(var)}." + ) + if not op.exists(op.dirname(var)): + raise FileNotFoundError( + f"Parent directory {op.dirname(var)} for input file {var} does " + "not exists. Please ensure that the parent folder exists." + ) + + @field_validator("nthreads") + @classmethod + def correct_nthreads(cls, var: int, info: ValidationInfo) -> int: + """Check that nthreads is a postive integer.""" + if not isinstance(var, int): + raise TypeError( + f"{info.field_name} is not provided as a {type(var)}. Please " + "provide a positive integer." + ) + if var <= 0: + raise ValueError( + f"{info.field_name} needs to be a valid integer." + ) + + diff --git a/pydesigner/tractography/dsistudio.py b/pydesigner/tractography/dsistudio.py index 0994059..be6a300 100644 --- a/pydesigner/tractography/dsistudio.py +++ b/pydesigner/tractography/dsistudio.py @@ -313,3 +313,12 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= os.remove(map_) os.remove(dirs_txt) os.remove(odf_amplitudes_nii) + +path_sh = "/mnt/d/Datasets/PyDesigner_Test/test_run/metrics/dki_odf.nii" +path_mask = "/mnt/d/Datasets/PyDesigner_Test/test_run/brain_mask.nii" +path_out = "/mnt/d/Datasets/PyDesigner_Test/dki_odf/dki.fib" +makefib( + input=path_sh, + output=path_out, + mask=path_mask, +) diff --git a/pyproject.toml b/pyproject.toml index 6b86ff2..f231016 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,6 @@ nibabel = ">=5.0.0, <6.0.0" dipy = ">=1.7.0, <2.0.0" cvxpy = ">=1.3.0, <2.0.0" matplotlib = ">=3.7.0, <4.0.0" -seaborn = ">=0.13.0, <0.14.0" pydantic = "^2.7.0" [tool.poetry.scripts] From 6a90a54dc2164458d7c8be4a97e8e0c205a2fa69 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 1 Jun 2024 21:55:50 -0400 Subject: [PATCH 21/78] Update pre-commit hooks --- .pre-commit-config.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a0cdb2f..4278ca7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,13 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: 'v4.5.0' + rev: 'v4.6.0' hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema - rev: '0.27.0' + rev: '0.28.4' hooks: - id: check-readthedocs @@ -18,10 +18,10 @@ repos: args: ['--html-dir', 'docs/html', '--source-dir', 'docs/source'] language_version: python3 -- repo: https://github.com/psf/black - rev: '23.9.1' - hooks: - - id: black +# - repo: https://github.com/psf/black +# rev: '24.4.2' +# hooks: +# - id: black - repo: https://github.com/astral-sh/ruff-pre-commit rev: 'v0.1.0' @@ -31,7 +31,7 @@ repos: - id: ruff_format - repo: https://github.com/python-poetry/poetry - rev: '1.6.0' + rev: '1.8.0' hooks: - id: poetry-lock args: ["--no-update"] From 1ff58a104fa9ed7ab153901b4e5bbef68244182f Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 18:06:50 -0400 Subject: [PATCH 22/78] Update requirements --- .pre-commit-config.yaml | 6 +-- poetry.lock | 104 +++++++++++++++++++++++++++++++++++++++- pyproject.toml | 8 +--- requirements-dev.txt | 2 + requirements.txt | 4 -- 5 files changed, 110 insertions(+), 14 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4278ca7..20a747f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema - rev: '0.28.4' + rev: '0.29.2' hooks: - id: check-readthedocs @@ -24,11 +24,11 @@ repos: # - id: black - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.1.0' + rev: 'v0.6.4' hooks: - id: ruff args: [--config, pyproject.toml, --fix, --exit-non-zero-on-fix] - - id: ruff_format + - id: ruff-format - repo: https://github.com/python-poetry/poetry rev: '1.8.0' diff --git a/poetry.lock b/poetry.lock index 21850cc..f1b31f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -106,6 +106,90 @@ mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pill test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +[[package]] +name = "coverage" +version = "7.6.1" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, +] + +[package.extras] +toml = ["tomli"] + [[package]] name = "cvxpy" version = "1.4.1" @@ -1071,6 +1155,24 @@ pluggy = ">=0.12,<2.0" [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-cov" +version = "5.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -1296,4 +1398,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <4.0" -content-hash = "65b1f12bd74be06572d70ecb547d982224f19ee4693d6ff873dd31a1e9bee4ce" +content-hash = "6bc8f848a266b1ee5a770d3119200c98149e9cd17e8560490a665581ec0565b9" diff --git a/pyproject.toml b/pyproject.toml index f231016..b71cf57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,16 +44,12 @@ pydesigner = "pydesigner.main:main" [tool.poetry.group.dev.dependencies] pytest = ">=7.4.0, <8.0.0" +pytest-cov = "^5.0.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" -[tool.black] -line-length = 120 -target-version = ["py311", "py312"] -exclude = "docs/" - [tool.ruff] # Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or @@ -89,10 +85,10 @@ exclude = [ "node_modules", "venv", "docs", + "tests", "setup.py", ] -# Same as Black line-length = 120 # Allow unused variables when underscore-prefixed. diff --git a/requirements-dev.txt b/requirements-dev.txt index 523f7fc..836328f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,7 @@ colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" +coverage[toml]==7.6.1 ; python_version >= "3.11" and python_version < "4.0" iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" +pytest-cov==5.0.0 ; python_version >= "3.11" and python_version < "4.0" pytest==7.4.4 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 5ab3d09..f26dc53 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,22 +20,18 @@ numpy==1.26.3 ; python_version >= "3.11" and python_version < "4.0" ordered-set==4.1.0 ; python_version >= "3.11" and python_version < "4.0" osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" -pandas==2.2.2 ; python_version >= "3.11" and python_version < "4.0" pillow==10.2.0 ; python_version >= "3.11" and python_version < "4.0" pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" pydantic-core==2.18.1 ; python_version >= "3.11" and python_version < "4.0" pydantic==2.7.0 ; python_version >= "3.11" and python_version < "4.0" pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" -pytz==2024.1 ; python_version >= "3.11" and python_version < "4.0" qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" scipy==1.11.4 ; python_version >= "3.11" and python_version < "4.0" scs==3.2.4.post1 ; python_version >= "3.11" and python_version < "4.0" -seaborn==0.13.2 ; python_version >= "3.11" and python_version < "4.0" setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" setuptools==69.0.3 ; python_version >= "3.11" and python_version < "4.0" six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" trx-python==0.2.9 ; python_version >= "3.11" and python_version < "4.0" typing-extensions==4.9.0 ; python_version >= "3.11" and python_version < "4.0" -tzdata==2024.1 ; python_version >= "3.11" and python_version < "4.0" From ee8c8debf6f50b88b4247d89b31c569d871a2e3b Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 20:42:31 -0400 Subject: [PATCH 23/78] Add Docker integrated unit tests --- .github/workflows/pydesigner_ci.yml | 39 +++++++++++++++++++++++++++++ Dockerfile_pytest | 7 ------ tests/Dockerfile | 15 +++++++++++ tests/entrypoint.sh | 9 +++++++ 4 files changed, 63 insertions(+), 7 deletions(-) delete mode 100644 Dockerfile_pytest create mode 100644 tests/Dockerfile create mode 100644 tests/entrypoint.sh diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index e42dba6..e8b55ce 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -41,3 +41,42 @@ jobs: - name: Return pre-commit response if: steps.pre-commit.outcome == 'failure' run: exit 1 + + pytest: + needs: pre-commit + runs-on: ubuntu-latest + container: + image: dmri/ci-cd:latest + steps: + - name: Checkout code + id: checkout + uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_BRIDGE_PAT }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Build Docker image + run: docker build -t pydesigner-test -f tests/Dockerfile . + + - name: Run tests in Docker container + run: docker run --name pydesigner-test + + - name: Copy test results + run: docker cp pydesigner-test:/tests/ ./test-results + + - name: Upload test results + uses: actions/upload-artifact@v4 + with: + name: test-results + path: ./test-results + + - name: Upload coverage report + uses: actions/upload-artifact@v4 + with: + name: coverage-report + path: ./test-results/coverage.xml + + - name: Clean up + run: docker rm test-container diff --git a/Dockerfile_pytest b/Dockerfile_pytest deleted file mode 100644 index ab89a68..0000000 --- a/Dockerfile_pytest +++ /dev/null @@ -1,7 +0,0 @@ -FROM dmri/ci-cd:latest as builder - -WORKDIR /scr -COPY . . - -RUN poetry install -ENTRYPOINT ["poetry run pytest"] \ No newline at end of file diff --git a/tests/Dockerfile b/tests/Dockerfile new file mode 100644 index 0000000..3866f2f --- /dev/null +++ b/tests/Dockerfile @@ -0,0 +1,15 @@ +FROM dmri/ci-cd-py3.11:e93dd885 +SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] +WORKDIR /src +COPY . /src +ENV TEST_DIR=/tests + +RUN pip install uv && \ + uv venv ${VIRTUAL_ENV} && \ + uv pip install -U pip setuptools wheel +RUN uv pip install -rrequirements.txt -rrequirements-dev.txt +RUN uv pip install --no-deps -e. +RUN mkdir -p ${TEST_DIR} +COPY ./tests/entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh +ENTRYPOINT ["entrypoint.sh"] diff --git a/tests/entrypoint.sh b/tests/entrypoint.sh new file mode 100644 index 0000000..dba6f94 --- /dev/null +++ b/tests/entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# If no arguments are passed, run pytest with coverage +if [ "$#" -eq 0 ]; then + pytest tests -vv --cov=. --cov-report=xml:/tests/coverage.xml --junitxml=/tests/results.xml +else + # Otherwise, run the command passed as arguments + exec "$@" +fi From 271b9e081becef6cd13e391201bd7f107f369012 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 20:42:51 -0400 Subject: [PATCH 24/78] Update Docker file to use UV --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 662658c..5052e42 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ # ============================================================================== # Load base Ubuntu image -FROM dmri/ci-cd AS base +FROM dmri/ci-cd:e93dd885 AS base # Labels LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" @@ -21,13 +21,13 @@ LABEL org.label-schema.vendor="MUSC BRIDGE" FROM base as dependencies WORKDIR /src COPY requirements.txt ./ -RUN pip install --no-cache-dir -r requirements.txt +RUN uv pip install -r requirements.txt FROM dependencies as development COPY requirements-dev.txt ./ -RUN pip install --no-cache-dir -r requirements-dev.txt +RUN uv pip install -rrequirements-dev.txt COPY . . -RUN pip install --no-cache-dir --no-deps --editable . +RUN uv pip install --no-deps -e. FROM dependencies as pyc COPY . . @@ -36,7 +36,7 @@ RUN find . -name "*.py" -not -name "__init__.py" -delete FROM pyc as production COPY --from=pyc /src . -RUN pip install --no-cache-dir --no-deps --editable . +RUN uv pip install --no-deps -e. RUN useradd -ms /bin/bash bridge USER bridge From d48ac5005176c18732d34c0251eb3684aff78c2e Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 20:44:08 -0400 Subject: [PATCH 25/78] Update PyDesigner Dockerfile to use UV --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 5052e42..664b5e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ # Load base Ubuntu image FROM dmri/ci-cd:e93dd885 AS base +SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] # Labels LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" From ce158a4b16b0ba95673d79e2cb13b64e15a49da0 Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Tue, 10 Sep 2024 00:45:15 +0000 Subject: [PATCH 26/78] Pre-commit autofix --- pydesigner/Tensor_Fit_Guide.ipynb | 144 +++++++++---------- pydesigner/fitting/dwipy.py | 32 ++--- pydesigner/main.py | 16 +-- pydesigner/postprocessing/filters.py | 3 +- pydesigner/preprocessing/mrpreproc.py | 3 +- pydesigner/preprocessing/preparation.py | 3 +- pydesigner/preprocessing/util.py | 3 +- pydesigner/system/models.py | 29 ++-- pydesigner/tractography/dsistudio.py | 2 +- pydesigner/tractography/odf.py | 1 + pydesigner/tractography/sphericalsampling.py | 3 +- 11 files changed, 110 insertions(+), 129 deletions(-) diff --git a/pydesigner/Tensor_Fit_Guide.ipynb b/pydesigner/Tensor_Fit_Guide.ipynb index ff04752..163d598 100644 --- a/pydesigner/Tensor_Fit_Guide.ipynb +++ b/pydesigner/Tensor_Fit_Guide.ipynb @@ -24,12 +24,10 @@ "metadata": {}, "outputs": [], "source": [ - "import nibabel as nib\n", - "import numpy as np\n", - "from fitting import dwipy as dp \n", + "import os\n", + "\n", "import matplotlib.pyplot as plt\n", - "import time\n", - "import os" + "from fitting import dwipy as dp" ] }, { @@ -49,8 +47,8 @@ "metadata": {}, "outputs": [], "source": [ - "niiPath = '/Users/sid/Downloads/MUS_C_001/out/preprocessed_dwi.nii'\n", - "savePath = '/Users/sid/Downloads/MUS_C_001/out/expit2'" + "niiPath = \"/Users/sid/Downloads/MUS_C_001/out/preprocessed_dwi.nii\"\n", + "savePath = \"/Users/sid/Downloads/MUS_C_001/out/expit2\"" ] }, { @@ -133,19 +131,19 @@ } ], "source": [ - "fig = plt.figure(figsize=(18, 16), dpi= 80)\n", - "img1 = fig.add_subplot(1,3,1)\n", - "img1.imshow(myimage.img[:,:,30,0]) # Plot first volume, slice 30 (B0)\n", - "img1.title.set_text('B0')\n", - "img1.axis('off')\n", - "img2 = fig.add_subplot(1,3,2)\n", - "img2.imshow(myimage.img[:,:,30,10]) # Plot 10th volume, slice 30 (B1000)\n", - "img2.title.set_text('B1000')\n", - "img2.axis('off')\n", - "img3 = fig.add_subplot(1,3,3)\n", - "img3.imshow(myimage.img[:,:,30,60]) # Plot 70th volume, slice 30 (B2000)\n", - "img3.title.set_text('B2000')\n", - "img3.axis('off')" + "fig = plt.figure(figsize=(18, 16), dpi=80)\n", + "img1 = fig.add_subplot(1, 3, 1)\n", + "img1.imshow(myimage.img[:, :, 30, 0]) # Plot first volume, slice 30 (B0)\n", + "img1.title.set_text(\"B0\")\n", + "img1.axis(\"off\")\n", + "img2 = fig.add_subplot(1, 3, 2)\n", + "img2.imshow(myimage.img[:, :, 30, 10]) # Plot 10th volume, slice 30 (B1000)\n", + "img2.title.set_text(\"B1000\")\n", + "img2.axis(\"off\")\n", + "img3 = fig.add_subplot(1, 3, 3)\n", + "img3.imshow(myimage.img[:, :, 30, 60]) # Plot 70th volume, slice 30 (B2000)\n", + "img3.title.set_text(\"B2000\")\n", + "img3.axis(\"off\")" ] }, { @@ -185,7 +183,7 @@ } ], "source": [ - "outliers, dt_est = myimage.irlls() # Produce 4D outlier map" + "outliers, dt_est = myimage.irlls() # Produce 4D outlier map" ] }, { @@ -225,19 +223,19 @@ } ], "source": [ - "fig = plt.figure(figsize=(18, 16), dpi= 80)\n", - "img1 = fig.add_subplot(1,3,1)\n", - "img1.imshow(outliers[:,:,30,0]) # Plot first volume, slice 30 (B0)\n", - "img1.title.set_text('B0')\n", - "img1.axis('off')\n", - "img2 = fig.add_subplot(1,3,2)\n", - "img2.imshow(outliers[:,:,30,10]) # Plot 10th volume, slice 30 (B1000)\n", - "img2.title.set_text('B1000')\n", - "img2.axis('off')\n", - "img3 = fig.add_subplot(1,3,3)\n", - "img3.imshow(outliers[:,:,30,60]) # Plot 100th volume, slice 30 (B2000)\n", - "img3.title.set_text('B2000')\n", - "img3.axis('off')" + "fig = plt.figure(figsize=(18, 16), dpi=80)\n", + "img1 = fig.add_subplot(1, 3, 1)\n", + "img1.imshow(outliers[:, :, 30, 0]) # Plot first volume, slice 30 (B0)\n", + "img1.title.set_text(\"B0\")\n", + "img1.axis(\"off\")\n", + "img2 = fig.add_subplot(1, 3, 2)\n", + "img2.imshow(outliers[:, :, 30, 10]) # Plot 10th volume, slice 30 (B1000)\n", + "img2.title.set_text(\"B1000\")\n", + "img2.axis(\"off\")\n", + "img3 = fig.add_subplot(1, 3, 3)\n", + "img3.imshow(outliers[:, :, 30, 60]) # Plot 100th volume, slice 30 (B2000)\n", + "img3.title.set_text(\"B2000\")\n", + "img3.axis(\"off\")" ] }, { @@ -273,7 +271,7 @@ } ], "source": [ - "myimage.fit(constraints=[0,1,0])" + "myimage.fit(constraints=[0, 1, 0])" ] }, { @@ -346,22 +344,22 @@ } ], "source": [ - "print('This is a ' + myimage.tensorType().upper() + ' image')\n", + "print(\"This is a \" + myimage.tensorType().upper() + \" image\")\n", "\n", "DT, KT = myimage.tensorReorder(myimage.tensorType())\n", "\n", - "print('Shape of DT tensor is ' + str(DT.shape))\n", - "print('Shape of KT tensor is ' + str(KT.shape))\n", + "print(\"Shape of DT tensor is \" + str(DT.shape))\n", + "print(\"Shape of KT tensor is \" + str(KT.shape))\n", "\n", - "fig = plt.figure(figsize=(18, 16), dpi= 80)\n", - "img1 = fig.add_subplot(1,2,1)\n", - "img1.imshow(DT[:,:,30,1]) \n", - "img1.title.set_text('DT 2 2')\n", - "img1.axis('off')\n", - "img2 = fig.add_subplot(1,2,2)\n", - "img2.imshow(KT[:,:,30, 7]) \n", - "img2.title.set_text('K 2 2 2 2')\n", - "img2.axis('off')" + "fig = plt.figure(figsize=(18, 16), dpi=80)\n", + "img1 = fig.add_subplot(1, 2, 1)\n", + "img1.imshow(DT[:, :, 30, 1])\n", + "img1.title.set_text(\"DT 2 2\")\n", + "img1.axis(\"off\")\n", + "img2 = fig.add_subplot(1, 2, 2)\n", + "img2.imshow(KT[:, :, 30, 7])\n", + "img2.title.set_text(\"K 2 2 2 2\")\n", + "img2.axis(\"off\")" ] }, { @@ -421,7 +419,7 @@ } ], "source": [ - "myimage.akccorrect(akc_out=akc_out, window=7, connectivity='all')\n", + "myimage.akccorrect(akc_out=akc_out, window=7, connectivity=\"all\")\n", "mk, rk, ak, kfa, mkt, trace = myimage.extractDKI()" ] }, @@ -449,28 +447,28 @@ "metadata": {}, "outputs": [], "source": [ - "mdPath = os.path.join(savePath, 'MD.nii')\n", - "rdPath = os.path.join(savePath, 'RD.nii')\n", - "adPath = os.path.join(savePath, 'AD.nii')\n", - "faPath = os.path.join(savePath, 'FA.nii')\n", - "fePath = os.path.join(savePath, 'FE.nii')\n", - "tracePath = os.path.join(savePath, 'Trace.nii')\n", - "mkPath = os.path.join(savePath, 'MK.nii')\n", - "rkPath = os.path.join(savePath, 'RK.nii')\n", - "akPath = os.path.join(savePath, 'AK.nii')\n", - "outlierPath = os.path.join(savePath, 'Outliers_IRLLS.nii')\n", - "akcPath = os.path.join(savePath, 'Outliers_AKC.nii')\n", - "kfaPath = akPath = os.path.join(savePath, 'KFA.nii')\n", - "mktPath = os.path.join(savePath, 'MKT.nii')\n", - "dtPath = os.path.join(savePath, 'DT.nii')\n", - "ktPath = os.path.join(savePath, 'KT.nii')\n", - "awfPath = os.path.join(savePath, 'wmti_awf.nii')\n", - "easadPath = os.path.join(savePath, 'wmti_eas_ad.nii')\n", - "easrdPath = os.path.join(savePath, 'wmti_eas_rd.nii')\n", - "eastortPath = os.path.join(savePath, 'wmti_eas_tort.nii')\n", - "iasadPath = os.path.join(savePath, 'wmti_ias_ad.nii')\n", - "iasrdPath = os.path.join(savePath, 'wmti_ias_rd.nii')\n", - "iastortPath = os.path.join(savePath, 'wmti_ias_tort.nii')\n", + "mdPath = os.path.join(savePath, \"MD.nii\")\n", + "rdPath = os.path.join(savePath, \"RD.nii\")\n", + "adPath = os.path.join(savePath, \"AD.nii\")\n", + "faPath = os.path.join(savePath, \"FA.nii\")\n", + "fePath = os.path.join(savePath, \"FE.nii\")\n", + "tracePath = os.path.join(savePath, \"Trace.nii\")\n", + "mkPath = os.path.join(savePath, \"MK.nii\")\n", + "rkPath = os.path.join(savePath, \"RK.nii\")\n", + "akPath = os.path.join(savePath, \"AK.nii\")\n", + "outlierPath = os.path.join(savePath, \"Outliers_IRLLS.nii\")\n", + "akcPath = os.path.join(savePath, \"Outliers_AKC.nii\")\n", + "kfaPath = akPath = os.path.join(savePath, \"KFA.nii\")\n", + "mktPath = os.path.join(savePath, \"MKT.nii\")\n", + "dtPath = os.path.join(savePath, \"DT.nii\")\n", + "ktPath = os.path.join(savePath, \"KT.nii\")\n", + "awfPath = os.path.join(savePath, \"wmti_awf.nii\")\n", + "easadPath = os.path.join(savePath, \"wmti_eas_ad.nii\")\n", + "easrdPath = os.path.join(savePath, \"wmti_eas_rd.nii\")\n", + "eastortPath = os.path.join(savePath, \"wmti_eas_tort.nii\")\n", + "iasadPath = os.path.join(savePath, \"wmti_ias_ad.nii\")\n", + "iasrdPath = os.path.join(savePath, \"wmti_ias_rd.nii\")\n", + "iastortPath = os.path.join(savePath, \"wmti_ias_tort.nii\")\n", "dp.writeNii(md, myimage.hdr, mdPath)\n", "dp.writeNii(rd, myimage.hdr, rdPath)\n", "dp.writeNii(ad, myimage.hdr, adPath)\n", @@ -568,15 +566,15 @@ "source": [ "# fig = plt.figure(figsize=(18, 16), dpi= 80)\n", "# img1 = fig.add_subplot(1,3,1)\n", - "# img1.imshow(fa[:,:,30]) \n", + "# img1.imshow(fa[:,:,30])\n", "# img1.title.set_text('FA')\n", "# img1.axis('off')\n", "# img2 = fig.add_subplot(1,3,2)\n", - "# img2.imshow(md[:,:,30]) \n", + "# img2.imshow(md[:,:,30])\n", "# img2.title.set_text('MD')\n", "# img2.axis('off')\n", "# img3 = fig.add_subplot(1,3,3)\n", - "# img3.imshow(mk_clipped[:,:,30]) \n", + "# img3.imshow(mk_clipped[:,:,30])\n", "# img3.title.set_text('MK')\n", "# img3.axis('off')" ] diff --git a/pydesigner/fitting/dwipy.py b/pydesigner/fitting/dwipy.py index b0de0c5..df113d2 100644 --- a/pydesigner/fitting/dwipy.py +++ b/pydesigner/fitting/dwipy.py @@ -1099,11 +1099,7 @@ def extractDTI( md = (l1 + l2 + l3) / 3 rd = (l2 + l3) / 2 ad = l1 - fa = ( - np.sqrt(1 / 2) - * np.sqrt((l1 - l2) ** 2 + (l2 - l3) ** 2 + (l3 - l1) ** 2) - / np.sqrt(l1**2 + l2**2 + l3**2) - ) + fa = np.sqrt(1 / 2) * np.sqrt((l1 - l2) ** 2 + (l2 - l3) ** 2 + (l3 - l1) ** 2) / np.sqrt(l1**2 + l2**2 + l3**2) fe = np.abs(np.stack((fa * v1[:, :, :, 0], fa * v1[:, :, :, 1], fa * v1[:, :, :, 2]), axis=3)) trace = vectorize(trace.T, self.mask) return md, rd, ad, fa, fe, trace @@ -1370,9 +1366,7 @@ def __costCalculator(grid, BT, GT, b0, IMG, iDT, iaDT, zeta, shB, Pl0, g2l_fa_R_ (-BT[b] * (1 - awf) ** -1) * np.diag((GT[b].dot((iDT - (awf**3 * zeta**-2) * iaDT).dot(GT[b].T)))) ) - ) * ( - 1 - awf - ) # Eq. 3 FBWM paper + ) * (1 - awf) # Eq. 3 FBWM paper Sa = (2 * np.pi * b0 * zeta * np.sqrt(np.pi / BT[b])) * ( shB[b].dot((Pl0 * g2l_fa_R_b[b, idx, :][0] * clm)) ) # Eq. 4 FBM paper @@ -1557,8 +1551,7 @@ def fbi_helper( gamma((l_num + 1) / 2 + int_grid) * gamma(l_num + (3 / 2)) * ( - (-BT[b] * f_grid[idx_hyper] ** 2 * zeta**-2) - * np.ones((1, len(f_grid[idx_hyper]))) + (-BT[b] * f_grid[idx_hyper] ** 2 * zeta**-2) * np.ones((1, len(f_grid[idx_hyper]))) ).T ** int_grid / (factorial(int_grid) * gamma(l_num + (3 / 2) + int_grid) * gamma((l_num + 1) / 2)) @@ -1580,11 +1573,7 @@ def fbi_helper( idx_Y = 0 for l_num in degs[::2]: g2l_fa_R_large[idx_Y : idx_Y + (2 * l_num + 1), np.squeeze(~idx_hyper)] = npm.repmat( - ( - np.exp( - -l_num // 2 * (l_num + 1) / ((2 * BT[b] * (f_grid[~idx_hyper] ** 2 * zeta**-2))) - ) - ), + (np.exp(-l_num // 2 * (l_num + 1) / (2 * BT[b] * (f_grid[~idx_hyper] ** 2 * zeta**-2)))), (2 * l_num + 1), 1, ) # Eq. 20 FBI paper @@ -1887,7 +1876,13 @@ def fbi_helper( def extractWMTI( self, - ) -> Tuple[np.ndarray[float], np.ndarray[float], np.ndarray[float], np.ndarray[float], np.ndarray[float],]: + ) -> Tuple[ + np.ndarray[float], + np.ndarray[float], + np.ndarray[float], + np.ndarray[float], + np.ndarray[float], + ]: """Returns white matter tract integrity (WMTI) parameters. Warning: this can only be run after fitting and DWI.extractDTI(). @@ -2167,8 +2162,9 @@ def akccorrect(self, akc_out: np.ndarray[bool], window: int = 3, connectivity: s connLimit = 24 else: raise Exception( - 'Connectivity choice "{}" is invalid. Please ' - 'enter either "all" or "face".'.format(connectivity) + 'Connectivity choice "{}" is invalid. Please ' 'enter either "all" or "face".'.format( + connectivity + ) ) nVoil = np.sum(patchViol) diff --git a/pydesigner/main.py b/pydesigner/main.py index 6a3bf37..37207d1 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -1,5 +1,4 @@ -"""Runs the PyDesigner pipeline -""" +"""Runs the PyDesigner pipeline""" import argparse # ArgumentParser, add_argument import glob # recursive file search @@ -916,9 +915,9 @@ def main(): os.rename(mif_smoothing, working_path) # update command history cmdtable["smooth"] = [ - "designer.preprocessing.mrpreproc.smooth(input={}, " - "output={}, " - "fwhm={}".format(working_path, mif_smoothing, args.fwhm) + "designer.preprocessing.mrpreproc.smooth(input={}, " "output={}, " "fwhm={}".format( + working_path, mif_smoothing, args.fwhm + ) ] cmdtable["smooth"].append(mrinfoutil.commandhistory(working_path)[-1]) cmdtable["HEAD"] = cmdtable["smooth"] @@ -957,10 +956,9 @@ def main(): os.rename(mif_rician, working_path) # update command history cmdtable["rician"] = [ - "designer.preprocessing.mrpreproc." - "riciancorrect(input={}, " - "output={}, " - "noise={})".format(working_path, mif_rician, filetable["noisemap"].getFull()) + "designer.preprocessing.mrpreproc." "riciancorrect(input={}, " "output={}, " "noise={})".format( + working_path, mif_rician, filetable["noisemap"].getFull() + ) ] cmdtable["rician"].append(mrinfoutil.commandhistory(working_path)[-1]) cmdtable["HEAD"] = cmdtable["rician"] diff --git a/pydesigner/postprocessing/filters.py b/pydesigner/postprocessing/filters.py index f7d2fa3..7b7ed2f 100644 --- a/pydesigner/postprocessing/filters.py +++ b/pydesigner/postprocessing/filters.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # -*- coding : utf-8 -*- -"""This module contains filter(s) for postprocessing DTI/DKI maps -""" +"""This module contains filter(s) for postprocessing DTI/DKI maps""" # --------------------------------------------------------------------- # Package Management diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index 79b9e34..ab8d6d5 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # -*- coding : utf-8 -*- -"""Utilities for running various MRtrix3's DWI preprocessing tools -""" +"""Utilities for running various MRtrix3's DWI preprocessing tools""" import os import os.path as op diff --git a/pydesigner/preprocessing/preparation.py b/pydesigner/preprocessing/preparation.py index 6026ec0..6f24ee9 100644 --- a/pydesigner/preprocessing/preparation.py +++ b/pydesigner/preprocessing/preparation.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # -*- coding : utf-8 -*- -"""Adds utilities for preparing the data for eddy and analysis -""" +"""Adds utilities for preparing the data for eddy and analysis""" import os # mkdir import os.path as op # dirname, basename, join, splitext diff --git a/pydesigner/preprocessing/util.py b/pydesigner/preprocessing/util.py index 9954a23..1fcf3a6 100644 --- a/pydesigner/preprocessing/util.py +++ b/pydesigner/preprocessing/util.py @@ -1,5 +1,4 @@ -"""Adds utilities for the command-line interface -""" +"""Adds utilities for the command-line interface""" import json # decode import os diff --git a/pydesigner/system/models.py b/pydesigner/system/models.py index d0d9285..c8fcb27 100644 --- a/pydesigner/system/models.py +++ b/pydesigner/system/models.py @@ -1,57 +1,50 @@ import os.path as op from typing import Optional + from pydantic import BaseModel, ValidationInfo, field_validator + class modelmrtrix(BaseModel): """Define model validation for MRtrix3 CLI""" + file_input: str = None file_output: Optional[str] = None nthreads: Optional[bool] = None force: Optional[bool] = True verbose: Optional[bool] = False - @field_validator('file_input') + @field_validator("file_input") @classmethod def file_input_valid(cls, var: str, info: ValidationInfo): """Validate that input file is correct type and exists.""" if not isinstance(var, str): raise TypeError( - f"Input file path {info.field_name}: {var} is not a string " - f"type. Type entered is {type(var)}." + f"Input file path {info.field_name}: {var} is not a string " f"type. Type entered is {type(var)}." ) if not op.exists(var): - raise FileNotFoundError( - f"Input file {info.field_name}: {var} does not exist." - ) - + raise FileNotFoundError(f"Input file {info.field_name}: {var} does not exist.") - @field_validator('file_output') + @field_validator("file_output") @classmethod def file_output_valid(cls, var: str, info: ValidationInfo): """Validate output filename and parent folder.""" if not isinstance(var, str): raise TypeError( - f"Output file path {info.field_name}: {var} is not a string " - f"type. Type entered is {type(var)}." + f"Output file path {info.field_name}: {var} is not a string " f"type. Type entered is {type(var)}." ) if not op.exists(op.dirname(var)): raise FileNotFoundError( f"Parent directory {op.dirname(var)} for input file {var} does " "not exists. Please ensure that the parent folder exists." ) - + @field_validator("nthreads") @classmethod def correct_nthreads(cls, var: int, info: ValidationInfo) -> int: """Check that nthreads is a postive integer.""" if not isinstance(var, int): raise TypeError( - f"{info.field_name} is not provided as a {type(var)}. Please " - "provide a positive integer." + f"{info.field_name} is not provided as a {type(var)}. Please " "provide a positive integer." ) if var <= 0: - raise ValueError( - f"{info.field_name} needs to be a valid integer." - ) - - + raise ValueError(f"{info.field_name} needs to be a valid integer.") diff --git a/pydesigner/tractography/dsistudio.py b/pydesigner/tractography/dsistudio.py index be6a300..bd4a9be 100644 --- a/pydesigner/tractography/dsistudio.py +++ b/pydesigner/tractography/dsistudio.py @@ -11,7 +11,6 @@ """ - import os import os.path as op import subprocess @@ -314,6 +313,7 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= os.remove(dirs_txt) os.remove(odf_amplitudes_nii) + path_sh = "/mnt/d/Datasets/PyDesigner_Test/test_run/metrics/dki_odf.nii" path_mask = "/mnt/d/Datasets/PyDesigner_Test/test_run/brain_mask.nii" path_out = "/mnt/d/Datasets/PyDesigner_Test/dki_odf/dki.fib" diff --git a/pydesigner/tractography/odf.py b/pydesigner/tractography/odf.py index fd43289..31dd991 100644 --- a/pydesigner/tractography/odf.py +++ b/pydesigner/tractography/odf.py @@ -4,6 +4,7 @@ """Function for computing DTI and DKI spherical harmonics from diffusion and kurtosis tensors """ + import multiprocessing import os.path as op import warnings diff --git a/pydesigner/tractography/sphericalsampling.py b/pydesigner/tractography/sphericalsampling.py index d8864f8..fec7435 100644 --- a/pydesigner/tractography/sphericalsampling.py +++ b/pydesigner/tractography/sphericalsampling.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # -*- coding : utf-8 -*- -"""Various definitions of spherical sampling -""" +"""Various definitions of spherical sampling""" import numpy as np From eb4e59d2012f9daba2dede1e73e33fd2cb3941f5 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 20:46:59 -0400 Subject: [PATCH 27/78] Auto stash before merge of "feature/project-overhaul-2" and "origin/feature/project-overhaul-2" --- .github/workflows/neurodock.yml | 14 +++++++- pydesigner/main.py | 13 +++++-- pydesigner/preprocessing/util.py | 5 ++- pydesigner/tractography/dsistudio.py | 51 +++++++++++++++------------- 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/.github/workflows/neurodock.yml b/.github/workflows/neurodock.yml index d1588d3..fca091a 100644 --- a/.github/workflows/neurodock.yml +++ b/.github/workflows/neurodock.yml @@ -39,9 +39,21 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push id: docker_build_push uses: docker/build-push-action@v5 with: push: true - tags: dmri/neurodock:latest,dmri/neurodock:${{ steps.version.outputs.value }} + tags: | + dmri/neurodock:latest + dmri/neurodock:${{ steps.version.outputs.value }} + ghcr.io/muscbridge/PyDesigner:latest + ghcr.io/muscbridge/PyDesigner:${{ steps.version.outputs.value }} + diff --git a/pydesigner/main.py b/pydesigner/main.py index 37207d1..e80193f 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -3,6 +3,7 @@ import argparse # ArgumentParser, add_argument import glob # recursive file search import json +import logging import os # mkdir import os.path as op # path import shutil # which, rmtree @@ -18,6 +19,12 @@ from .postprocessing import filters from .preprocessing import mrinfoutil, mrpreproc, util +log = logging.getLogger(__name__) +log.setLevel(logging.DEBUG) +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.INFO) +log.addHandler(console_handler) + DWIFile = util.DWIFile DWIParser = util.DWIParser @@ -511,11 +518,11 @@ def main(): # Print warnings if warningmsg != "": - print(warningmsg) + log.warn(warningmsg) # If things are unsalvageable, point out all errors and quit if errmsg != "": - print(errmsg) + log.error(errmsg) # Begin keeping track of nifti files filetable = {"dwi": DWIFile(init_nii)} @@ -531,7 +538,7 @@ def main(): args.degibbs = True else: if args.degibbs and filetable["dwi"].isPartialFourier(): - print( + log.warn( "[WARNING] Given DWI is partial fourier, overriding " "--degibbs; no unringing correction will be done to " 'avoid artifacts.Use the "--adv" flag to run forced ' diff --git a/pydesigner/preprocessing/util.py b/pydesigner/preprocessing/util.py index 1fcf3a6..a782e38 100644 --- a/pydesigner/preprocessing/util.py +++ b/pydesigner/preprocessing/util.py @@ -1,6 +1,7 @@ """Adds utilities for the command-line interface""" import json # decode +import logging import os import os.path as op # dirname, basename, join, splitext import pprint # pprint @@ -11,6 +12,8 @@ from pydesigner.preprocessing import mrinfoutil +log = logging.getLogger(__name__) + def find_valid_ext(pathname): """Finds valid extensions for dwifile, helper function @@ -295,7 +298,7 @@ def isPartialFourier(self): else: return True else: - print( + log.warn( "Insufficient information in .json file to " "determine Fourier status. Assuming DWI is " "partial Fourier" diff --git a/pydesigner/tractography/dsistudio.py b/pydesigner/tractography/dsistudio.py index bd4a9be..ef42fc6 100644 --- a/pydesigner/tractography/dsistudio.py +++ b/pydesigner/tractography/dsistudio.py @@ -24,7 +24,8 @@ from scipy.io.matlab import loadmat, savemat from tqdm import tqdm -from . import sphericalsampling +# from . import sphericalsampling +from pydesigner.tractography import sphericalsampling ODF_COLS = 20000 # Number of columns in DSI Studio odf split tqdmWidth = 70 @@ -189,29 +190,30 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= if completion.returncode != 0: raise Exception("Failed to determine amplitude of SH " "coefficients. Check above for errors.") # Load images - amplitudes_img = nib.load(odf_amplitudes_nii) - ampl_data = amplitudes_img.get_fdata() + amplitudes_data = nib.load(odf_amplitudes_nii) + amplitudes_img = amplitudes_data.get_fdata() if mask is not None: - mask_img = nib.load(mask_) - if not np.allclose(mask_img.affine, amplitudes_img.affine): + mask_data = nib.load(mask_) + mask_img = mask_data.get_fdata() + if not np.allclose(mask_data.affine, amplitudes_data.affine): raise ValueError("Differing orientation between mask and " "amplitudes.") if not mask_img.shape == amplitudes_img.shape[:3]: raise ValueError("Differing grid between mask and " "amplitudes") - mask_img = mask_img.get_fdata() else: - mask_img = np.ones((ampl_data.shape[0], ampl_data.shape[1], ampl_data.shape[2]), order="F") + mask_img = np.ones((amplitudes_img.shape[0], amplitudes_img.shape[1], amplitudes_img.shape[2]), order="F") # Make flat mask flat_mask = mask_img.flatten(order="F") > 0 - odf_array = ampl_data.reshape(-1, ampl_data.shape[3], order="F") + odf_array = amplitudes_img.reshape(-1, amplitudes_img.shape[3], order="F") masked_odfs = odf_array[flat_mask, :] masked_odfs = np.nan_to_num(masked_odfs) if map is not None: - map_img = nib.load(map_) - if not np.allclose(map_img.affine, amplitudes_img.affine): + map_data = nib.load(map_) + map_img = map_data.get_fdata() + if not np.allclose(map_data.affine, amplitudes_data.affine): raise ValueError("Differing orientation between map image and " "amplitudes.") if not map_img.shape == amplitudes_img.shape[:3]: raise ValueError("Differing grid between map image and " "amplitudes") - map_img = map_img.get_fdata().flatten(order="F") + map_img = map_img.flatten(order="F") map_img[map_img < 0] = 0 masked_map = map_img[flat_mask] @@ -247,8 +249,8 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= peak_vals = np.zeros((n_odfs, n_fibers)) dsi_mat = {} # Create matfile that can be read by dsi Studio - dsi_mat["dimension"] = np.array(amplitudes_img.shape[:3]) - dsi_mat["voxel_size"] = np.array(amplitudes_img.header.get_zooms()[:3]) + dsi_mat["dimension"] = np.array(amplitudes_data.shape[:3]) + dsi_mat["voxel_size"] = np.array(amplitudes_data.header.get_zooms()[:3]) n_voxels = int(np.prod(dsi_mat["dimension"])) for odfnum in tqdm( range(masked_odfs.shape[0]), @@ -297,10 +299,11 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= map_dir = op.dirname(path_map) map_lps = op.join(map_dir, map_name + "_lps" + ext) convertLPS(path_map, map_lps) - other_img = nib.load(map_lps) + other_data = nib.load(map_lps) + other_img = other_img.get_fdata() if not other_img.shape == amplitudes_img.shape[:3]: raise ValueError("Differing grid between other map image: {} " "and amplitudes".format(path_map)) - gmap = other_img.get_fdata().flatten(order="F") + gmap = other_img.flatten(order="F") dsi_mat[map_name] = gmap.astype(np.float32) os.remove(map_lps) savemat(output, dsi_mat, format="4", appendmat=False) @@ -314,11 +317,13 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= os.remove(odf_amplitudes_nii) -path_sh = "/mnt/d/Datasets/PyDesigner_Test/test_run/metrics/dki_odf.nii" -path_mask = "/mnt/d/Datasets/PyDesigner_Test/test_run/brain_mask.nii" -path_out = "/mnt/d/Datasets/PyDesigner_Test/dki_odf/dki.fib" -makefib( - input=path_sh, - output=path_out, - mask=path_mask, -) +# path_sh = "/mnt/d/Datasets/PyDesigner_Test/test_run/metrics/dki_odf.nii" +# path_mask = "/mnt/d/Datasets/PyDesigner_Test/test_run/brain_mask.nii" +# path_out = "/mnt/d/Datasets/PyDesigner_Test/dki_odf/dki.fib" +# path_fa = "/mnt/d/Datasets/PyDesigner_Test/test_run/metrics/dti_fa.nii" +# makefib( +# input=path_sh, +# output=path_out, +# mask=path_mask, +# map = path_fa, +# ) From 97f7a8717b348a53044f590d5af671e241b70be2 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 20:55:29 -0400 Subject: [PATCH 28/78] Fix unit test workflow --- .github/workflows/pydesigner_ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index e8b55ce..8680aa7 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -45,8 +45,6 @@ jobs: pytest: needs: pre-commit runs-on: ubuntu-latest - container: - image: dmri/ci-cd:latest steps: - name: Checkout code id: checkout From 519a3021e78c25496bed2b55b7a6b2d78f70dd7d Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Tue, 10 Sep 2024 00:55:59 +0000 Subject: [PATCH 29/78] Pre-commit autofix --- .github/workflows/neurodock.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/neurodock.yml b/.github/workflows/neurodock.yml index fca091a..a1741bf 100644 --- a/.github/workflows/neurodock.yml +++ b/.github/workflows/neurodock.yml @@ -56,4 +56,3 @@ jobs: dmri/neurodock:${{ steps.version.outputs.value }} ghcr.io/muscbridge/PyDesigner:latest ghcr.io/muscbridge/PyDesigner:${{ steps.version.outputs.value }} - From adf4431e8e60ce5c9b53cc9d058b3037f541f4f6 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 22:53:00 -0400 Subject: [PATCH 30/78] Enable tests --- pydesigner/preprocessing/mrinfoutil.py | 3 +- pydesigner/preprocessing/mrpreproc.py | 30 +- tests/conftest.py | 5 +- .../data/hifi/hifi_splenium_4vox_no_bval.bvec | 3 + .../data/hifi/hifi_splenium_4vox_no_bval.json | 4140 +++++++++++++++++ ...car.nii => hifi_splenium_4vox_no_bval.nii} | Bin .../data/hifi/hifi_splenium_4vox_no_bvec.bval | 1 + .../data/hifi/hifi_splenium_4vox_no_bvec.json | 4140 +++++++++++++++++ .../data/hifi/hifi_splenium_4vox_no_bvec.nii | Bin 0 -> 11136 bytes .../data/hifi/hifi_splenium_4vox_no_json.bval | 1 + .../data/hifi/hifi_splenium_4vox_no_json.bvec | 3 + .../data/hifi/hifi_splenium_4vox_no_json.nii | Bin 0 -> 11136 bytes .../hifi/hifi_splenium_4vox_no_sidecar.nii | Bin 0 -> 11136 bytes tests/test_fitting_dwipy.py | 66 +- tests/test_preprocessing_mrinfoutil.py | 202 +- tests/test_preprocessing_mrpreproc.py | 125 +- 16 files changed, 8570 insertions(+), 149 deletions(-) create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_bval.bvec create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_bval.json rename tests/data/hifi/{hifi_splenium_4vox no_sidecar.nii => hifi_splenium_4vox_no_bval.nii} (100%) create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_bvec.bval create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_bvec.json create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_bvec.nii create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_json.bval create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_json.bvec create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_json.nii create mode 100644 tests/data/hifi/hifi_splenium_4vox_no_sidecar.nii diff --git a/pydesigner/preprocessing/mrinfoutil.py b/pydesigner/preprocessing/mrinfoutil.py index 20fe04a..4cd0618 100644 --- a/pydesigner/preprocessing/mrinfoutil.py +++ b/pydesigner/preprocessing/mrinfoutil.py @@ -36,7 +36,8 @@ def getconsole(path: int, flag: str) -> str: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + msg = "MRtrix error. See below for more information." + raise OSError(msg) console = str(completion.stdout).split("\\n")[0] console = console.split("b")[-1] console = console.replace("'", "") diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index ab8d6d5..08de7e5 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -40,7 +40,7 @@ def miftonii(input, output, nthreads=None, force=True, verbose=False): niitomif """ if not op.exists(input): - raise IOError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise IOError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -48,12 +48,12 @@ def miftonii(input, output, nthreads=None, force=True, verbose=False): "directory.".format(op.dirname(output)) ) if op.splitext(output)[-1] != ".nii": - raise IOError("Output specified does not possess the .nii " "extension.") + raise IOError("Output specified does not possess the .nii extension.") if nthreads is not None: if not isinstance(nthreads, int): - raise TypeError("Please specify the number of threads as an " "integer.") + raise TypeError("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise TypeError("Please specify whether forced overwrite is True " "or False.") + raise TypeError("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise TypeError("Please specify whether verbose is True or False.") arg = ["mrconvert"] @@ -78,7 +78,7 @@ def miftonii(input, output, nthreads=None, force=True, verbose=False): def niitomif(input, output, nthreads=None, force=True, verbose=False): - """Converts input `.nii` images to output `.nif` images provided that + """Converts input `.nii` images to output `.mif` images provided that all BVEC, BVAL and JSON files are provided and named same as input .nii Parameters @@ -105,7 +105,7 @@ def niitomif(input, output, nthreads=None, force=True, verbose=False): miftonii """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -113,18 +113,22 @@ def niitomif(input, output, nthreads=None, force=True, verbose=False): "directory.".format(op.dirname(output)) ) if op.splitext(output)[-1] != ".mif": - raise OSError("Output specified does not possess the .mif " "extension.") + msg = "Output specified does not possess the .mif extension." + raise OSError(msg) if not op.exists(op.splitext(input)[0] + ".bvec"): - raise OSError('Unable to locate BVEC file" {}'.format(op.splitext(output)[0] + ".bvec")) + msg = f"Unable to locate BVEC file {op.splitext(input)[0]}.bvec." + raise OSError(msg) if not op.exists(op.splitext(input)[0] + ".bval"): - raise OSError('Unable to locate BVAL file" {}'.format(op.splitext(output)[0] + ".bval")) + msg = f"Unable to locate BVAL file {op.splitext(input)[0]}.bval." + raise OSError(msg) if not op.exists(op.splitext(input)[0] + ".json"): - raise OSError('Unable to locate JSON file" {}'.format(op.splitext(output)[0] + ".json")) + msg = f"Unable to locate JSON file {op.splitext(input)[0]}.json" + raise OSError(msg) if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") arg = ["mrconvert"] @@ -139,7 +143,7 @@ def niitomif(input, output, nthreads=None, force=True, verbose=False): arg.extend([input, output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Conversion from .nii to .mif failed; check " "above for errors.") + raise Exception("Conversion from .nii to .mif failed; check above for errors.") def stride_match(target, moving, output, nthreads=None, force=True, verbose=False): diff --git a/tests/conftest.py b/tests/conftest.py index c282f83..c8f5009 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -24,6 +24,9 @@ def load_data(type: str = "hifi") -> dict: "json": os.path.join(data_path, "hifi_splenium_4vox.json"), "mask": os.path.join(data_path, "brain_mask.nii"), "mean_b0": os.path.join(data_path, "mean_b0.mif"), - "no_sidecar": os.path.join(data_path, "no_sidecar.nii"), + "no_json": os.path.join(data_path, "hifi_splenium_4vox_no_json.nii"), + "no_bval": os.path.join(data_path, "hifi_splenium_4vox_no_bval.nii"), + "no_bvec": os.path.join(data_path, "hifi_splenium_4vox_no_bvec.nii"), + "no_sidecar": os.path.join(data_path, "hifi_splenium_4vox_no_sidecar.nii") } return data diff --git a/tests/data/hifi/hifi_splenium_4vox_no_bval.bvec b/tests/data/hifi/hifi_splenium_4vox_no_bval.bvec new file mode 100644 index 0000000..e3fee31 --- /dev/null +++ b/tests/data/hifi/hifi_splenium_4vox_no_bval.bvec @@ -0,0 +1,3 @@ +-0 -0.107124436001454 0.292553778318882 0.494975549316603 -0.331179674274064 -0.157720250015796 -0.834493821724479 -0.671508391113715 -0.306520502359992 -0.65361541138022 -0.658926395149459 -0.318114581098245 -0.398100641931373 -0.697536306225592 -0.981993401975305 -0.897844407618251 -0.05749490996072 -0.0173815402385974 0.602463273606934 0.254720773175283 -0.294508619265963 0.106322835260603 0.639320679066917 0.32864937320069 0.243418786119065 0.470326120054345 0.79658601973857 0.779037414572222 0.864894922448373 0.805427064571242 0.966718900520119 -0.107921247134797 0.291493465986041 0.49489597010419 -0.332251279533071 -0.157921198286174 -0.834809560953567 -0.672001119091198 -0.307981681628018 -0.654661432000005 -0.659022241992732 -0.317969611787417 -0.396691056302237 -0.696506342141238 -0.982081909648241 -0.897240098487686 -0.0578306855591161 -0.0169599340356157 0.602626565271525 0.254908947256818 -0.29386495145142 0.106555922032881 0.639915336542027 0.329030492757739 0.243830631262792 0.470170910384088 0.796578144002612 0.778897305158068 0.864851375031768 0.805132475654841 0.966691152381495 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0.167433636091709 0.179656737305558 -0.0319575747280528 -0.0143841733120731 -0.150743520908163 -0.303955935925382 -0.317375150906513 0.316161622678813 0.0576137924897586 -0.0998821108089945 0.251607742872031 0.119513427496056 0.139152141248287 0.00811342631813633 -0.126173972596276 -0.287117555819235 -0.42642109558518 -0.447990584600667 -0.454066554451056 0.419819730886576 0.228070993481824 0.0767817998845401 -0.0847183608456306 -0.238203829521202 -0.385201022273246 0.395789122696084 0.26501653858044 0.283168598062746 0.158380384065096 0.0260917598194689 -0.111815578492353 -0.263336143945509 -0.408986191103439 -0.536359861887816 -0.567851107798206 -0.580743324029991 0.560817010049981 0.517773141788814 0.364627307461488 0.220893774187588 0.0743969333776136 -0.0752947169215366 -0.223374605031268 -0.367907517642424 -0.523670700716794 0.530659897486596 0.399829799021347 0.418713802163608 0.298818137799082 0.170820203478567 0.0357410534599787 -0.110810641102434 -0.261271926536265 -0.401290971139577 -0.521219369657943 -0.639537363719768 -0.674358058105033 -0.694219036611602 0.683661103367533 0.651639794497528 0.593749263466993 0.450529094115072 0.302850168228056 0.150426680201142 -0.0258566033630011 -0.179890252905505 -0.33053890412517 -0.473467700323968 -0.508280833822366 0.651435723356128 0.643651110737854 0.52487130843158 0.570751260843916 0.45078985212529 0.322319854214945 0.18664160569201 0.0416419801901304 -0.111007808492149 -0.263077580381236 -0.395279705814662 -0.516162869593069 -0.628449064214919 -0.730450974482124 -0.769835697909747 -0.792670875813156 -0.792475068139004 0.76807947886133 0.722090352512831 0.652452979556596 0.517965885641621 0.373138590280993 0.219604663742949 0.0491690752636899 -0.122515270026359 -0.278090020481486 -0.426629344326822 -0.566765566094908 -0.612719282281588 -0.638859670224636 -0.75460985108015 0.756163035290835 0.724934354145726 0.672672324802485 0.571438775010477 0.454833352456424 0.327010861283958 0.18958723629555 0.0432919092236701 -0.105990822497774 -0.256825010403566 -0.395143768333053 -0.524355877800953 -0.642755355415142 -0.750352601195467 -0.830854105642591 -0.866113771869038 -0.878529206028974 0.866717663926795 0.832917810512381 0.776556768254895 0.698164180515984 0.571720712766676 0.434215778391318 0.283640997628457 0.119073208496367 -0.0496705726957847 -0.215229040282561 -0.368972054354225 -0.513423633175848 -0.645990885558272 -0.7013674090827 -0.734149833401637 -0.84011593641403 0.85008389880337 0.830703036059772 0.786545599808296 0.701593378182944 0.591924796586187 0.469357480540893 0.335662679850628 0.192903774440221 0.049878694004121 -0.100044979205718 -0.251374589587069 -0.382847962156195 -0.515830781414033 -0.636642969121791 -0.748883655194952 -0.842966725053158 -0.907161824274664 -0.935306732664578 0.938379400673389 0.917742518598187 0.874966158717709 0.811324189718348 0.727584841637569 0.612728450155558 0.485305379144235 0.344645353476748 0.186880589903409 0.0210919319949235 -0.14527066140956 -0.305357826611001 -0.454799737058373 -0.588906166308115 -0.709661471050083 -0.769970478726108 -0.810384328931198 -0.900250422440969 -0.918924969126702 0.911676269779964 0.876576010838229 0.807846251614615 0.711113249739593 0.595616028633419 0.46667809577296 0.329444512007713 0.192081721899303 0.0521971412333846 -0.0948025972446438 -0.243386010351146 -0.334538920333269 -0.474208640225734 -0.606529258656643 -0.724031197912207 -0.831758790319117 -0.913512992772813 -0.962950348032104 -0.980513517944312 0.97136650143098 0.937663900942668 0.879936395135582 0.797367286136809 0.673470535273132 0.547598639829381 0.413449092584784 0.263488097473679 0.179394780669564 0.0977298076025707 -0.072144551185754 -0.240042635406511 -0.400172362037935 -0.544035552986569 -0.67411461420622 -0.793777594098811 -0.858151754807062 -0.934272415068186 -0.962964161001181 0.966734135096639 0.943326347444415 0.889739329677937 0.806796588393981 0.69776634417946 0.571736235904738 0.435181120188989 0.297819130777425 0.155131597426621 0.0018551817998249 -0.0855682243697374 -0.180517923851594 -0.26085863018715 -0.41419612071205 -0.553471861514429 -0.68389843063013 -0.795026149357325 -0.89235381999681 -0.959879026189289 -0.993200892650552 0.997106344047171 0.974006171088818 0.924706558419229 0.849114763990332 0.738154943196382 0.605368356717236 0.473599153423011 0.333239277136907 0.247346470092292 0.0907097477937002 0.00677203225136 -0.167178906983263 -0.335579206811288 -0.485834332653544 -0.621376234493193 -0.749141689830632 -0.847129279238113 -0.878565109300628 -0.931451819798382 -0.977549311800925 -0.994478522987698 0.984341997050764 0.945930033291897 0.879663586263887 0.781898553431126 0.660273635754016 0.524418870524445 0.388454199926447 -0 -0 -0 -0 -0 -0 -0 -0 -0 +0 0.379257779214057 0.380028586538598 0.0311300404752942 0.632117908174625 0.885317264740848 0.49858841390496 0.439248509673855 0.0299784461876069 0.06622480965825 0.75181895288965 0.944963155933383 0.632772374168768 0.596824154113576 0.187270121088906 0.246887874344585 0.82674922058841 0.982177197127591 0.595554341723376 0.633620836609146 0.321193361084627 0.320274775262929 0.751995562848586 0.944363756483312 0.882894783782941 0.631379694270032 0.0666183459863263 0.437395077431438 0.498226275662756 0.246551046797496 0.186417114374406 0.377496038032817 0.377998480501619 0.0292535278510531 0.630638474884174 0.884645963044246 0.498258256122319 0.438706697508762 0.0294453871830644 0.0662522141216181 0.751658235914066 0.945074650557898 0.632900014499533 0.596468703643633 0.186971310627323 0.246856220507888 0.826415403987137 0.982016734157863 0.59546466163237 0.632904573244427 0.320717994722603 0.320225395458026 0.751438348848095 0.944236306751208 0.882719677010993 0.630840492959272 0.0663725464694736 0.437699704026877 0.498363109187612 0.246210892813304 0.18584935255013 0 0 0 0 0 0 0 0 0 0 0 0.167928288193019 0.0029604118401354 0.0715353993301404 0.239061260590483 0.328020048620526 0.257694817333406 0.0995898977869368 0.0645802802255113 0.0986602774836945 0.0361973576438834 0.0254684614576017 0.134645568806127 0.302766147626028 0.398265076194483 0.478910862480201 0.409637489588946 0.340420664336257 0.176576075193864 0.0114058020725989 0.162755676332985 0.19064086787296 0.248917478285229 0.197986367727544 0.140718414281233 0.0803647145712618 0.0823274969250801 0.192115650695801 0.362161023718856 0.462688808216714 0.548487119328465 0.618228644341628 0.544639106764373 0.50944388872733 0.399776511008387 0.237999381427001 0.0733767333842213 0.0987241211745738 0.265639468948484 0.307541202057346 0.348257082834974 0.398474551441859 0.354755024310063 0.303591846110307 0.244049598766782 0.0191439652175515 0.139286228787605 0.246896405488795 0.413631357191603 0.517479243519003 0.608571884097896 0.6834513248808 0.737349342615467 0.662251664321132 0.655554259399003 0.551556178925268 0.432776754768013 0.280991922554223 0.122362871802692 0.0423514305447128 0.206488143038679 0.368030425037424 0.421615439614268 0.469139881637708 0.515913850205523 0.513425620518419 0.466727292603339 0.408663234707862 0.342635534016983 0.18162280741493 0.0600399484283135 0.22673683517266 0.297093319038815 0.414162790615952 0.539768517992339 0.643477016785925 0.729103345262706 0.794241958332362 0.834129481085845 0.766885459903341 0.773819799930531 0.679521904419892 0.573445374357227 0.45461601354854 0.310927188685883 0.161310011605193 0.00463254206408693 0.153354646855444 0.308798736690098 0.461139887305438 0.524195338145866 0.575954968004512 0.622932500284083 0.633182842629397 0.615183379788991 0.565588995924314 0.50267476395021 0.424963042782632 0.267524264320895 0.104247530832477 0.0251304270895389 0.134944429995088 0.296253055263495 0.436697428834918 0.55785655734783 0.665797191288765 0.756957744666237 0.830393624941839 0.882294751246035 0.91017657879408 0.855608825508986 0.851941546626368 0.764754591415583 0.660310406694139 0.539634171072302 0.382153211609403 0.227664171604027 0.0673971399691882 0.0908858417629177 0.247200344810918 0.39643258769535 0.540104582666383 0.612909079303664 0.667334958360142 0.71486396784627 0.736307019584135 0.732782185716544 0.702782612294701 0.64919742589495 0.578471121411532 0.495793786257999 0.347550671044417 0.186849915419866 0.0977117674765231 0.0624642109429796 0.223808001629232 0.382426409550607 0.534258239140307 0.655019662674649 0.757921819852695 0.841939315411948 0.906226395883584 0.947119358761004 0.962654475775129 0.920453799336134 0.905540199546341 0.82890875124907 0.733123308151609 0.615981249209934 0.468035602298133 0.303387513176571 0.141192249296391 0.0195199381669131 0.176593644540127 0.326748545265499 0.469588858365502 0.600855103180556 0.681650038384194 0.742432846040428 0.790104012606158 0.819665194238945 0.827562269884572 0.811515441546546 0.770905339268484 0.711078059985128 0.638555128158869 0.550269417426094 0.416163858067192 0.256584865362134 0.173604345716626 0.0118276849053527 0.150377601386909 0.311386020696751 0.473437854126533 0.617869583387912 0.734419762229036 0.831182328499966 0.906222689017614 0.958215780379309 0.98678952976733 0.99089456500804 0.960147070796914 0.942371210124114 0.879162069772608 0.791347175108519 0.682724763373749 0.541735788330845 0.379938868125404 0.207902709898412 0.0420556198188551 0.120010489508093 0.277329907735662 0.428521121620715 0.571193475223454 0.70425641895082 0.785417952741133 0.841857822613764 0.879684446343327 0.943739165730559 0.899279350885811 0.895892973807508 0.866791430966747 0.815242864758753 0.747945178518228 0.659697706809126 0.520690443345492 0.334999493706992 0.248533473459681 0.0896794648937834 0.0732547641572388 0.23411160792235 0.395476197197533 0.551791395321912 0.689816977095479 0.80206366645187 0.889495670365764 0.950789689648239 0.987583749948049 0.999572769050548 0.98113581402264 0.982903501600488 0.950734914502896 0.900815357807083 0.828358579058253 0.726985360532619 0.606000413592186 0.451331450124525 0.279051024155475 0.109751190101701 0.0553877049018462 0.218478255175028 0.375921574697323 0.525275776054447 0.670065333852344 0.788236176762092 0.864578484874424 0.914810177747132 0.963298866460808 0.983676830637946 0.952924698778989 0.93631319898352 0.894227741095038 0.834837713149542 0.753149338709885 0.634381938473254 0.511089993812499 0.40327607841238 0.344992170353783 0.17950977609742 0.014047835370413 0.149453678575656 0.312207598421112 0.467812056255361 0.62005637622142 0.749842759864831 0.851393422431793 0.920454215835452 0 0 0 0 0 0 0 0 0 +0 -0.91906903555249 -0.877491059944128 -0.868349080799967 -0.700533349324232 -0.437421608486221 -0.234584004088739 -0.596772341306253 -0.951391861637602 -0.75392384802178 0.0241716315873972 -0.076470564041132 0.664164890189053 0.396540074373992 -0.0248769000306931 0.364584417145145 0.559624929406177 0.187151904788865 0.531369015005129 0.730508017170567 0.900055274904537 0.941339217831496 0.160535798860295 -0.0129106514693161 -0.401552107975757 -0.616565505381362 -0.600843331531709 -0.44920624758946 -0.0610520372809271 0.538980356843232 0.175223362709891 -0.919700900113954 -0.878719925802386 -0.868459676595755 -0.701358824872065 -0.438705385423489 -0.23416171149956 -0.596616233014068 -0.950936513617504 -0.753013315624885 0.0264495936193729 -0.0756916831710072 0.664886289086857 0.398878428808692 -0.02359770490839 0.366090442534124 0.560083200792729 0.188030567750061 0.531284349126007 0.731063081888559 0.900435093805821 0.941329661457988 0.16077552657072 -0.0125192601158792 -0.401687185668277 -0.617235439233315 -0.600880974555797 -0.449152487614092 -0.0605500662636889 0.539575660068271 0.175977936131446 0 0 0 0 0 0 0 0 0 0 0 0.97147623104106 -0.983724907062845 0.996925975173927 0.970897939660362 0.932565943327548 0.917171832390404 0.94305613083502 -0.94650473622067 -0.993451961912741 -0.994340643458945 0.96749413494112 0.983660058915596 0.942851707060397 0.917234485454764 0.868748821195983 0.865887196009335 0.838020775711205 0.876427592988548 0.890894759160692 -0.892895281337299 -0.95479824123517 -0.96547638195297 -0.976536838767196 -0.960966837886296 -0.919326756377414 0.914643730418693 0.944911536051819 0.88806246290493 0.872258402501558 0.835751817249731 0.778004254263722 0.796255184466852 0.75709789314981 0.743301311584661 0.787972977802011 0.810773116577401 -0.822032742076401 -0.813232221539934 -0.878900071539237 -0.911001067379417 -0.914157058852638 -0.931922517311958 -0.926248226380427 -0.897264649807067 -0.851705645081376 0.836061851539958 0.882710766213638 0.808447804286143 0.801824764559484 0.774894005610198 0.729120609746515 0.666360974912205 0.702253311454172 0.639698498873341 0.651242005938383 0.635370947470352 0.682850458740739 0.709286442015812 -0.728569730347213 -0.729882336460013 -0.715552526579764 -0.78693326052588 -0.829571905912656 -0.843329540011107 -0.857744465616797 -0.865912888918622 -0.850728154841237 -0.811436521008894 -0.841821685288455 0.756324469332393 0.730960775464377 0.7976500920961 0.70902198916265 0.710941949946524 0.694296219552291 0.658462772560026 0.606172959746279 0.540282588270721 0.58538609319323 0.494931178349684 0.521369229514593 0.525558917966945 0.509672104486906 0.55738432129562 0.587921731822697 0.60988671568086 -0.621720408492739 -0.619054814245057 -0.601377679867909 -0.675966410989983 -0.727353742881393 -0.750818814232113 -0.772438923082178 -0.778806405886589 -0.776385875844176 -0.75186799658627 -0.705820944184717 -0.74364363047034 -0.762227508113841 -0.655692332040698 0.640318252766773 0.621855537388195 0.597333490728029 0.601875226221753 0.591473348089542 0.565755131943632 0.523930441505397 0.468702232341215 0.400430444667208 0.449415678212296 0.34359424252097 0.37443467838619 0.388401493164187 0.381793052958947 0.404524879407125 0.44498984169703 0.472910202499617 -0.490449033902391 -0.495116057610507 -0.489694587467412 -0.469950866386408 -0.545415334467593 -0.605079094897083 -0.639153574601204 -0.666088240304235 -0.678647996073074 -0.678065675347729 -0.665133313935025 -0.633851192734092 -0.580417347585194 -0.622328119644437 -0.652771883045379 -0.53353315156179 0.52292981105763 0.509747431798423 0.484867054718182 0.471523982004838 0.469653358027216 0.4530541584652 0.422455624320061 0.376220484764075 0.316981128977744 0.251569796244618 0.29929186271401 0.182823370756525 0.216399831374262 0.239198547156923 0.244418435376369 0.265235321039913 0.291570645810749 0.324447321695955 -0.345055173140205 -0.355757437370661 -0.357308842990776 -0.348194433072706 -0.331049004262106 -0.399896325916625 -0.461813986341144 -0.506907515806095 -0.54150218320928 -0.560977557416148 -0.565985090907414 -0.558982607600581 -0.536213755597077 -0.495415861206878 -0.43998200510134 -0.483686990787462 -0.526727108048242 -0.399262705661962 -0.394255002421204 0.38240417910786 0.366951282005216 0.351057021144198 0.335492360441849 0.325375412721591 0.302237475769876 0.265003304531992 0.211960209337646 0.153368452876475 0.09560558903486 0.137407614324494 0.00449588998534156 0.0469065092300759 0.0767587574462008 0.0983144032181155 0.121242114618932 0.14539762201855 0.171764636576789 0.191897279499905 -0.205047804999931 -0.209462481559225 -0.205137975412291 -0.194790720803189 -0.224633778360866 -0.288538332328319 -0.346893721953502 -0.395890511869559 -0.277801907195613 -0.426316236934011 -0.438373063908279 -0.437095125049625 -0.418618146061485 -0.380267441486103 -0.332217432770241 -0.314322435354915 -0.389038436347184 -0.255668079828189 -0.254278623090244 0.245069075123809 0.235217255496314 0.227952851779751 0.211200191812938 0.193066483505053 0.172660219850669 0.139337163410114 0.0854560201310879 0.0247492278969808 -0.0291691228988581 -0.173351069699069 -0.036248939796438 -0.16749894729897 -0.130281482905269 -0.0865503492350303 -0.0614428370555946 -0.0263992536395022 0.00214056578655217 0.027618489999061 0.038815759345062 -0.052068616961396 -0.0598266724981131 -0.0600062531839142 -0.055583061111579 -0.078356417529529 -0.110511910390595 -0.16795203298997 -0.228197114030911 -0.104283352298941 -0.155407961607421 -0.303131420535323 -0.308818403561359 -0.29621502840768 -0.258864818014424 -0.216003816699498 -0.190647015997106 -0.14546134360088 -0.255913566297054 -0.115662914690123 -0.110333962501028 -0.103995796709698 0.0934581764888281 0.0879931110879873 0.0856962949675841 0.0645348164660964 0.0421255432993888 0.0106812206143581 -0.0432130908752722 0 0 0 0 0 0 0 0 0 diff --git a/tests/data/hifi/hifi_splenium_4vox_no_bval.json b/tests/data/hifi/hifi_splenium_4vox_no_bval.json new file mode 100644 index 0000000..08d5f22 --- /dev/null +++ b/tests/data/hifi/hifi_splenium_4vox_no_bval.json @@ -0,0 +1,4140 @@ +{ + "AcquisitionMatrixPE": 74, + "AcquisitionNumber": 1, + "AcquisitionTime": "variable", + "BandwidthPerPixelPhaseEncode": 36.5229988, + "BaseResolution": 74, + "BodyPartExamined": "BRAIN", + "ConsistencyInfo": "N4_VE11C_LATEST_20160120", + "ConversionSoftware": "dcm2niix", + "ConversionSoftwareVersion": "v1.0.20190902", + "DerivedVendorReportedEchoSpacing": 0.000739999989, + "DeviceSerialNumber": 167021, + "DiffusionScheme": "Monopolar", + "DwellTime": 4.39999985e-06, + "EchoTime": 0.0989999995, + "EchoTrainLength": 37, + "EffectiveEchoSpacing": 0.000369999994, + "FlipAngle": 90, + "ImageOrientationPatientDICOM": [ + 0.994345, + -0.0163522, + -0.104929, + 2.73897e-08, + 0.988074, + -0.153983 + ], + "ImageType": "variable", + "ImagingFrequency": 123.230003, + "InPlanePhaseEncodingDirectionDICOM": "COL", + "InstitutionAddress": "XXXXX", + "InstitutionName": "XXXXX", + "InstitutionalDepartmentName": "XXXXX", + "MRAcquisitionType": "2D", + "MagneticFieldStrength": 3, + "Manufacturer": "Siemens", + "ManufacturersModelName": "Prisma_fit", + "Modality": "MR", + "ParallelReductionFactorInPlane": 2, + "PartialFourier": 1, + "PatientPosition": "HFS", + "PercentPhaseFOV": 100, + "PhaseEncodingSteps": 74, + "PhaseResolution": 1, + "PixelBandwidth": 1535, + "ProcedureStepDescription": "XXXXX", + "ProtocolName": "variable", + "PulseSequenceDetails": "%SiemensSeq%_ep2d_diff", + "ReceiveCoilActiveElements": "HEA;HEP", + "ReceiveCoilName": "Head_32", + "ReconMatrixPE": 74, + "RefLinesPE": 24, + "RepetitionTime": 3.9000001, + "SAR": "variable", + "ScanOptions": "FS", + "ScanningSequence": "EP", + "SequenceName": "_ep_b0", + "SequenceVariant": "SK_SP", + "SeriesDescription": "variable", + "SeriesNumber": "variable", + "ShimSetting": [ + 3695, + -10046, + 2626, + 292, + 83, + -279, + -134, + 102 + ], + "SliceThickness": 3, + "SoftwareVersions": "syngo_MR_E11", + "SpacingBetweenSlices": 3, + "StationName": "MRC35104", + "TxRefAmp": 222.089005, + "command_history": [ + "variable", + "mrcat -axis 3 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi0.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi1.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi2.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif (version=3.0.1-24-g62bb3c69)", + "dwidenoise -noise /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/noisemap.nii -extent '5,5,5' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/1_dwi_denoised.mif (version=3.0.1-24-g62bb3c69)", + "mrdegibbs /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/2_dwi_degibbs.mif (version=3.0.1-24-g62bb3c69)", + "/usr/local/mrtrix3/bin/dwifslpreproc -se_epi /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/B0_EPI.mif -eddy_options '--repol --data_is_shelled' -rpe_header -eddyqc_all /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/metrics_qc/eddy /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/3_dwi_undistorted.mif (version=3.0.1-24-g62bb3c69)", + "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.json -strides '1,2,3,4' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/4_dwi_smoothed.mif (version=3.0.1-24-g62bb3c69)", + "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides '1,2,3,4' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif (version=3.0.1-24-g62bb3c69)" + ], + "comments": [ + "TE=99;Time=104142.333;phase=1;mb=2", + "TE=99;Time=104634.188;phase=0;mb=2", + "TE=99;Time=102301.625;phase=1;mb=2", + "TE=99;Time=104142", + "TE=99;Time=104142" + ], + "dw_scheme": [ + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.2041193387, + 0.5137031909, + -0.833333263, + 1000.0 + ], + [ + -0.1977141975, + 0.5146343525, + -0.8343024508, + 1000.0 + ], + [ + -0.3999621792, + 0.1718072214, + -0.900284696, + 1000.0 + ], + [ + 0.4037001972, + 0.7264234052, + -0.5561790963, + 1000.0 + ], + [ + 0.2032804557, + 0.9391539284, + -0.2768879831, + 1000.0 + ], + [ + 0.8546867084, + 0.5149137883, + -0.06613940621, + 1000.0 + ], + [ + 0.7310855427, + 0.5144020839, + -0.4482236331, + 1000.0 + ], + [ + 0.4058203992, + 0.1702779517, + -0.8979505681, + 1000.0 + ], + [ + 0.7299824555, + 0.1701815673, + -0.6619394601, + 1000.0 + ], + [ + 0.6526334818, + 0.7283765637, + 0.2086555051, + 1000.0 + ], + [ + 0.3244365682, + 0.9401997848, + 0.1037558568, + 1000.0 + ], + [ + 0.3253184522, + 0.5170243383, + 0.791740954, + 1000.0 + ], + [ + 0.6514813496, + 0.5175849347, + 0.554687197, + 1000.0 + ], + [ + 0.9790823445, + 0.1727878311, + 0.1074342964, + 1000.0 + ], + [ + 0.8540502963, + 0.1734394521, + 0.4904251705, + 1000.0 + ], + [ + -0.002259620983, + 0.7302636963, + 0.6831616412, + 1000.0 + ], + [ + -0.002591339745, + 0.9415239344, + 0.3369361451, + 1000.0 + ], + [ + -0.6554853118, + 0.5169442435, + 0.5505521367, + 1000.0 + ], + [ + -0.3308567768, + 0.5183798452, + 0.7885531874, + 1000.0 + ], + [ + 0.1972617938, + 0.1747377061, + 0.9646525378, + 1000.0 + ], + [ + -0.2056872366, + 0.1740635009, + 0.963013322, + 1000.0 + ], + [ + -0.6527536174, + 0.7289013255, + 0.2064353957, + 1000.0 + ], + [ + -0.3254198893, + 0.9404517877, + 0.09824627548, + 1000.0 + ], + [ + -0.1993994297, + 0.9378278089, + -0.2841106622, + 1000.0 + ], + [ + -0.402190306, + 0.7259439266, + -0.5578963821, + 1000.0 + ], + [ + -0.7282749406, + 0.170845989, + -0.6636469384, + 1000.0 + ], + [ + -0.7269286759, + 0.5136962899, + -0.455731085, + 1000.0 + ], + [ + -0.8535207681, + 0.5157749553, + -0.07401684809, + 1000.0 + ], + [ + -0.8581097023, + 0.1742568347, + 0.4829930584, + 1000.0 + ], + [ + -0.9798602664, + 0.1731730579, + 0.09942308757, + 1000.0 + ], + [ + 0.204978745, + 0.5120461773, + -0.8341417304, + 2000.0 + ], + [ + -0.1965293814, + 0.5127992738, + -0.8357111385, + 2000.0 + ], + [ + -0.3998713053, + 0.1699687211, + -0.9006739549, + 2000.0 + ], + [ + 0.4048534043, + 0.7250704832, + -0.5571054796, + 2000.0 + ], + [ + 0.2036165985, + 0.9386839084, + -0.2782315599, + 2000.0 + ], + [ + 0.8549558168, + 0.5145177471, + -0.06574221798, + 2000.0 + ], + [ + 0.7315589065, + 0.5138347744, + -0.4481019872, + 2000.0 + ], + [ + 0.4072249602, + 0.1696576375, + -0.8974319572, + 2000.0 + ], + [ + 0.7309258671, + 0.1700521269, + -0.6609308972, + 2000.0 + ], + [ + 0.6524868782, + 0.7278674133, + 0.2108788811, + 2000.0 + ], + [ + 0.3242097053, + 0.9401930644, + 0.1045230534, + 2000.0 + ], + [ + 0.3238402283, + 0.5170630515, + 0.7923214671, + 2000.0 + ], + [ + 0.6502088878, + 0.516892536, + 0.5568217924, + 2000.0 + ], + [ + 0.9790345074, + 0.1722952772, + 0.1086543635, + 2000.0 + ], + [ + 0.8532894718, + 0.1731874673, + 0.4918365364, + 2000.0 + ], + [ + -0.001974410286, + 0.7298582035, + 0.6835957171, + 2000.0 + ], + [ + -0.00310387162, + 0.9412377457, + 0.3377304724, + 2000.0 + ], + [ + -0.655638689, + 0.5168712665, + 0.5504380105, + 2000.0 + ], + [ + -0.331102832, + 0.5175902144, + 0.788968494, + 2000.0 + ], + [ + 0.1965814308, + 0.1742203798, + 0.9648849674, + 2000.0 + ], + [ + -0.2059179905, + 0.1740199847, + 0.9629718719, + 2000.0 + ], + [ + -0.6533703702, + 0.7283237759, + 0.2065227271, + 2000.0 + ], + [ + -0.3258404176, + 0.9402721635, + 0.09857119676, + 2000.0 + ], + [ + -0.1997946014, + 0.9376822071, + -0.2843135519, + 2000.0 + ], + [ + -0.4019648303, + 0.7255111928, + -0.5586213246, + 2000.0 + ], + [ + -0.7282631119, + 0.1706087558, + -0.6637209446, + 2000.0 + ], + [ + -0.7267950678, + 0.513986761, + -0.4556166579, + 2000.0 + ], + [ + -0.8535307738, + 0.5158325871, + -0.07349802909, + 2000.0 + ], + [ + -0.8578799975, + 0.1738247724, + 0.4835564687, + 2000.0 + ], + [ + -0.9799128072, + 0.1724960796, + 0.1000799318, + 2000.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.06332081897, + 0.01444310468, + 0.9978887065, + 8000.0 + ], + [ + -0.07417404809, + 0.1564827949, + -0.98489154, + 8000.0 + ], + [ + -0.07409180858, + -0.08248148301, + 0.9938345983, + 8000.0 + ], + [ + -0.08880178295, + 0.08731895646, + 0.9922145147, + 8000.0 + ], + [ + 0.05085716826, + 0.1788560869, + 0.9825599466, + 8000.0 + ], + [ + 0.2048379922, + 0.1092212416, + 0.972682948, + 8000.0 + ], + [ + 0.2154325352, + -0.05118067635, + 0.9751765795, + 8000.0 + ], + [ + -0.2138596396, + 0.2139010684, + -0.9531581125, + 8000.0 + ], + [ + 0.0482117501, + 0.2505349565, + -0.9669063361, + 8000.0 + ], + [ + 0.2049114349, + 0.1863776562, + -0.9608718297, + 8000.0 + ], + [ + -0.3529281357, + -0.1188557216, + 0.9280706053, + 8000.0 + ], + [ + -0.223297512, + -0.01561593684, + 0.9746252427, + 8000.0 + ], + [ + -0.2384915225, + 0.1570689408, + 0.9583585663, + 8000.0 + ], + [ + -0.1054733643, + 0.2532084332, + 0.9616448714, + 8000.0 + ], + [ + 0.03320362423, + 0.3381202338, + 0.9405169997, + 8000.0 + ], + [ + 0.1935410102, + 0.2674794086, + 0.9439261853, + 8000.0 + ], + [ + 0.3350161077, + 0.2010768489, + 0.9205065499, + 8000.0 + ], + [ + 0.3523850069, + 0.03295309449, + 0.9352747727, + 8000.0 + ], + [ + 0.3568902721, + -0.1325617364, + 0.9246927705, + 8000.0 + ], + [ + -0.3226246533, + 0.3043923819, + -0.8962469587, + 8000.0 + ], + [ + -0.1253864024, + 0.3382875593, + -0.932652013, + 8000.0 + ], + [ + 0.02618126578, + 0.3950301729, + -0.9182949982, + 8000.0 + ], + [ + 0.1879427584, + 0.343759089, + -0.9200582635, + 8000.0 + ], + [ + 0.3389068547, + 0.2822803585, + -0.8974742019, + 8000.0 + ], + [ + 0.4806508488, + 0.2138671441, + -0.8504325994, + 8000.0 + ], + [ + -0.4906817579, + -0.05222510449, + 0.8697723558, + 8000.0 + ], + [ + -0.3638629425, + 0.04948088767, + 0.9301373021, + 8000.0 + ], + [ + -0.3758752589, + 0.2264993174, + 0.8985632137, + 8000.0 + ], + [ + -0.2501143667, + 0.3262073881, + 0.9116093152, + 8000.0 + ], + [ + -0.11469697, + 0.4144088082, + 0.902834395, + 8000.0 + ], + [ + 0.02856305646, + 0.4899053085, + 0.8713076038, + 8000.0 + ], + [ + 0.1772886584, + 0.4119213007, + 0.8938062283, + 8000.0 + ], + [ + 0.3262734121, + 0.3807595781, + 0.8651981301, + 8000.0 + ], + [ + 0.454391951, + 0.272429718, + 0.8481214557, + 8000.0 + ], + [ + 0.4809612063, + 0.1052273006, + 0.8704042355, + 8000.0 + ], + [ + 0.4913592531, + -0.06113377373, + 0.8688088087, + 8000.0 + ], + [ + -0.4703498943, + 0.2325802215, + -0.8512798702, + 8000.0 + ], + [ + -0.4284839936, + 0.3954535384, + -0.8124148978, + 8000.0 + ], + [ + -0.269230545, + 0.4444057824, + -0.8544111506, + 8000.0 + ], + [ + -0.12290081, + 0.4872007472, + -0.8645986484, + 8000.0 + ], + [ + 0.02310278889, + 0.5349069715, + -0.8445950468, + 8000.0 + ], + [ + 0.1738345832, + 0.4919811729, + -0.8530744769, + 8000.0 + ], + [ + 0.3204745421, + 0.4381379528, + -0.8398399861, + 8000.0 + ], + [ + 0.4611122499, + 0.3725046699, + -0.8053668505, + 8000.0 + ], + [ + 0.6111564904, + 0.1407586621, + -0.7788932811, + 8000.0 + ], + [ + -0.6164448666, + 0.0182915636, + 0.7871855849, + 8000.0 + ], + [ + -0.491308456, + 0.1153364724, + 0.8633154112, + 8000.0 + ], + [ + -0.5021993072, + 0.2917622033, + 0.8140458664, + 8000.0 + ], + [ + -0.3822782783, + 0.3934250602, + 0.8361100645, + 8000.0 + ], + [ + -0.2521442149, + 0.4854616575, + 0.8371082809, + 8000.0 + ], + [ + -0.1129679822, + 0.5642476573, + 0.8178403366, + 8000.0 + ], + [ + 0.03941977651, + 0.6247156598, + 0.77985667, + 8000.0 + ], + [ + 0.185218657, + 0.5425577119, + 0.8193443588, + 8000.0 + ], + [ + 0.3310889531, + 0.5432284415, + 0.7715458285, + 8000.0 + ], + [ + 0.4491133268, + 0.436742144, + 0.7794571954, + 8000.0 + ], + [ + 0.5684476951, + 0.319874619, + 0.7579890804, + 8000.0 + ], + [ + 0.5980293927, + 0.1620609684, + 0.7849185232, + 8000.0 + ], + [ + 0.6149706868, + 0.0009513636549, + 0.7885493956, + 8000.0 + ], + [ + -0.6024246598, + 0.1645783385, + -0.7810240071, + 8000.0 + ], + [ + -0.5704450247, + 0.3264348418, + -0.7536794862, + 8000.0 + ], + [ + -0.5144035982, + 0.482909799, + -0.7086515816, + 8000.0 + ], + [ + -0.3644130073, + 0.5444430013, + -0.7555031294, + 8000.0 + ], + [ + -0.2130411425, + 0.5955142482, + -0.7745813397, + 8000.0 + ], + [ + -0.06001856711, + 0.641344364, + -0.7649020711, + 8000.0 + ], + [ + 0.1167986839, + 0.6382102822, + -0.7609505261, + 8000.0 + ], + [ + 0.2708287664, + 0.5908007885, + -0.7600040839, + 8000.0 + ], + [ + 0.419013, + 0.5286408254, + -0.7382187911, + 8000.0 + ], + [ + 0.5569609966, + 0.455047383, + -0.6947850945, + 8000.0 + ], + [ + 0.5948040245, + 0.3000380191, + -0.7457783582, + 8000.0 + ], + [ + -0.7280700238, + -0.04582590336, + 0.6839693173, + 8000.0 + ], + [ + -0.7176359257, + 0.1226390699, + 0.6855350733, + 8000.0 + ], + [ + -0.6066098645, + 0.1800032163, + 0.7743534816, + 8000.0 + ], + [ + -0.6428185047, + 0.3099967155, + 0.7004901187, + 8000.0 + ], + [ + -0.5237393276, + 0.4318488107, + 0.734304924, + 8000.0 + ], + [ + -0.3942280895, + 0.5347683254, + 0.7474001951, + 8000.0 + ], + [ + -0.2555117198, + 0.6226413207, + 0.7396158102, + 8000.0 + ], + [ + -0.1057790974, + 0.6926381847, + 0.7134865995, + 8000.0 + ], + [ + 0.05300474118, + 0.7396424228, + 0.6709095198, + 8000.0 + ], + [ + 0.1994248317, + 0.6638078249, + 0.7208251578, + 8000.0 + ], + [ + 0.340485266, + 0.6823473806, + 0.6468939911, + 8000.0 + ], + [ + 0.4578772784, + 0.5831494363, + 0.6710328851, + 8000.0 + ], + [ + 0.5690836021, + 0.4758604012, + 0.6705972952, + 8000.0 + ], + [ + 0.6721958221, + 0.3592127516, + 0.6473939881, + 8000.0 + ], + [ + 0.7062910286, + 0.2092882899, + 0.6762776018, + 8000.0 + ], + [ + 0.7257541526, + 0.05640646761, + 0.6856378201, + 8000.0 + ], + [ + 0.7232268738, + -0.1017622955, + 0.6830719759, + 8000.0 + ], + [ + -0.6977125493, + 0.2592782172, + -0.667811354, + 8000.0 + ], + [ + -0.6522665461, + 0.4117082555, + -0.6364311944, + 8000.0 + ], + [ + -0.5849001722, + 0.5583872161, + -0.5882988233, + 8000.0 + ], + [ + -0.4432526, + 0.6299118936, + -0.6377602519, + 8000.0 + ], + [ + -0.2937871727, + 0.6865539754, + -0.6650809996, + 8000.0 + ], + [ + -0.1386295555, + 0.7340533923, + -0.6647912933, + 8000.0 + ], + [ + 0.03313822298, + 0.7447047783, + -0.666570815, + 8000.0 + ], + [ + 0.2045279417, + 0.7250875013, + -0.6575837867, + 8000.0 + ], + [ + 0.3589659154, + 0.673169997, + -0.6465180792, + 8000.0 + ], + [ + 0.5040616146, + 0.6048231825, + -0.6165312698, + 8000.0 + ], + [ + 0.6385154351, + 0.5186963987, + -0.5685526229, + 8000.0 + ], + [ + 0.6882258778, + 0.3681749577, + -0.625133859, + 8000.0 + ], + [ + 0.7161919627, + 0.2092634907, + -0.6657911565, + 8000.0 + ], + [ + 0.8199740941, + 0.1128854052, + -0.5611589528, + 8000.0 + ], + [ + -0.819885839, + 0.0476596813, + 0.5705398897, + 8000.0 + ], + [ + -0.7868730917, + 0.2093606719, + 0.5805160175, + 8000.0 + ], + [ + -0.7323024624, + 0.3510300601, + 0.5835332043, + 8000.0 + ], + [ + -0.6321236638, + 0.4683934059, + 0.617274081, + 8000.0 + ], + [ + -0.5150729771, + 0.5747325861, + 0.6359105933, + 8000.0 + ], + [ + -0.3852421309, + 0.6666535005, + 0.6380921648, + 8000.0 + ], + [ + -0.2441540138, + 0.7433702255, + 0.6227274889, + 8000.0 + ], + [ + -0.09282097362, + 0.8007161943, + 0.5918089583, + 8000.0 + ], + [ + 0.06286774212, + 0.8362776041, + 0.5446902018, + 8000.0 + ], + [ + 0.2076470152, + 0.7723939575, + 0.6002418609, + 8000.0 + ], + [ + 0.3564213436, + 0.7827111091, + 0.5102226431, + 8000.0 + ], + [ + 0.4816276925, + 0.6897290431, + 0.540655725, + 8000.0 + ], + [ + 0.5978744474, + 0.582455926, + 0.5507188388, + 8000.0 + ], + [ + 0.705565045, + 0.4624713035, + 0.5369341307, + 8000.0 + ], + [ + 0.7831973251, + 0.3020716403, + 0.5434654305, + 8000.0 + ], + [ + 0.8139604231, + 0.1426528656, + 0.5631328348, + 8000.0 + ], + [ + 0.8233406414, + -0.02018070931, + 0.5671886169, + 8000.0 + ], + [ + -0.8097333473, + 0.1790681973, + -0.558808095, + 8000.0 + ], + [ + -0.7756290022, + 0.3336803, + -0.535777107, + 8000.0 + ], + [ + -0.7201623938, + 0.4793810155, + -0.5015575425, + 8000.0 + ], + [ + -0.6443097748, + 0.6170346265, + -0.4518110045, + 8000.0 + ], + [ + -0.5105673453, + 0.6984576953, + -0.5014756562, + 8000.0 + ], + [ + -0.3675039569, + 0.7591211833, + -0.5372856509, + 8000.0 + ], + [ + -0.214162085, + 0.8088383146, + -0.5476451243, + 8000.0 + ], + [ + -0.04766454497, + 0.8314585939, + -0.5535383435, + 8000.0 + ], + [ + 0.1214588272, + 0.8271395101, + -0.5487148478, + 8000.0 + ], + [ + 0.2860192726, + 0.7947013157, + -0.5353903198, + 8000.0 + ], + [ + 0.4375195625, + 0.7372610723, + -0.5148035972, + 8000.0 + ], + [ + 0.5778323019, + 0.6602265138, + -0.4798028567, + 8000.0 + ], + [ + 0.7039755117, + 0.5681861023, + -0.4261256061, + 8000.0 + ], + [ + 0.7634896137, + 0.4272225035, + -0.4843186371, + 8000.0 + ], + [ + 0.7993196384, + 0.2725635687, + -0.535534515, + 8000.0 + ], + [ + 0.892023962, + 0.1644988813, + -0.4209909372, + 8000.0 + ], + [ + -0.9008095313, + -0.00444673563, + 0.4341916798, + 8000.0 + ], + [ + -0.8801383526, + 0.1566742573, + 0.4481179056, + 8000.0 + ], + [ + -0.833588434, + 0.3164883212, + 0.4527311181, + 8000.0 + ], + [ + -0.7476996175, + 0.4671631635, + 0.471915099, + 8000.0 + ], + [ + -0.6384525233, + 0.584977424, + 0.5001797566, + 8000.0 + ], + [ + -0.5148155306, + 0.6871896114, + 0.512577221, + 8000.0 + ], + [ + -0.3786273152, + 0.7727038682, + 0.5094802138, + 8000.0 + ], + [ + -0.2317657191, + 0.8409689541, + 0.4889334, + 8000.0 + ], + [ + -0.08325846942, + 0.8881056773, + 0.4520357654, + 8000.0 + ], + [ + 0.07276379679, + 0.9110191785, + 0.405893442, + 8000.0 + ], + [ + 0.2181698334, + 0.8595404182, + 0.4621603546, + 8000.0 + ], + [ + 0.3612681501, + 0.8604875047, + 0.359230536, + 8000.0 + ], + [ + 0.4899333344, + 0.7774544789, + 0.3943727438, + 8000.0 + ], + [ + 0.6076412517, + 0.677345114, + 0.4146995368, + 8000.0 + ], + [ + 0.7186929217, + 0.5589655307, + 0.4135674307, + 8000.0 + ], + [ + 0.8100333253, + 0.4080585691, + 0.4211106935, + 8000.0 + ], + [ + 0.8710687337, + 0.2402921623, + 0.4283677602, + 8000.0 + ], + [ + 0.8955631444, + 0.07453726985, + 0.4386466115, + 8000.0 + ], + [ + -0.8964299798, + 0.08746374523, + -0.4344690837, + 8000.0 + ], + [ + -0.8747732604, + 0.2439653071, + -0.4186319049, + 8000.0 + ], + [ + -0.8320740318, + 0.3918674458, + -0.3925464438, + 8000.0 + ], + [ + -0.7697598404, + 0.5305679724, + -0.3549188847, + 8000.0 + ], + [ + -0.6883147697, + 0.6562741874, + -0.3090743742, + 8000.0 + ], + [ + -0.5667966036, + 0.7447687085, + -0.3522231976, + 8000.0 + ], + [ + -0.4335187154, + 0.8122232692, + -0.3903266379, + 8000.0 + ], + [ + -0.2888653644, + 0.8639301371, + -0.4125306285, + 8000.0 + ], + [ + -0.1283189259, + 0.8958558073, + -0.4254134762, + 8000.0 + ], + [ + 0.03860043854, + 0.9039295961, + -0.4259357833, + 8000.0 + ], + [ + 0.2045540783, + 0.8861204638, + -0.4158703557, + 8000.0 + ], + [ + 0.3629923696, + 0.8423047515, + -0.398446038, + 8000.0 + ], + [ + 0.5091712898, + 0.7772611108, + -0.36960758, + 8000.0 + ], + [ + 0.6381868495, + 0.6971635412, + -0.3266198737, + 8000.0 + ], + [ + 0.752372513, + 0.5994685683, + -0.2730806426, + 8000.0 + ], + [ + 0.8169817446, + 0.472667973, + -0.3303419686, + 8000.0 + ], + [ + 0.8617377132, + 0.3209212823, + -0.3929601052, + 8000.0 + ], + [ + 0.9375595419, + 0.2179446082, + -0.2710761023, + 8000.0 + ], + [ + 0.9555966918, + 0.05702525674, + -0.2891073895, + 8000.0 + ], + [ + -0.9471304776, + 0.1049414681, + 0.3032014953, + 8000.0 + ], + [ + -0.9105876731, + 0.2658216855, + 0.3164947411, + 8000.0 + ], + [ + -0.840558662, + 0.4272505338, + 0.3330437166, + 8000.0 + ], + [ + -0.7427197603, + 0.570761042, + 0.3501416721, + 8000.0 + ], + [ + -0.6268012665, + 0.6855815813, + 0.3702675622, + 8000.0 + ], + [ + -0.496135299, + 0.7826243854, + 0.3759638766, + 8000.0 + ], + [ + -0.3557236392, + 0.8602266998, + 0.3653364442, + 8000.0 + ], + [ + -0.2135046737, + 0.9174750369, + 0.3356416407, + 8000.0 + ], + [ + -0.06818893746, + 0.9523916699, + 0.2971537916, + 8000.0 + ], + [ + 0.08411369757, + 0.9628881513, + 0.2564591469, + 8000.0 + ], + [ + 0.2274177456, + 0.9236773123, + 0.3083851355, + 8000.0 + ], + [ + 0.3321697904, + 0.9249732567, + 0.1846285586, + 8000.0 + ], + [ + 0.4665459188, + 0.8537404989, + 0.2312186545, + 8000.0 + ], + [ + 0.5949481397, + 0.7602384547, + 0.2609103353, + 8000.0 + ], + [ + 0.7094965346, + 0.647689679, + 0.2776918203, + 8000.0 + ], + [ + 0.814180146, + 0.5031101104, + 0.289811847, + 8000.0 + ], + [ + 0.8929068524, + 0.3382074937, + 0.2972087551, + 8000.0 + ], + [ + 0.9392646018, + 0.1633776009, + 0.3018108137, + 8000.0 + ], + [ + 0.9545904645, + -0.003861267585, + 0.2978961826, + 8000.0 + ], + [ + -0.9440986455, + 0.1658584334, + -0.2849012595, + 8000.0 + ], + [ + -0.9101178014, + 0.3214264192, + -0.2614778091, + 8000.0 + ], + [ + -0.8531759641, + 0.4692083556, + -0.2278909683, + 8000.0 + ], + [ + -0.7721725819, + 0.607244662, + -0.1870920209, + 8000.0 + ], + [ + -0.645807238, + 0.7412639773, + -0.1829227356, + 8000.0 + ], + [ + -0.513860755, + 0.8291838007, + -0.2200030663, + 8000.0 + ], + [ + -0.3742727226, + 0.8916918008, + -0.2545695612, + 8000.0 + ], + [ + -0.2199564893, + 0.9341170799, + -0.2811484019, + 8000.0 + ], + [ + -0.1488791261, + 0.9779519823, + -0.1464408619, + 8000.0 + ], + [ + -0.05190444702, + 0.9554263089, + -0.290631204, + 8000.0 + ], + [ + 0.1182897011, + 0.9511485388, + -0.2851736378, + 8000.0 + ], + [ + 0.2851026621, + 0.9194528994, + -0.2707819008, + 8000.0 + ], + [ + 0.4423647384, + 0.8630716032, + -0.2437639146, + 8000.0 + ], + [ + 0.5813417681, + 0.7883521096, + -0.201352179, + 8000.0 + ], + [ + 0.7055825937, + 0.6916730098, + -0.1540832602, + 8000.0 + ], + [ + 0.8226685514, + 0.5496269159, + -0.1453502938, + 8000.0 + ], + [ + 0.894613166, + 0.3765378384, + -0.2405962167, + 8000.0 + ], + [ + 0.956140104, + 0.2694377303, + -0.1148886898, + 8000.0 + ], + [ + 0.9845220492, + 0.1117963671, + -0.1349737267, + 8000.0 + ], + [ + -0.9872926918, + 0.05066637614, + 0.15061892, + 8000.0 + ], + [ + -0.9629710484, + 0.2107304325, + 0.1681649333, + 8000.0 + ], + [ + -0.9089156, + 0.3704065174, + 0.1914978953, + 8000.0 + ], + [ + -0.8246628192, + 0.5260661652, + 0.2078115119, + 8000.0 + ], + [ + -0.7143233921, + 0.6634391927, + 0.2226893107, + 8000.0 + ], + [ + -0.5868388963, + 0.7754107475, + 0.2331486274, + 8000.0 + ], + [ + -0.447517209, + 0.8646691738, + 0.2282007178, + 8000.0 + ], + [ + -0.3052100428, + 0.9312358401, + 0.19911464, + 8000.0 + ], + [ + -0.156882597, + 0.9745527475, + 0.1601086914, + 8000.0 + ], + [ + 0.0012529542, + 0.992147907, + 0.1250638269, + 8000.0 + ], + [ + 0.103493427, + 0.9945772314, + -0.01025871795, + 8000.0 + ], + [ + 0.1833466381, + 0.9737792427, + 0.1346773801, + 8000.0 + ], + [ + 0.2771711523, + 0.9607764896, + 0.009202679436, + 8000.0 + ], + [ + 0.4256892524, + 0.9032464531, + 0.05417107545, + 8000.0 + ], + [ + 0.5595333971, + 0.8226806043, + 0.1005932442, + 8000.0 + ], + [ + 0.6865561464, + 0.7165393857, + 0.1233368017, + 8000.0 + ], + [ + 0.7933340115, + 0.5898145858, + 0.1507975484, + 8000.0 + ], + [ + 0.8870805306, + 0.431028964, + 0.165233666, + 8000.0 + ], + [ + 0.9515182668, + 0.2557980704, + 0.1708225252, + 8000.0 + ], + [ + 0.9834626085, + 0.08625805841, + 0.1592508873, + 8000.0 + ], + [ + -0.9859385825, + 0.07900435081, + -0.1472529258, + 8000.0 + ], + [ + -0.9621451618, + 0.2409599237, + -0.1273381437, + 8000.0 + ], + [ + -0.9131052483, + 0.3957468441, + -0.09809811843, + 8000.0 + ], + [ + -0.8384106194, + 0.5414064462, + -0.06282271332, + 8000.0 + ], + [ + -0.7256598187, + 0.6861416117, + -0.05125930337, + 8000.0 + ], + [ + -0.5902093395, + 0.8056551284, + -0.05072227971, + 8000.0 + ], + [ + -0.4530853873, + 0.8877269874, + -0.08157467544, + 8000.0 + ], + [ + -0.3071214675, + 0.9442886333, + -0.1183020761, + 8000.0 + ], + [ + -0.2348733933, + 0.9718218262, + 0.01992052207, + 8000.0 + ], + [ + -0.07369321841, + 0.9972231773, + -0.01073518634, + 8000.0 + ], + [ + 0.02545736524, + 0.9880834471, + -0.1517992892, + 8000.0 + ], + [ + 0.1990285953, + 0.9696963233, + -0.1416921266, + 8000.0 + ], + [ + 0.3651382256, + 0.9234293502, + -0.1181199028, + 8000.0 + ], + [ + 0.5105772936, + 0.8565718699, + -0.07480280104, + 8000.0 + ], + [ + 0.6408011166, + 0.7670788095, + -0.03104881642, + 8000.0 + ], + [ + 0.7651513262, + 0.6437562058, + -0.01101796353, + 8000.0 + ], + [ + 0.8577863249, + 0.5134139191, + 0.02467323426, + 8000.0 + ], + [ + 0.9007738794, + 0.4232833333, + -0.09714750669, + 8000.0 + ], + [ + 0.9384675954, + 0.3433556976, + 0.03722146364, + 8000.0 + ], + [ + 0.9837385072, + 0.1782771958, + 0.02181263184, + 8000.0 + ], + [ + 0.9998989022, + 0.01354134724, + 0.004337901547, + 8000.0 + ], + [ + -0.9887006469, + 0.1494578566, + 0.01154902032, + 8000.0 + ], + [ + -0.9499255232, + 0.3104793482, + 0.03527144325, + 8000.0 + ], + [ + -0.8837898775, + 0.4634960663, + 0.06392846706, + 8000.0 + ], + [ + -0.7843304257, + 0.6155660518, + 0.07683891774, + 8000.0 + ], + [ + -0.6610135002, + 0.745246834, + 0.08756888122, + 8000.0 + ], + [ + -0.5225877151, + 0.8481793297, + 0.08656734195, + 8000.0 + ], + [ + -0.3816685677, + 0.9224450057, + 0.05851765547, + 8000.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "mrtrix_version": "3.0.1-24-g62bb3c69", + "prior_pe_scheme": [ + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + 1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ] + ] +} diff --git a/tests/data/hifi/hifi_splenium_4vox no_sidecar.nii b/tests/data/hifi/hifi_splenium_4vox_no_bval.nii similarity index 100% rename from tests/data/hifi/hifi_splenium_4vox no_sidecar.nii rename to tests/data/hifi/hifi_splenium_4vox_no_bval.nii diff --git a/tests/data/hifi/hifi_splenium_4vox_no_bvec.bval b/tests/data/hifi/hifi_splenium_4vox_no_bvec.bval new file mode 100644 index 0000000..8f84e81 --- /dev/null +++ b/tests/data/hifi/hifi_splenium_4vox_no_bvec.bval @@ -0,0 +1 @@ +0 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 0 0 0 0 0 0 0 0 0 0 0 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 8000 0 0 0 0 0 0 0 0 0 diff --git a/tests/data/hifi/hifi_splenium_4vox_no_bvec.json b/tests/data/hifi/hifi_splenium_4vox_no_bvec.json new file mode 100644 index 0000000..08d5f22 --- /dev/null +++ b/tests/data/hifi/hifi_splenium_4vox_no_bvec.json @@ -0,0 +1,4140 @@ +{ + "AcquisitionMatrixPE": 74, + "AcquisitionNumber": 1, + "AcquisitionTime": "variable", + "BandwidthPerPixelPhaseEncode": 36.5229988, + "BaseResolution": 74, + "BodyPartExamined": "BRAIN", + "ConsistencyInfo": "N4_VE11C_LATEST_20160120", + "ConversionSoftware": "dcm2niix", + "ConversionSoftwareVersion": "v1.0.20190902", + "DerivedVendorReportedEchoSpacing": 0.000739999989, + "DeviceSerialNumber": 167021, + "DiffusionScheme": "Monopolar", + "DwellTime": 4.39999985e-06, + "EchoTime": 0.0989999995, + "EchoTrainLength": 37, + "EffectiveEchoSpacing": 0.000369999994, + "FlipAngle": 90, + "ImageOrientationPatientDICOM": [ + 0.994345, + -0.0163522, + -0.104929, + 2.73897e-08, + 0.988074, + -0.153983 + ], + "ImageType": "variable", + "ImagingFrequency": 123.230003, + "InPlanePhaseEncodingDirectionDICOM": "COL", + "InstitutionAddress": "XXXXX", + "InstitutionName": "XXXXX", + "InstitutionalDepartmentName": "XXXXX", + "MRAcquisitionType": "2D", + "MagneticFieldStrength": 3, + "Manufacturer": "Siemens", + "ManufacturersModelName": "Prisma_fit", + "Modality": "MR", + "ParallelReductionFactorInPlane": 2, + "PartialFourier": 1, + "PatientPosition": "HFS", + "PercentPhaseFOV": 100, + "PhaseEncodingSteps": 74, + "PhaseResolution": 1, + "PixelBandwidth": 1535, + "ProcedureStepDescription": "XXXXX", + "ProtocolName": "variable", + "PulseSequenceDetails": "%SiemensSeq%_ep2d_diff", + "ReceiveCoilActiveElements": "HEA;HEP", + "ReceiveCoilName": "Head_32", + "ReconMatrixPE": 74, + "RefLinesPE": 24, + "RepetitionTime": 3.9000001, + "SAR": "variable", + "ScanOptions": "FS", + "ScanningSequence": "EP", + "SequenceName": "_ep_b0", + "SequenceVariant": "SK_SP", + "SeriesDescription": "variable", + "SeriesNumber": "variable", + "ShimSetting": [ + 3695, + -10046, + 2626, + 292, + 83, + -279, + -134, + 102 + ], + "SliceThickness": 3, + "SoftwareVersions": "syngo_MR_E11", + "SpacingBetweenSlices": 3, + "StationName": "MRC35104", + "TxRefAmp": 222.089005, + "command_history": [ + "variable", + "mrcat -axis 3 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi0.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi1.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi2.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif (version=3.0.1-24-g62bb3c69)", + "dwidenoise -noise /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/noisemap.nii -extent '5,5,5' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/1_dwi_denoised.mif (version=3.0.1-24-g62bb3c69)", + "mrdegibbs /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/2_dwi_degibbs.mif (version=3.0.1-24-g62bb3c69)", + "/usr/local/mrtrix3/bin/dwifslpreproc -se_epi /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/B0_EPI.mif -eddy_options '--repol --data_is_shelled' -rpe_header -eddyqc_all /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/metrics_qc/eddy /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/3_dwi_undistorted.mif (version=3.0.1-24-g62bb3c69)", + "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.json -strides '1,2,3,4' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/4_dwi_smoothed.mif (version=3.0.1-24-g62bb3c69)", + "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides '1,2,3,4' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif (version=3.0.1-24-g62bb3c69)" + ], + "comments": [ + "TE=99;Time=104142.333;phase=1;mb=2", + "TE=99;Time=104634.188;phase=0;mb=2", + "TE=99;Time=102301.625;phase=1;mb=2", + "TE=99;Time=104142", + "TE=99;Time=104142" + ], + "dw_scheme": [ + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.2041193387, + 0.5137031909, + -0.833333263, + 1000.0 + ], + [ + -0.1977141975, + 0.5146343525, + -0.8343024508, + 1000.0 + ], + [ + -0.3999621792, + 0.1718072214, + -0.900284696, + 1000.0 + ], + [ + 0.4037001972, + 0.7264234052, + -0.5561790963, + 1000.0 + ], + [ + 0.2032804557, + 0.9391539284, + -0.2768879831, + 1000.0 + ], + [ + 0.8546867084, + 0.5149137883, + -0.06613940621, + 1000.0 + ], + [ + 0.7310855427, + 0.5144020839, + -0.4482236331, + 1000.0 + ], + [ + 0.4058203992, + 0.1702779517, + -0.8979505681, + 1000.0 + ], + [ + 0.7299824555, + 0.1701815673, + -0.6619394601, + 1000.0 + ], + [ + 0.6526334818, + 0.7283765637, + 0.2086555051, + 1000.0 + ], + [ + 0.3244365682, + 0.9401997848, + 0.1037558568, + 1000.0 + ], + [ + 0.3253184522, + 0.5170243383, + 0.791740954, + 1000.0 + ], + [ + 0.6514813496, + 0.5175849347, + 0.554687197, + 1000.0 + ], + [ + 0.9790823445, + 0.1727878311, + 0.1074342964, + 1000.0 + ], + [ + 0.8540502963, + 0.1734394521, + 0.4904251705, + 1000.0 + ], + [ + -0.002259620983, + 0.7302636963, + 0.6831616412, + 1000.0 + ], + [ + -0.002591339745, + 0.9415239344, + 0.3369361451, + 1000.0 + ], + [ + -0.6554853118, + 0.5169442435, + 0.5505521367, + 1000.0 + ], + [ + -0.3308567768, + 0.5183798452, + 0.7885531874, + 1000.0 + ], + [ + 0.1972617938, + 0.1747377061, + 0.9646525378, + 1000.0 + ], + [ + -0.2056872366, + 0.1740635009, + 0.963013322, + 1000.0 + ], + [ + -0.6527536174, + 0.7289013255, + 0.2064353957, + 1000.0 + ], + [ + -0.3254198893, + 0.9404517877, + 0.09824627548, + 1000.0 + ], + [ + -0.1993994297, + 0.9378278089, + -0.2841106622, + 1000.0 + ], + [ + -0.402190306, + 0.7259439266, + -0.5578963821, + 1000.0 + ], + [ + -0.7282749406, + 0.170845989, + -0.6636469384, + 1000.0 + ], + [ + -0.7269286759, + 0.5136962899, + -0.455731085, + 1000.0 + ], + [ + -0.8535207681, + 0.5157749553, + -0.07401684809, + 1000.0 + ], + [ + -0.8581097023, + 0.1742568347, + 0.4829930584, + 1000.0 + ], + [ + -0.9798602664, + 0.1731730579, + 0.09942308757, + 1000.0 + ], + [ + 0.204978745, + 0.5120461773, + -0.8341417304, + 2000.0 + ], + [ + -0.1965293814, + 0.5127992738, + -0.8357111385, + 2000.0 + ], + [ + -0.3998713053, + 0.1699687211, + -0.9006739549, + 2000.0 + ], + [ + 0.4048534043, + 0.7250704832, + -0.5571054796, + 2000.0 + ], + [ + 0.2036165985, + 0.9386839084, + -0.2782315599, + 2000.0 + ], + [ + 0.8549558168, + 0.5145177471, + -0.06574221798, + 2000.0 + ], + [ + 0.7315589065, + 0.5138347744, + -0.4481019872, + 2000.0 + ], + [ + 0.4072249602, + 0.1696576375, + -0.8974319572, + 2000.0 + ], + [ + 0.7309258671, + 0.1700521269, + -0.6609308972, + 2000.0 + ], + [ + 0.6524868782, + 0.7278674133, + 0.2108788811, + 2000.0 + ], + [ + 0.3242097053, + 0.9401930644, + 0.1045230534, + 2000.0 + ], + [ + 0.3238402283, + 0.5170630515, + 0.7923214671, + 2000.0 + ], + [ + 0.6502088878, + 0.516892536, + 0.5568217924, + 2000.0 + ], + [ + 0.9790345074, + 0.1722952772, + 0.1086543635, + 2000.0 + ], + [ + 0.8532894718, + 0.1731874673, + 0.4918365364, + 2000.0 + ], + [ + -0.001974410286, + 0.7298582035, + 0.6835957171, + 2000.0 + ], + [ + -0.00310387162, + 0.9412377457, + 0.3377304724, + 2000.0 + ], + [ + -0.655638689, + 0.5168712665, + 0.5504380105, + 2000.0 + ], + [ + -0.331102832, + 0.5175902144, + 0.788968494, + 2000.0 + ], + [ + 0.1965814308, + 0.1742203798, + 0.9648849674, + 2000.0 + ], + [ + -0.2059179905, + 0.1740199847, + 0.9629718719, + 2000.0 + ], + [ + -0.6533703702, + 0.7283237759, + 0.2065227271, + 2000.0 + ], + [ + -0.3258404176, + 0.9402721635, + 0.09857119676, + 2000.0 + ], + [ + -0.1997946014, + 0.9376822071, + -0.2843135519, + 2000.0 + ], + [ + -0.4019648303, + 0.7255111928, + -0.5586213246, + 2000.0 + ], + [ + -0.7282631119, + 0.1706087558, + -0.6637209446, + 2000.0 + ], + [ + -0.7267950678, + 0.513986761, + -0.4556166579, + 2000.0 + ], + [ + -0.8535307738, + 0.5158325871, + -0.07349802909, + 2000.0 + ], + [ + -0.8578799975, + 0.1738247724, + 0.4835564687, + 2000.0 + ], + [ + -0.9799128072, + 0.1724960796, + 0.1000799318, + 2000.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.06332081897, + 0.01444310468, + 0.9978887065, + 8000.0 + ], + [ + -0.07417404809, + 0.1564827949, + -0.98489154, + 8000.0 + ], + [ + -0.07409180858, + -0.08248148301, + 0.9938345983, + 8000.0 + ], + [ + -0.08880178295, + 0.08731895646, + 0.9922145147, + 8000.0 + ], + [ + 0.05085716826, + 0.1788560869, + 0.9825599466, + 8000.0 + ], + [ + 0.2048379922, + 0.1092212416, + 0.972682948, + 8000.0 + ], + [ + 0.2154325352, + -0.05118067635, + 0.9751765795, + 8000.0 + ], + [ + -0.2138596396, + 0.2139010684, + -0.9531581125, + 8000.0 + ], + [ + 0.0482117501, + 0.2505349565, + -0.9669063361, + 8000.0 + ], + [ + 0.2049114349, + 0.1863776562, + -0.9608718297, + 8000.0 + ], + [ + -0.3529281357, + -0.1188557216, + 0.9280706053, + 8000.0 + ], + [ + -0.223297512, + -0.01561593684, + 0.9746252427, + 8000.0 + ], + [ + -0.2384915225, + 0.1570689408, + 0.9583585663, + 8000.0 + ], + [ + -0.1054733643, + 0.2532084332, + 0.9616448714, + 8000.0 + ], + [ + 0.03320362423, + 0.3381202338, + 0.9405169997, + 8000.0 + ], + [ + 0.1935410102, + 0.2674794086, + 0.9439261853, + 8000.0 + ], + [ + 0.3350161077, + 0.2010768489, + 0.9205065499, + 8000.0 + ], + [ + 0.3523850069, + 0.03295309449, + 0.9352747727, + 8000.0 + ], + [ + 0.3568902721, + -0.1325617364, + 0.9246927705, + 8000.0 + ], + [ + -0.3226246533, + 0.3043923819, + -0.8962469587, + 8000.0 + ], + [ + -0.1253864024, + 0.3382875593, + -0.932652013, + 8000.0 + ], + [ + 0.02618126578, + 0.3950301729, + -0.9182949982, + 8000.0 + ], + [ + 0.1879427584, + 0.343759089, + -0.9200582635, + 8000.0 + ], + [ + 0.3389068547, + 0.2822803585, + -0.8974742019, + 8000.0 + ], + [ + 0.4806508488, + 0.2138671441, + -0.8504325994, + 8000.0 + ], + [ + -0.4906817579, + -0.05222510449, + 0.8697723558, + 8000.0 + ], + [ + -0.3638629425, + 0.04948088767, + 0.9301373021, + 8000.0 + ], + [ + -0.3758752589, + 0.2264993174, + 0.8985632137, + 8000.0 + ], + [ + -0.2501143667, + 0.3262073881, + 0.9116093152, + 8000.0 + ], + [ + -0.11469697, + 0.4144088082, + 0.902834395, + 8000.0 + ], + [ + 0.02856305646, + 0.4899053085, + 0.8713076038, + 8000.0 + ], + [ + 0.1772886584, + 0.4119213007, + 0.8938062283, + 8000.0 + ], + [ + 0.3262734121, + 0.3807595781, + 0.8651981301, + 8000.0 + ], + [ + 0.454391951, + 0.272429718, + 0.8481214557, + 8000.0 + ], + [ + 0.4809612063, + 0.1052273006, + 0.8704042355, + 8000.0 + ], + [ + 0.4913592531, + -0.06113377373, + 0.8688088087, + 8000.0 + ], + [ + -0.4703498943, + 0.2325802215, + -0.8512798702, + 8000.0 + ], + [ + -0.4284839936, + 0.3954535384, + -0.8124148978, + 8000.0 + ], + [ + -0.269230545, + 0.4444057824, + -0.8544111506, + 8000.0 + ], + [ + -0.12290081, + 0.4872007472, + -0.8645986484, + 8000.0 + ], + [ + 0.02310278889, + 0.5349069715, + -0.8445950468, + 8000.0 + ], + [ + 0.1738345832, + 0.4919811729, + -0.8530744769, + 8000.0 + ], + [ + 0.3204745421, + 0.4381379528, + -0.8398399861, + 8000.0 + ], + [ + 0.4611122499, + 0.3725046699, + -0.8053668505, + 8000.0 + ], + [ + 0.6111564904, + 0.1407586621, + -0.7788932811, + 8000.0 + ], + [ + -0.6164448666, + 0.0182915636, + 0.7871855849, + 8000.0 + ], + [ + -0.491308456, + 0.1153364724, + 0.8633154112, + 8000.0 + ], + [ + -0.5021993072, + 0.2917622033, + 0.8140458664, + 8000.0 + ], + [ + -0.3822782783, + 0.3934250602, + 0.8361100645, + 8000.0 + ], + [ + -0.2521442149, + 0.4854616575, + 0.8371082809, + 8000.0 + ], + [ + -0.1129679822, + 0.5642476573, + 0.8178403366, + 8000.0 + ], + [ + 0.03941977651, + 0.6247156598, + 0.77985667, + 8000.0 + ], + [ + 0.185218657, + 0.5425577119, + 0.8193443588, + 8000.0 + ], + [ + 0.3310889531, + 0.5432284415, + 0.7715458285, + 8000.0 + ], + [ + 0.4491133268, + 0.436742144, + 0.7794571954, + 8000.0 + ], + [ + 0.5684476951, + 0.319874619, + 0.7579890804, + 8000.0 + ], + [ + 0.5980293927, + 0.1620609684, + 0.7849185232, + 8000.0 + ], + [ + 0.6149706868, + 0.0009513636549, + 0.7885493956, + 8000.0 + ], + [ + -0.6024246598, + 0.1645783385, + -0.7810240071, + 8000.0 + ], + [ + -0.5704450247, + 0.3264348418, + -0.7536794862, + 8000.0 + ], + [ + -0.5144035982, + 0.482909799, + -0.7086515816, + 8000.0 + ], + [ + -0.3644130073, + 0.5444430013, + -0.7555031294, + 8000.0 + ], + [ + -0.2130411425, + 0.5955142482, + -0.7745813397, + 8000.0 + ], + [ + -0.06001856711, + 0.641344364, + -0.7649020711, + 8000.0 + ], + [ + 0.1167986839, + 0.6382102822, + -0.7609505261, + 8000.0 + ], + [ + 0.2708287664, + 0.5908007885, + -0.7600040839, + 8000.0 + ], + [ + 0.419013, + 0.5286408254, + -0.7382187911, + 8000.0 + ], + [ + 0.5569609966, + 0.455047383, + -0.6947850945, + 8000.0 + ], + [ + 0.5948040245, + 0.3000380191, + -0.7457783582, + 8000.0 + ], + [ + -0.7280700238, + -0.04582590336, + 0.6839693173, + 8000.0 + ], + [ + -0.7176359257, + 0.1226390699, + 0.6855350733, + 8000.0 + ], + [ + -0.6066098645, + 0.1800032163, + 0.7743534816, + 8000.0 + ], + [ + -0.6428185047, + 0.3099967155, + 0.7004901187, + 8000.0 + ], + [ + -0.5237393276, + 0.4318488107, + 0.734304924, + 8000.0 + ], + [ + -0.3942280895, + 0.5347683254, + 0.7474001951, + 8000.0 + ], + [ + -0.2555117198, + 0.6226413207, + 0.7396158102, + 8000.0 + ], + [ + -0.1057790974, + 0.6926381847, + 0.7134865995, + 8000.0 + ], + [ + 0.05300474118, + 0.7396424228, + 0.6709095198, + 8000.0 + ], + [ + 0.1994248317, + 0.6638078249, + 0.7208251578, + 8000.0 + ], + [ + 0.340485266, + 0.6823473806, + 0.6468939911, + 8000.0 + ], + [ + 0.4578772784, + 0.5831494363, + 0.6710328851, + 8000.0 + ], + [ + 0.5690836021, + 0.4758604012, + 0.6705972952, + 8000.0 + ], + [ + 0.6721958221, + 0.3592127516, + 0.6473939881, + 8000.0 + ], + [ + 0.7062910286, + 0.2092882899, + 0.6762776018, + 8000.0 + ], + [ + 0.7257541526, + 0.05640646761, + 0.6856378201, + 8000.0 + ], + [ + 0.7232268738, + -0.1017622955, + 0.6830719759, + 8000.0 + ], + [ + -0.6977125493, + 0.2592782172, + -0.667811354, + 8000.0 + ], + [ + -0.6522665461, + 0.4117082555, + -0.6364311944, + 8000.0 + ], + [ + -0.5849001722, + 0.5583872161, + -0.5882988233, + 8000.0 + ], + [ + -0.4432526, + 0.6299118936, + -0.6377602519, + 8000.0 + ], + [ + -0.2937871727, + 0.6865539754, + -0.6650809996, + 8000.0 + ], + [ + -0.1386295555, + 0.7340533923, + -0.6647912933, + 8000.0 + ], + [ + 0.03313822298, + 0.7447047783, + -0.666570815, + 8000.0 + ], + [ + 0.2045279417, + 0.7250875013, + -0.6575837867, + 8000.0 + ], + [ + 0.3589659154, + 0.673169997, + -0.6465180792, + 8000.0 + ], + [ + 0.5040616146, + 0.6048231825, + -0.6165312698, + 8000.0 + ], + [ + 0.6385154351, + 0.5186963987, + -0.5685526229, + 8000.0 + ], + [ + 0.6882258778, + 0.3681749577, + -0.625133859, + 8000.0 + ], + [ + 0.7161919627, + 0.2092634907, + -0.6657911565, + 8000.0 + ], + [ + 0.8199740941, + 0.1128854052, + -0.5611589528, + 8000.0 + ], + [ + -0.819885839, + 0.0476596813, + 0.5705398897, + 8000.0 + ], + [ + -0.7868730917, + 0.2093606719, + 0.5805160175, + 8000.0 + ], + [ + -0.7323024624, + 0.3510300601, + 0.5835332043, + 8000.0 + ], + [ + -0.6321236638, + 0.4683934059, + 0.617274081, + 8000.0 + ], + [ + -0.5150729771, + 0.5747325861, + 0.6359105933, + 8000.0 + ], + [ + -0.3852421309, + 0.6666535005, + 0.6380921648, + 8000.0 + ], + [ + -0.2441540138, + 0.7433702255, + 0.6227274889, + 8000.0 + ], + [ + -0.09282097362, + 0.8007161943, + 0.5918089583, + 8000.0 + ], + [ + 0.06286774212, + 0.8362776041, + 0.5446902018, + 8000.0 + ], + [ + 0.2076470152, + 0.7723939575, + 0.6002418609, + 8000.0 + ], + [ + 0.3564213436, + 0.7827111091, + 0.5102226431, + 8000.0 + ], + [ + 0.4816276925, + 0.6897290431, + 0.540655725, + 8000.0 + ], + [ + 0.5978744474, + 0.582455926, + 0.5507188388, + 8000.0 + ], + [ + 0.705565045, + 0.4624713035, + 0.5369341307, + 8000.0 + ], + [ + 0.7831973251, + 0.3020716403, + 0.5434654305, + 8000.0 + ], + [ + 0.8139604231, + 0.1426528656, + 0.5631328348, + 8000.0 + ], + [ + 0.8233406414, + -0.02018070931, + 0.5671886169, + 8000.0 + ], + [ + -0.8097333473, + 0.1790681973, + -0.558808095, + 8000.0 + ], + [ + -0.7756290022, + 0.3336803, + -0.535777107, + 8000.0 + ], + [ + -0.7201623938, + 0.4793810155, + -0.5015575425, + 8000.0 + ], + [ + -0.6443097748, + 0.6170346265, + -0.4518110045, + 8000.0 + ], + [ + -0.5105673453, + 0.6984576953, + -0.5014756562, + 8000.0 + ], + [ + -0.3675039569, + 0.7591211833, + -0.5372856509, + 8000.0 + ], + [ + -0.214162085, + 0.8088383146, + -0.5476451243, + 8000.0 + ], + [ + -0.04766454497, + 0.8314585939, + -0.5535383435, + 8000.0 + ], + [ + 0.1214588272, + 0.8271395101, + -0.5487148478, + 8000.0 + ], + [ + 0.2860192726, + 0.7947013157, + -0.5353903198, + 8000.0 + ], + [ + 0.4375195625, + 0.7372610723, + -0.5148035972, + 8000.0 + ], + [ + 0.5778323019, + 0.6602265138, + -0.4798028567, + 8000.0 + ], + [ + 0.7039755117, + 0.5681861023, + -0.4261256061, + 8000.0 + ], + [ + 0.7634896137, + 0.4272225035, + -0.4843186371, + 8000.0 + ], + [ + 0.7993196384, + 0.2725635687, + -0.535534515, + 8000.0 + ], + [ + 0.892023962, + 0.1644988813, + -0.4209909372, + 8000.0 + ], + [ + -0.9008095313, + -0.00444673563, + 0.4341916798, + 8000.0 + ], + [ + -0.8801383526, + 0.1566742573, + 0.4481179056, + 8000.0 + ], + [ + -0.833588434, + 0.3164883212, + 0.4527311181, + 8000.0 + ], + [ + -0.7476996175, + 0.4671631635, + 0.471915099, + 8000.0 + ], + [ + -0.6384525233, + 0.584977424, + 0.5001797566, + 8000.0 + ], + [ + -0.5148155306, + 0.6871896114, + 0.512577221, + 8000.0 + ], + [ + -0.3786273152, + 0.7727038682, + 0.5094802138, + 8000.0 + ], + [ + -0.2317657191, + 0.8409689541, + 0.4889334, + 8000.0 + ], + [ + -0.08325846942, + 0.8881056773, + 0.4520357654, + 8000.0 + ], + [ + 0.07276379679, + 0.9110191785, + 0.405893442, + 8000.0 + ], + [ + 0.2181698334, + 0.8595404182, + 0.4621603546, + 8000.0 + ], + [ + 0.3612681501, + 0.8604875047, + 0.359230536, + 8000.0 + ], + [ + 0.4899333344, + 0.7774544789, + 0.3943727438, + 8000.0 + ], + [ + 0.6076412517, + 0.677345114, + 0.4146995368, + 8000.0 + ], + [ + 0.7186929217, + 0.5589655307, + 0.4135674307, + 8000.0 + ], + [ + 0.8100333253, + 0.4080585691, + 0.4211106935, + 8000.0 + ], + [ + 0.8710687337, + 0.2402921623, + 0.4283677602, + 8000.0 + ], + [ + 0.8955631444, + 0.07453726985, + 0.4386466115, + 8000.0 + ], + [ + -0.8964299798, + 0.08746374523, + -0.4344690837, + 8000.0 + ], + [ + -0.8747732604, + 0.2439653071, + -0.4186319049, + 8000.0 + ], + [ + -0.8320740318, + 0.3918674458, + -0.3925464438, + 8000.0 + ], + [ + -0.7697598404, + 0.5305679724, + -0.3549188847, + 8000.0 + ], + [ + -0.6883147697, + 0.6562741874, + -0.3090743742, + 8000.0 + ], + [ + -0.5667966036, + 0.7447687085, + -0.3522231976, + 8000.0 + ], + [ + -0.4335187154, + 0.8122232692, + -0.3903266379, + 8000.0 + ], + [ + -0.2888653644, + 0.8639301371, + -0.4125306285, + 8000.0 + ], + [ + -0.1283189259, + 0.8958558073, + -0.4254134762, + 8000.0 + ], + [ + 0.03860043854, + 0.9039295961, + -0.4259357833, + 8000.0 + ], + [ + 0.2045540783, + 0.8861204638, + -0.4158703557, + 8000.0 + ], + [ + 0.3629923696, + 0.8423047515, + -0.398446038, + 8000.0 + ], + [ + 0.5091712898, + 0.7772611108, + -0.36960758, + 8000.0 + ], + [ + 0.6381868495, + 0.6971635412, + -0.3266198737, + 8000.0 + ], + [ + 0.752372513, + 0.5994685683, + -0.2730806426, + 8000.0 + ], + [ + 0.8169817446, + 0.472667973, + -0.3303419686, + 8000.0 + ], + [ + 0.8617377132, + 0.3209212823, + -0.3929601052, + 8000.0 + ], + [ + 0.9375595419, + 0.2179446082, + -0.2710761023, + 8000.0 + ], + [ + 0.9555966918, + 0.05702525674, + -0.2891073895, + 8000.0 + ], + [ + -0.9471304776, + 0.1049414681, + 0.3032014953, + 8000.0 + ], + [ + -0.9105876731, + 0.2658216855, + 0.3164947411, + 8000.0 + ], + [ + -0.840558662, + 0.4272505338, + 0.3330437166, + 8000.0 + ], + [ + -0.7427197603, + 0.570761042, + 0.3501416721, + 8000.0 + ], + [ + -0.6268012665, + 0.6855815813, + 0.3702675622, + 8000.0 + ], + [ + -0.496135299, + 0.7826243854, + 0.3759638766, + 8000.0 + ], + [ + -0.3557236392, + 0.8602266998, + 0.3653364442, + 8000.0 + ], + [ + -0.2135046737, + 0.9174750369, + 0.3356416407, + 8000.0 + ], + [ + -0.06818893746, + 0.9523916699, + 0.2971537916, + 8000.0 + ], + [ + 0.08411369757, + 0.9628881513, + 0.2564591469, + 8000.0 + ], + [ + 0.2274177456, + 0.9236773123, + 0.3083851355, + 8000.0 + ], + [ + 0.3321697904, + 0.9249732567, + 0.1846285586, + 8000.0 + ], + [ + 0.4665459188, + 0.8537404989, + 0.2312186545, + 8000.0 + ], + [ + 0.5949481397, + 0.7602384547, + 0.2609103353, + 8000.0 + ], + [ + 0.7094965346, + 0.647689679, + 0.2776918203, + 8000.0 + ], + [ + 0.814180146, + 0.5031101104, + 0.289811847, + 8000.0 + ], + [ + 0.8929068524, + 0.3382074937, + 0.2972087551, + 8000.0 + ], + [ + 0.9392646018, + 0.1633776009, + 0.3018108137, + 8000.0 + ], + [ + 0.9545904645, + -0.003861267585, + 0.2978961826, + 8000.0 + ], + [ + -0.9440986455, + 0.1658584334, + -0.2849012595, + 8000.0 + ], + [ + -0.9101178014, + 0.3214264192, + -0.2614778091, + 8000.0 + ], + [ + -0.8531759641, + 0.4692083556, + -0.2278909683, + 8000.0 + ], + [ + -0.7721725819, + 0.607244662, + -0.1870920209, + 8000.0 + ], + [ + -0.645807238, + 0.7412639773, + -0.1829227356, + 8000.0 + ], + [ + -0.513860755, + 0.8291838007, + -0.2200030663, + 8000.0 + ], + [ + -0.3742727226, + 0.8916918008, + -0.2545695612, + 8000.0 + ], + [ + -0.2199564893, + 0.9341170799, + -0.2811484019, + 8000.0 + ], + [ + -0.1488791261, + 0.9779519823, + -0.1464408619, + 8000.0 + ], + [ + -0.05190444702, + 0.9554263089, + -0.290631204, + 8000.0 + ], + [ + 0.1182897011, + 0.9511485388, + -0.2851736378, + 8000.0 + ], + [ + 0.2851026621, + 0.9194528994, + -0.2707819008, + 8000.0 + ], + [ + 0.4423647384, + 0.8630716032, + -0.2437639146, + 8000.0 + ], + [ + 0.5813417681, + 0.7883521096, + -0.201352179, + 8000.0 + ], + [ + 0.7055825937, + 0.6916730098, + -0.1540832602, + 8000.0 + ], + [ + 0.8226685514, + 0.5496269159, + -0.1453502938, + 8000.0 + ], + [ + 0.894613166, + 0.3765378384, + -0.2405962167, + 8000.0 + ], + [ + 0.956140104, + 0.2694377303, + -0.1148886898, + 8000.0 + ], + [ + 0.9845220492, + 0.1117963671, + -0.1349737267, + 8000.0 + ], + [ + -0.9872926918, + 0.05066637614, + 0.15061892, + 8000.0 + ], + [ + -0.9629710484, + 0.2107304325, + 0.1681649333, + 8000.0 + ], + [ + -0.9089156, + 0.3704065174, + 0.1914978953, + 8000.0 + ], + [ + -0.8246628192, + 0.5260661652, + 0.2078115119, + 8000.0 + ], + [ + -0.7143233921, + 0.6634391927, + 0.2226893107, + 8000.0 + ], + [ + -0.5868388963, + 0.7754107475, + 0.2331486274, + 8000.0 + ], + [ + -0.447517209, + 0.8646691738, + 0.2282007178, + 8000.0 + ], + [ + -0.3052100428, + 0.9312358401, + 0.19911464, + 8000.0 + ], + [ + -0.156882597, + 0.9745527475, + 0.1601086914, + 8000.0 + ], + [ + 0.0012529542, + 0.992147907, + 0.1250638269, + 8000.0 + ], + [ + 0.103493427, + 0.9945772314, + -0.01025871795, + 8000.0 + ], + [ + 0.1833466381, + 0.9737792427, + 0.1346773801, + 8000.0 + ], + [ + 0.2771711523, + 0.9607764896, + 0.009202679436, + 8000.0 + ], + [ + 0.4256892524, + 0.9032464531, + 0.05417107545, + 8000.0 + ], + [ + 0.5595333971, + 0.8226806043, + 0.1005932442, + 8000.0 + ], + [ + 0.6865561464, + 0.7165393857, + 0.1233368017, + 8000.0 + ], + [ + 0.7933340115, + 0.5898145858, + 0.1507975484, + 8000.0 + ], + [ + 0.8870805306, + 0.431028964, + 0.165233666, + 8000.0 + ], + [ + 0.9515182668, + 0.2557980704, + 0.1708225252, + 8000.0 + ], + [ + 0.9834626085, + 0.08625805841, + 0.1592508873, + 8000.0 + ], + [ + -0.9859385825, + 0.07900435081, + -0.1472529258, + 8000.0 + ], + [ + -0.9621451618, + 0.2409599237, + -0.1273381437, + 8000.0 + ], + [ + -0.9131052483, + 0.3957468441, + -0.09809811843, + 8000.0 + ], + [ + -0.8384106194, + 0.5414064462, + -0.06282271332, + 8000.0 + ], + [ + -0.7256598187, + 0.6861416117, + -0.05125930337, + 8000.0 + ], + [ + -0.5902093395, + 0.8056551284, + -0.05072227971, + 8000.0 + ], + [ + -0.4530853873, + 0.8877269874, + -0.08157467544, + 8000.0 + ], + [ + -0.3071214675, + 0.9442886333, + -0.1183020761, + 8000.0 + ], + [ + -0.2348733933, + 0.9718218262, + 0.01992052207, + 8000.0 + ], + [ + -0.07369321841, + 0.9972231773, + -0.01073518634, + 8000.0 + ], + [ + 0.02545736524, + 0.9880834471, + -0.1517992892, + 8000.0 + ], + [ + 0.1990285953, + 0.9696963233, + -0.1416921266, + 8000.0 + ], + [ + 0.3651382256, + 0.9234293502, + -0.1181199028, + 8000.0 + ], + [ + 0.5105772936, + 0.8565718699, + -0.07480280104, + 8000.0 + ], + [ + 0.6408011166, + 0.7670788095, + -0.03104881642, + 8000.0 + ], + [ + 0.7651513262, + 0.6437562058, + -0.01101796353, + 8000.0 + ], + [ + 0.8577863249, + 0.5134139191, + 0.02467323426, + 8000.0 + ], + [ + 0.9007738794, + 0.4232833333, + -0.09714750669, + 8000.0 + ], + [ + 0.9384675954, + 0.3433556976, + 0.03722146364, + 8000.0 + ], + [ + 0.9837385072, + 0.1782771958, + 0.02181263184, + 8000.0 + ], + [ + 0.9998989022, + 0.01354134724, + 0.004337901547, + 8000.0 + ], + [ + -0.9887006469, + 0.1494578566, + 0.01154902032, + 8000.0 + ], + [ + -0.9499255232, + 0.3104793482, + 0.03527144325, + 8000.0 + ], + [ + -0.8837898775, + 0.4634960663, + 0.06392846706, + 8000.0 + ], + [ + -0.7843304257, + 0.6155660518, + 0.07683891774, + 8000.0 + ], + [ + -0.6610135002, + 0.745246834, + 0.08756888122, + 8000.0 + ], + [ + -0.5225877151, + 0.8481793297, + 0.08656734195, + 8000.0 + ], + [ + -0.3816685677, + 0.9224450057, + 0.05851765547, + 8000.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ] + ], + "mrtrix_version": "3.0.1-24-g62bb3c69", + "prior_pe_scheme": [ + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + 1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ], + [ + 0.0, + -1.0, + 0.0, + 0.027 + ] + ] +} diff --git a/tests/data/hifi/hifi_splenium_4vox_no_bvec.nii b/tests/data/hifi/hifi_splenium_4vox_no_bvec.nii new file mode 100644 index 0000000000000000000000000000000000000000..047688bb1c5aff68b094b2eb74d72ca4c8880533 GIT binary patch literal 11136 zcmbVyc{JC-8!lx_L}^t@q)j2IRD9=s-Y6lZw9-neR&5e3lqE|fOO~>4sYInsiZ&sI zXc29+lR}&7`u*;?=iGbG{p-%0nKS48ymRKvXJ+2_d7l{vX{rA$*_oS8oH*HT?S_@6 zV+@SO7#T`Q(SJU>NXbZb`fs+CmX`WY{y&qdl;(d0`$R_v`d=mL*shNDe`NowWKH>> z?f)t({rR5NC8b6M-Exnrfv*0q~9PSPB!XP`G`w4u@H)#D9UtQhM!e&YY5)BlI) zKl3pD9BVpWXJKA=fcKTlgX*uhP4~D_)os)b)ejPC*p@Z+ght}E|HzY?Eb@xao05#) z$7}!5iPDXitUB;XqMK+!|Iz=yhu^3>=D#9$tCKuYDT%W>XYm_kviZ_H_Kv*Hzi*%7 zGq=yO(yzVz@{=z+uV2k77k9G*mhp-=_B>9-l_L&#vALoPulQ`qz3o=)W_(~2fT*qf+y}4UVH!iRo%iC_s@qoJFTsB0B|K^Ql z^LA-gJE_OX4f1UDQo^!*TCm4^JkNe#4!1Gd?40=yCi40`=;>VUy=N_guTzhUafA`ViGl3@DIBh}4zjNVTaZ;=qr^8A{ zzmU9Bi(hM2LEBA<7r1`F5?OVQ+Ukd1jq%71-Vfur6Ih=fi^7X1&~J$cy7veHE1yKQ zeF45ZXW&%MO>~)i3Jq1KVDL2^$T@|wfdL%3A&BjkALJntKW>h<=D)cMSg}JM`zny* z?s#+9Vqez2zmq?dx$?GH2i7QD#oZzU*-j>u`y?8&#?@YYt$84SX;5HSFFp3vRpam> zdc10HKTh!UV!!^|`9Zro`~2I;O7B+lq6Ryj``M3o*B|6VrOsTieG?ybbK%XdyZEKz z6m~g0g@3p0Vpr>J++(OeD^&)v)D<6gx_5|gtX{z;QfpX!=OJEXf0*UNhH`SzYus2i zh)X-wVEb<)Hr~*H_!Y){e1{ZYG;rlLL#MFkwsq`VI++i&EaMS=!`StP7mH7`_?GHU zo^Nl#M>ALQhC~y7VeQDrJ+*jJoEL`nBjzsj~&OBnx zX?(e?z|{q(u-dNxlV*CL&&P*Q9vp<8X3{)qYYI|=pW}3RJgOEwMBkOw_*8WlUuKk` z`>0P?VEq<#-OJJCY9%&%hC%JoZakYAf&1CMxM+3{{r8?nMs_j^lA}=DxQK@g*vda! zh%KKlC<%rw3VPAqDv=M8r$g!$THu7wh`FOu6-2S!&6UvNu&R7{%i!`@9;hB$<^LF7}m(M5} z;|Tk|HISV&5$5uRIApj8O}Fo3pPLFRDwy%!o$W|}XvFhZT!+J#fm~lJ%hq)>Ir)nk z|I62B_v^iR-(e%x%(#VZ?|&m=dVdbcH(+H?3v9GJhmSMo;>Cv?lv`-vakvjk4Rp}Q zIuzzt*U|QdQ?%gy7V^A&heCbjASvmCq5kJ6%J?ItZ0mxlTPMNY_7CZ`>cGKE4l_Q= z;Ny%Z^!e&LGSObe0ot3`7PwJ(d{H7o{+hvx9~_lE2> zYaUN)9>?}hM$B@fc+Ct4-qgvO%_bZ3&t*n@Wu^r`&7H!3{>bqE^m<^BAM64Mz1IHEKVNb~}+@q(c z8N3NyR44J=@h!N0SC_9)Jyf}{4 z!>X~kyp9=dhTj@JJ-sp*4*59bsGz^=RRIuG31p8~cW7_@k7~TGu zTp$--Vyc`(xj98~hm5M#rw2Li9F3(YUdwSgVJXPV2Cs-4VxJj1U`Vh2y_^ z!=h0RFXw)sgPX5Vc>jKgRe4FaAIoWIS}gIwG~PKcm6L9t=HfGHe5d9T9}m94qe8P- zPvboIjm+S%ey7>#%t>D3oXPz>F0s+9e3sgh&0$B+b8~1qzg?cmJ)}?b!jRMKZJnL{-&sCW zoxwLA=5Z(6n=DLnIBD$#{?we#PW{taZ)p~nb~(-7OD}OqTs~+1JIn1>=lIEnWS*Os zz>7bhVt-2Gf*F@MdU+mSx6I;+&Dq>g$J5KT4G1oXE_%%U1{XVU z!_`VpI5@sW^X0p^x$qkt(yn5;(ibe&FMyZPMTpWB@HhO2kkN%W+9t<71%J^l--Uz! zD6rDBd@MPYifw(R`J3b~u8!```k$1!-<$5NhW~#QDj{9!1NAZa#O<}=S}n>+EihDAPpMzZg^Pk z2VJY_c>LoyF4ir?s&r%Y`&3H<3`0>OVT^ec1K;^Jc&D6>&L`%<_wjmMuI`C97m`uB z&<3eWo!Det1r+>S5fxpJN&TNe-7OJ+s^wYj$xpoK-HNF)N^Cy66g%3bSo!%eoHmSu zR$VdT{(V4E$XO_#Xv1J}1pDotV{y!3m@5}R>1`a|y1m7O!ymBJtus#ycm#P_SⓈ zfb#r@IIi{yow_S>5#>YeLkg4}T3|NnAEr)ti0khkqd4wY2X0ekg?DQFu4i9XnWD;C zma2T+`3UCW0-S?>VCP^3zSs5vPIKO(TZ1f@n<{YIXgBEe3c*|ZHhj+bfyaOMqfO5X z6D4P`@Mjj%lzQWW0YfJ>7H+4)(E3RQ-(F2YRQ?d?^dE`t2TzlQXD9{R>p|~P3)vTG zW8T6R^2ncx+RQH$?R%Q!dM+fZ-@}pSoFRn;#$>`!IceBy>IH zp){%j8}{r$+jj*nYI~237C-Q2*b69VmLoj=2y{EJ?Z}*ZO!WK%d#A2!G5;fer_1u9 zAvxGFFcTUX}ST+p+}N1G1qzf-!jTc^s)E_^$N9LsxZ(r2SYKI2G$Ih2pe|5w_0=#NN?|(I+qr zee#nre`Wy^Mn*$^X%S{_Nr6lJQ_T8!61h(j@T55i9%d2PSbP{&*~jprHVm5eN!T{z zIl?nbkHwhOzx?Z#na)cB3017p7L&V>~z=%n%h2LqM3 zM`mwcGp%FaPE+8Ai5+`Pz8lA0^Fqt+>#+8f<-JOM`N-#;$hor*+c#grslT`JszetL zhHb&p#ToE8T!_Qz^3bgAfu?c&5Z`Aiifh6tzWXzJzGDEoo*#i?7hl?NyP9;;Z<1o^ z589mQM22SZB=hnVwbbWRw?&1dSy)Q?O%?R0_!JqZeH9G{CeY9=$+Z2r7QOO0OR1Jj zeXCn(d`u7>jqgcH-RecFZ7xNe?LzYHS4h$Oo=}U|#3|(iR2f%Bf5#o9rAi}kFX;qb z9j}A-^o8U;+6wBln_Aly;pJ;eeI)|l_Uxfnb3g2MET#!d{qV*{?vpJ0o-Ve~wGaYuf?!y%B zP>=hHSKbxy-17t9{&wQIGLLZ8{XM>h9L1f&gRt*jhNoMeV^!`oq^Ni2dv)=-Z~4{Rc%mg6M*nejPd*TAoPy~I=>o#;Y$smEKx=G0~1klT^GG{Ct~$M z4g8#%fJvuQ z0&!EXK}q>7_N-Uo-TuL-_<9YNPRVc|`3RvQAE@B^I;5tCVnR|W=4fidEo&AMXIUde z#}DR-9`w~z0hNQgVYJi&T)KUMq=u`Z@9JFIb5{{M+Xj&&GL)L09Hha=ZqlFKb4af0 zD19`aLn}_Elk(OHJnT@cwow4j&8HUELL9fyV$jgLdw0$`WCq@AYvB;NJMMKvrjNTW8GMx^; zp7IVO|2@L(V`Z4U>kL+Jj=~GcdrY6!jH?cJaCfu}ueQ#>hX=3FwjdZ*eJ{au&Q-+s z{*AuL%g|o)47;M{L1{%1c6jxG%Be^g2Ta1wQ+Y@+_)b&24#U#>8eOz@$L^(d6eWEG zH>YON&1XAt|3($5NGzdyyNSMya6-u7YxH@|KDcKcre6UYpxAXb=^VI9dHcK4k%Z$k zEc*aC#C@aXuG6T`txW2A;5Ic?B-8F2+v(bn7391iltT1kNxM#sQnF0QY{3&UToXsO zlW$S0?Fl+rrjGit3RqMtgM{zDsq%R($sJfhYVEJ7v@VqHefUa~ua(j*T&9_S(?~~l z0XDiyW7DN+*tJX=xw(sQF-i~5x)>wkm^5ychd^4|3=K;HAQ2;>`295OH}Aw0r7JjS zyA>;MeM3`F0cKZx#cj(p)LqC$%gZzHX;t7MX%CQ?^aS~8(HQnrfj5S{!*r=zXunqr zS^Ys=QrVlU<=*0?jy$IYyhoS5omjJVGjdLsVq0D-{=L@VH53btZ4WToISF-%FR-Oe z35PdFV5CeS#;CrB`_tZ7X}SY5-7L|GqcOh8kKQN?yqv0vd%mIQ@@)_KT~R~%_X2V{ zA%W^LHwta+fg7uWNcKTLWbgeh)GMkIl!FMq_~D+MCu`cqMIGD!?RUMl9+D3EWj7h>>OJ8Ce|CU%@d%X-hH zj|IyqBxC_~bLvVD&69+SSV%iZmIxeC3I>QlQHjxPfI+VZHa*Vh9~5t8i=;}F{GvtibrOb=zGmMXoX5cr-P3u zGPJ|CmAQzyJO@fYGf;N8Kep=Epvq$hB&GM!Lp~GdO0v*@V>+_c^RRTc3)-9C;KHI3 zY$&@Av$S`R>%gy{I($&yVcr-T=ZmR}FXP(u3hc=X#GbM?j5_1eVXL1ZX`2pi&j^F@ znMI%rWmvhqD{>yB;hK=b&~DMlNl?eTx& z#y!#`rS*#txh9o5o?o2(HXL)L8L7+ioP6iq=5E5 z^fXPM9vIgNv!R?^5`qN#tp|nP(KkeD!K`;09B((Z`qJ*!C5cs}*&7(eXXB%1s{6}i?06g;Dnnoc2{}Mv&w?X)35NHbqjUAa-902 z7K0XDK#ze{kd;$qbu)SPcgV-*UvFUc=?=`Fd_r~54z!FZ$793SSo66L%kTAvZtVWbcwR4p^b*gI>)xq%Ctyll;3vA^Us-WrP<955F|3+j3X*ay~{sxAmt7 z-;dFG(xxDnQ}kZDPN>bSq}zG#g<5?UT{7Py4h3AH;;U_vP-8v#wmH(*EIZ6u5=Iv% zC?Ni)3~jBRjH^joDYnW3#^-L+!x>v(k$aLftB=C6>le~KbOLdXKWS<Npb+f=T{o zU=wD5YXgGu`^F9G)L4vHm-L`3(}dd3iKu&9fCGimcyEx2hD;-T|NRo#9dT$^mm*Yj zu0%iSEIjSN?~~=@5Od@J(lVaHrSv5Rg~h|Cx*WlY{wQfF!hUm8gbYZ4@iRZz&3lba z5mT^mZv~EM8eq-63wSoGJ91poanWluW=V?R;crhnCc9wl`&iNq-+^Unm#D|?eQ1q1 zK%y&*2d_))jYPFVa_pJbku(C@!` zbn#vZJ>5By&YBg{^;5wj#VVY321bbSi&m2)%9#4qeA{*BoV7lY3t^adnX-Qr9F!r z3cAq>?=)Jz#-DVgkCEbz%~a`poz(w$(}p=QG&?1L!mXw8{C7V(+4zd4C_B+04Q*`f z=}#lnAJU_}`>AvNe5f9~N4HCD;k@lG-C%nhv5lvi^LCJnOQn@*i746L1!wb*1JC7Q zJ~;_(5uI_<_aXG#h9TSZHDVt}z^vPIY-l`+l)5W;y5<0azbSK(e-7ebHDPyN4X)eP zpdjlSe6J_q^3-H#`OEWeqYk`q=mtDr*TG;&A(p>;4Cj{hFzo41I|?E&I_l>j z??e|TbE$AdF?6$3k!-KIjKiv<%431M&bPm4jbisl<;qaROgFFVD#KF{WRA5qq;V*TN zlw5-vH#gkNzYHbXirCOR$jS9VPV5)xp76o8`;EAKumVv==P~N(Y1r6$qipqBoHo0Q za^K6yymA%K_B9|qI1&=6eALi5^q8>{#jiu)WpxQR)-J|m_4DwiDM+}Vj=dq z%nH*-zxin}GR&gpQ~rqC{h9KEy^(eAG(EG3L}+*sd1+<9WT-Zo_ppF%ZnaQx*TSA} z{**k{0%s2&p!E}`;_eNel7o%x^QKoPySxbZFJ`vmFHd3HzFS^)!3(ffAC$@SK={c%X z{w@QG%z7p^PfBD-6^NER$|pFmrm@j7N$w* zwCKqX@o7jV9V^ZdPrGiQp!^YH#Ic_6Qx2uOBNd?U7euOl17R~mmvo0UlkfDYWRbcK z+Y6g1c+Nrys|wO+_r#AI7im;CKg{%P)T?;K$6*IOYEsvj-O8-@t6hjXZ|Z7ooTy zk>X98AEV3jN~qVj;QrTKcyGLqo{A2rf0>5Z2e+|Pr5(T9wjiT57iP{!k$ScWihX;* zYD_8S zs^w1PrEg53KYodc1%|ZpdcFv0Z57p#C&i)MM`E1AS#eNmuV^qV7Bj0FMYZ1m>Ljm3 z>kUWJ+5j^ersX4)G!_W=h6oWix_xx2w2S_S?}&^_ zQ#xf+EuvDjMA0%0x|I7-sQy$T-yyeztV=fK+_jJ?Ku91D4M{ zMUU;5p(e|RHvSEP|A7QLy#D~4GYhHP+ZdR5f1xGX9engu8Aug8!{}EwFp#>9hsW*E zttA5+Ps`v<=zD~jF2#B6SCBOO!#(&4T*J0PVsi{@OD3RFp%H$UL$Rx|5eJ`SBjCk7 znCwZ!^3XV3>9PVJh z`w*As?}LI&7Gf^^rmwr*@N|^}{%PhT^5Z|c9T|rtl}|L!)gKFO-%{JK2uxCx!;X#T z(P?=!{S4a=^BqxiX~`CJ;n)std=ZVtTC!<=Z znO}(qmpfzX&aO1cHIJ@q>5$^to3wT!(}ibGY0Uyta_ESqe3O-EO0W(c@c$xWS9haX zLrTTJ9x*~DB|+5uOA{`+Jt*380zEFR6#4r*a8Q&w?R6~@)tx5LqBldRhvGk>GRl?$ zx1zpiOFRn1)YWG3W0-(o611q2-6k$wfl9EVog_wnt+0#VO?RSeB}6is{wa(X_7fd74=* zMb}$iP|CR$@#S?o9W+v<(vd^3^`tlHb{&B1?SXW@)fiLftI{L|O(;w?r;_g;Fp00B z6RjSIvuP!*J%`b4{WJP^>;zmNHq)r0B&>d~gj&~Rtlp&yvOb4Z0fY*xclcVk5o6KBKLcGiP9r6CC;VFYM5G<<1gGQ= z!m&;kx$WmAVUteN;FIoRdY?Qhmr@lovpUYJSFZRv<_sxj45v;#ifH@f5^<*@nvR(} ziMjsW>F%#gQRn+c=oANwUY;H6WVBWE9P1@<4^*b1QLeQ7>`#fzI892ItfjUoW9W36b@^BL{Q2BaU$799Exrh z6E_x%-pBMLKSK`*NlcV*YN7go4Kop+rQopsJr_d+RBvWlRa)(gdc&jC<;HGtN(YQfptgJQ=FL*npB z^!DU%sC<}3Q8(RD`K63BMy`aSZz(N-A6`xQKp9Cv=)RNRju(7AlkQeBpnSr>xcTmeOLv3mahHO5ED&HO0uzd+WPbk6ZmdnU`6Nj%3 z6)5f#gozz*H*{`ULtix=gH&RWk@OkoR(AOOA35;8I}8yY5@BO_o<8PA;pAI+{OVl@ zm&AWG)+HKcE54JVra!7=cGJbldvT*Khi=kQ%yd$xpU$K4rk5RQPaBNI{oQG`iyk7w zHqd|$M6p26oKD_vqW9BgP=sS64fgV&L6g4HCg)jHCSOOlQ(Q?(p_0sFV*did4~ zgTt-j#7Q-Az+IE_9%qVwI#+~TS+h7du1rWzs23VDK8fI&5}MJnkTe(fCGB&{B$s zdfHtv;(d_t>YpZ_s#?^?b} zH#|>dIoCLjr(`bw5zlrB=lO5OS(c7Y;TbK-tPp>k)d3{@JQfZ%P#PXqAdQd zpUk>TlDV_f3C{3|;fTKptRf%Bol>*dQRNJ`2gdWw=mahvoxt(o@qEB#;S^_uLALm^qx!i5SdA2A|;)?PNJ~JhbGl!kvN%e8O z&F2I+8C>Dxb(i_7RVr`pagqy$#j)bgX!fs34sYInsiZ&sI zXc29+lR}&7`u*;?=iGbG{p-%0nKS48ymRKvXJ+2_d7l{vX{rA$*_oS8oH*HT?S_@6 zV+@SO7#T`Q(SJU>NXbZb`fs+CmX`WY{y&qdl;(d0`$R_v`d=mL*shNDe`NowWKH>> z?f)t({rR5NC8b6M-Exnrfv*0q~9PSPB!XP`G`w4u@H)#D9UtQhM!e&YY5)BlI) zKl3pD9BVpWXJKA=fcKTlgX*uhP4~D_)os)b)ejPC*p@Z+ght}E|HzY?Eb@xao05#) z$7}!5iPDXitUB;XqMK+!|Iz=yhu^3>=D#9$tCKuYDT%W>XYm_kviZ_H_Kv*Hzi*%7 zGq=yO(yzVz@{=z+uV2k77k9G*mhp-=_B>9-l_L&#vALoPulQ`qz3o=)W_(~2fT*qf+y}4UVH!iRo%iC_s@qoJFTsB0B|K^Ql z^LA-gJE_OX4f1UDQo^!*TCm4^JkNe#4!1Gd?40=yCi40`=;>VUy=N_guTzhUafA`ViGl3@DIBh}4zjNVTaZ;=qr^8A{ zzmU9Bi(hM2LEBA<7r1`F5?OVQ+Ukd1jq%71-Vfur6Ih=fi^7X1&~J$cy7veHE1yKQ zeF45ZXW&%MO>~)i3Jq1KVDL2^$T@|wfdL%3A&BjkALJntKW>h<=D)cMSg}JM`zny* z?s#+9Vqez2zmq?dx$?GH2i7QD#oZzU*-j>u`y?8&#?@YYt$84SX;5HSFFp3vRpam> zdc10HKTh!UV!!^|`9Zro`~2I;O7B+lq6Ryj``M3o*B|6VrOsTieG?ybbK%XdyZEKz z6m~g0g@3p0Vpr>J++(OeD^&)v)D<6gx_5|gtX{z;QfpX!=OJEXf0*UNhH`SzYus2i zh)X-wVEb<)Hr~*H_!Y){e1{ZYG;rlLL#MFkwsq`VI++i&EaMS=!`StP7mH7`_?GHU zo^Nl#M>ALQhC~y7VeQDrJ+*jJoEL`nBjzsj~&OBnx zX?(e?z|{q(u-dNxlV*CL&&P*Q9vp<8X3{)qYYI|=pW}3RJgOEwMBkOw_*8WlUuKk` z`>0P?VEq<#-OJJCY9%&%hC%JoZakYAf&1CMxM+3{{r8?nMs_j^lA}=DxQK@g*vda! zh%KKlC<%rw3VPAqDv=M8r$g!$THu7wh`FOu6-2S!&6UvNu&R7{%i!`@9;hB$<^LF7}m(M5} z;|Tk|HISV&5$5uRIApj8O}Fo3pPLFRDwy%!o$W|}XvFhZT!+J#fm~lJ%hq)>Ir)nk z|I62B_v^iR-(e%x%(#VZ?|&m=dVdbcH(+H?3v9GJhmSMo;>Cv?lv`-vakvjk4Rp}Q zIuzzt*U|QdQ?%gy7V^A&heCbjASvmCq5kJ6%J?ItZ0mxlTPMNY_7CZ`>cGKE4l_Q= z;Ny%Z^!e&LGSObe0ot3`7PwJ(d{H7o{+hvx9~_lE2> zYaUN)9>?}hM$B@fc+Ct4-qgvO%_bZ3&t*n@Wu^r`&7H!3{>bqE^m<^BAM64Mz1IHEKVNb~}+@q(c z8N3NyR44J=@h!N0SC_9)Jyf}{4 z!>X~kyp9=dhTj@JJ-sp*4*59bsGz^=RRIuG31p8~cW7_@k7~TGu zTp$--Vyc`(xj98~hm5M#rw2Li9F3(YUdwSgVJXPV2Cs-4VxJj1U`Vh2y_^ z!=h0RFXw)sgPX5Vc>jKgRe4FaAIoWIS}gIwG~PKcm6L9t=HfGHe5d9T9}m94qe8P- zPvboIjm+S%ey7>#%t>D3oXPz>F0s+9e3sgh&0$B+b8~1qzg?cmJ)}?b!jRMKZJnL{-&sCW zoxwLA=5Z(6n=DLnIBD$#{?we#PW{taZ)p~nb~(-7OD}OqTs~+1JIn1>=lIEnWS*Os zz>7bhVt-2Gf*F@MdU+mSx6I;+&Dq>g$J5KT4G1oXE_%%U1{XVU z!_`VpI5@sW^X0p^x$qkt(yn5;(ibe&FMyZPMTpWB@HhO2kkN%W+9t<71%J^l--Uz! zD6rDBd@MPYifw(R`J3b~u8!```k$1!-<$5NhW~#QDj{9!1NAZa#O<}=S}n>+EihDAPpMzZg^Pk z2VJY_c>LoyF4ir?s&r%Y`&3H<3`0>OVT^ec1K;^Jc&D6>&L`%<_wjmMuI`C97m`uB z&<3eWo!Det1r+>S5fxpJN&TNe-7OJ+s^wYj$xpoK-HNF)N^Cy66g%3bSo!%eoHmSu zR$VdT{(V4E$XO_#Xv1J}1pDotV{y!3m@5}R>1`a|y1m7O!ymBJtus#ycm#P_SⓈ zfb#r@IIi{yow_S>5#>YeLkg4}T3|NnAEr)ti0khkqd4wY2X0ekg?DQFu4i9XnWD;C zma2T+`3UCW0-S?>VCP^3zSs5vPIKO(TZ1f@n<{YIXgBEe3c*|ZHhj+bfyaOMqfO5X z6D4P`@Mjj%lzQWW0YfJ>7H+4)(E3RQ-(F2YRQ?d?^dE`t2TzlQXD9{R>p|~P3)vTG zW8T6R^2ncx+RQH$?R%Q!dM+fZ-@}pSoFRn;#$>`!IceBy>IH zp){%j8}{r$+jj*nYI~237C-Q2*b69VmLoj=2y{EJ?Z}*ZO!WK%d#A2!G5;fer_1u9 zAvxGFFcTUX}ST+p+}N1G1qzf-!jTc^s)E_^$N9LsxZ(r2SYKI2G$Ih2pe|5w_0=#NN?|(I+qr zee#nre`Wy^Mn*$^X%S{_Nr6lJQ_T8!61h(j@T55i9%d2PSbP{&*~jprHVm5eN!T{z zIl?nbkHwhOzx?Z#na)cB3017p7L&V>~z=%n%h2LqM3 zM`mwcGp%FaPE+8Ai5+`Pz8lA0^Fqt+>#+8f<-JOM`N-#;$hor*+c#grslT`JszetL zhHb&p#ToE8T!_Qz^3bgAfu?c&5Z`Aiifh6tzWXzJzGDEoo*#i?7hl?NyP9;;Z<1o^ z589mQM22SZB=hnVwbbWRw?&1dSy)Q?O%?R0_!JqZeH9G{CeY9=$+Z2r7QOO0OR1Jj zeXCn(d`u7>jqgcH-RecFZ7xNe?LzYHS4h$Oo=}U|#3|(iR2f%Bf5#o9rAi}kFX;qb z9j}A-^o8U;+6wBln_Aly;pJ;eeI)|l_Uxfnb3g2MET#!d{qV*{?vpJ0o-Ve~wGaYuf?!y%B zP>=hHSKbxy-17t9{&wQIGLLZ8{XM>h9L1f&gRt*jhNoMeV^!`oq^Ni2dv)=-Z~4{Rc%mg6M*nejPd*TAoPy~I=>o#;Y$smEKx=G0~1klT^GG{Ct~$M z4g8#%fJvuQ z0&!EXK}q>7_N-Uo-TuL-_<9YNPRVc|`3RvQAE@B^I;5tCVnR|W=4fidEo&AMXIUde z#}DR-9`w~z0hNQgVYJi&T)KUMq=u`Z@9JFIb5{{M+Xj&&GL)L09Hha=ZqlFKb4af0 zD19`aLn}_Elk(OHJnT@cwow4j&8HUELL9fyV$jgLdw0$`WCq@AYvB;NJMMKvrjNTW8GMx^; zp7IVO|2@L(V`Z4U>kL+Jj=~GcdrY6!jH?cJaCfu}ueQ#>hX=3FwjdZ*eJ{au&Q-+s z{*AuL%g|o)47;M{L1{%1c6jxG%Be^g2Ta1wQ+Y@+_)b&24#U#>8eOz@$L^(d6eWEG zH>YON&1XAt|3($5NGzdyyNSMya6-u7YxH@|KDcKcre6UYpxAXb=^VI9dHcK4k%Z$k zEc*aC#C@aXuG6T`txW2A;5Ic?B-8F2+v(bn7391iltT1kNxM#sQnF0QY{3&UToXsO zlW$S0?Fl+rrjGit3RqMtgM{zDsq%R($sJfhYVEJ7v@VqHefUa~ua(j*T&9_S(?~~l z0XDiyW7DN+*tJX=xw(sQF-i~5x)>wkm^5ychd^4|3=K;HAQ2;>`295OH}Aw0r7JjS zyA>;MeM3`F0cKZx#cj(p)LqC$%gZzHX;t7MX%CQ?^aS~8(HQnrfj5S{!*r=zXunqr zS^Ys=QrVlU<=*0?jy$IYyhoS5omjJVGjdLsVq0D-{=L@VH53btZ4WToISF-%FR-Oe z35PdFV5CeS#;CrB`_tZ7X}SY5-7L|GqcOh8kKQN?yqv0vd%mIQ@@)_KT~R~%_X2V{ zA%W^LHwta+fg7uWNcKTLWbgeh)GMkIl!FMq_~D+MCu`cqMIGD!?RUMl9+D3EWj7h>>OJ8Ce|CU%@d%X-hH zj|IyqBxC_~bLvVD&69+SSV%iZmIxeC3I>QlQHjxPfI+VZHa*Vh9~5t8i=;}F{GvtibrOb=zGmMXoX5cr-P3u zGPJ|CmAQzyJO@fYGf;N8Kep=Epvq$hB&GM!Lp~GdO0v*@V>+_c^RRTc3)-9C;KHI3 zY$&@Av$S`R>%gy{I($&yVcr-T=ZmR}FXP(u3hc=X#GbM?j5_1eVXL1ZX`2pi&j^F@ znMI%rWmvhqD{>yB;hK=b&~DMlNl?eTx& z#y!#`rS*#txh9o5o?o2(HXL)L8L7+ioP6iq=5E5 z^fXPM9vIgNv!R?^5`qN#tp|nP(KkeD!K`;09B((Z`qJ*!C5cs}*&7(eXXB%1s{6}i?06g;Dnnoc2{}Mv&w?X)35NHbqjUAa-902 z7K0XDK#ze{kd;$qbu)SPcgV-*UvFUc=?=`Fd_r~54z!FZ$793SSo66L%kTAvZtVWbcwR4p^b*gI>)xq%Ctyll;3vA^Us-WrP<955F|3+j3X*ay~{sxAmt7 z-;dFG(xxDnQ}kZDPN>bSq}zG#g<5?UT{7Py4h3AH;;U_vP-8v#wmH(*EIZ6u5=Iv% zC?Ni)3~jBRjH^joDYnW3#^-L+!x>v(k$aLftB=C6>le~KbOLdXKWS<Npb+f=T{o zU=wD5YXgGu`^F9G)L4vHm-L`3(}dd3iKu&9fCGimcyEx2hD;-T|NRo#9dT$^mm*Yj zu0%iSEIjSN?~~=@5Od@J(lVaHrSv5Rg~h|Cx*WlY{wQfF!hUm8gbYZ4@iRZz&3lba z5mT^mZv~EM8eq-63wSoGJ91poanWluW=V?R;crhnCc9wl`&iNq-+^Unm#D|?eQ1q1 zK%y&*2d_))jYPFVa_pJbku(C@!` zbn#vZJ>5By&YBg{^;5wj#VVY321bbSi&m2)%9#4qeA{*BoV7lY3t^adnX-Qr9F!r z3cAq>?=)Jz#-DVgkCEbz%~a`poz(w$(}p=QG&?1L!mXw8{C7V(+4zd4C_B+04Q*`f z=}#lnAJU_}`>AvNe5f9~N4HCD;k@lG-C%nhv5lvi^LCJnOQn@*i746L1!wb*1JC7Q zJ~;_(5uI_<_aXG#h9TSZHDVt}z^vPIY-l`+l)5W;y5<0azbSK(e-7ebHDPyN4X)eP zpdjlSe6J_q^3-H#`OEWeqYk`q=mtDr*TG;&A(p>;4Cj{hFzo41I|?E&I_l>j z??e|TbE$AdF?6$3k!-KIjKiv<%431M&bPm4jbisl<;qaROgFFVD#KF{WRA5qq;V*TN zlw5-vH#gkNzYHbXirCOR$jS9VPV5)xp76o8`;EAKumVv==P~N(Y1r6$qipqBoHo0Q za^K6yymA%K_B9|qI1&=6eALi5^q8>{#jiu)WpxQR)-J|m_4DwiDM+}Vj=dq z%nH*-zxin}GR&gpQ~rqC{h9KEy^(eAG(EG3L}+*sd1+<9WT-Zo_ppF%ZnaQx*TSA} z{**k{0%s2&p!E}`;_eNel7o%x^QKoPySxbZFJ`vmFHd3HzFS^)!3(ffAC$@SK={c%X z{w@QG%z7p^PfBD-6^NER$|pFmrm@j7N$w* zwCKqX@o7jV9V^ZdPrGiQp!^YH#Ic_6Qx2uOBNd?U7euOl17R~mmvo0UlkfDYWRbcK z+Y6g1c+Nrys|wO+_r#AI7im;CKg{%P)T?;K$6*IOYEsvj-O8-@t6hjXZ|Z7ooTy zk>X98AEV3jN~qVj;QrTKcyGLqo{A2rf0>5Z2e+|Pr5(T9wjiT57iP{!k$ScWihX;* zYD_8S zs^w1PrEg53KYodc1%|ZpdcFv0Z57p#C&i)MM`E1AS#eNmuV^qV7Bj0FMYZ1m>Ljm3 z>kUWJ+5j^ersX4)G!_W=h6oWix_xx2w2S_S?}&^_ zQ#xf+EuvDjMA0%0x|I7-sQy$T-yyeztV=fK+_jJ?Ku91D4M{ zMUU;5p(e|RHvSEP|A7QLy#D~4GYhHP+ZdR5f1xGX9engu8Aug8!{}EwFp#>9hsW*E zttA5+Ps`v<=zD~jF2#B6SCBOO!#(&4T*J0PVsi{@OD3RFp%H$UL$Rx|5eJ`SBjCk7 znCwZ!^3XV3>9PVJh z`w*As?}LI&7Gf^^rmwr*@N|^}{%PhT^5Z|c9T|rtl}|L!)gKFO-%{JK2uxCx!;X#T z(P?=!{S4a=^BqxiX~`CJ;n)std=ZVtTC!<=Z znO}(qmpfzX&aO1cHIJ@q>5$^to3wT!(}ibGY0Uyta_ESqe3O-EO0W(c@c$xWS9haX zLrTTJ9x*~DB|+5uOA{`+Jt*380zEFR6#4r*a8Q&w?R6~@)tx5LqBldRhvGk>GRl?$ zx1zpiOFRn1)YWG3W0-(o611q2-6k$wfl9EVog_wnt+0#VO?RSeB}6is{wa(X_7fd74=* zMb}$iP|CR$@#S?o9W+v<(vd^3^`tlHb{&B1?SXW@)fiLftI{L|O(;w?r;_g;Fp00B z6RjSIvuP!*J%`b4{WJP^>;zmNHq)r0B&>d~gj&~Rtlp&yvOb4Z0fY*xclcVk5o6KBKLcGiP9r6CC;VFYM5G<<1gGQ= z!m&;kx$WmAVUteN;FIoRdY?Qhmr@lovpUYJSFZRv<_sxj45v;#ifH@f5^<*@nvR(} ziMjsW>F%#gQRn+c=oANwUY;H6WVBWE9P1@<4^*b1QLeQ7>`#fzI892ItfjUoW9W36b@^BL{Q2BaU$799Exrh z6E_x%-pBMLKSK`*NlcV*YN7go4Kop+rQopsJr_d+RBvWlRa)(gdc&jC<;HGtN(YQfptgJQ=FL*npB z^!DU%sC<}3Q8(RD`K63BMy`aSZz(N-A6`xQKp9Cv=)RNRju(7AlkQeBpnSr>xcTmeOLv3mahHO5ED&HO0uzd+WPbk6ZmdnU`6Nj%3 z6)5f#gozz*H*{`ULtix=gH&RWk@OkoR(AOOA35;8I}8yY5@BO_o<8PA;pAI+{OVl@ zm&AWG)+HKcE54JVra!7=cGJbldvT*Khi=kQ%yd$xpU$K4rk5RQPaBNI{oQG`iyk7w zHqd|$M6p26oKD_vqW9BgP=sS64fgV&L6g4HCg)jHCSOOlQ(Q?(p_0sFV*did4~ zgTt-j#7Q-Az+IE_9%qVwI#+~TS+h7du1rWzs23VDK8fI&5}MJnkTe(fCGB&{B$s zdfHtv;(d_t>YpZ_s#?^?b} zH#|>dIoCLjr(`bw5zlrB=lO5OS(c7Y;TbK-tPp>k)d3{@JQfZ%P#PXqAdQd zpUk>TlDV_f3C{3|;fTKptRf%Bol>*dQRNJ`2gdWw=mahvoxt(o@qEB#;S^_uLALm^qx!i5SdA2A|;)?PNJ~JhbGl!kvN%e8O z&F2I+8C>Dxb(i_7RVr`pagqy$#j)bgX!fs34sYInsiZ&sI zXc29+lR}&7`u*;?=iGbG{p-%0nKS48ymRKvXJ+2_d7l{vX{rA$*_oS8oH*HT?S_@6 zV+@SO7#T`Q(SJU>NXbZb`fs+CmX`WY{y&qdl;(d0`$R_v`d=mL*shNDe`NowWKH>> z?f)t({rR5NC8b6M-Exnrfv*0q~9PSPB!XP`G`w4u@H)#D9UtQhM!e&YY5)BlI) zKl3pD9BVpWXJKA=fcKTlgX*uhP4~D_)os)b)ejPC*p@Z+ght}E|HzY?Eb@xao05#) z$7}!5iPDXitUB;XqMK+!|Iz=yhu^3>=D#9$tCKuYDT%W>XYm_kviZ_H_Kv*Hzi*%7 zGq=yO(yzVz@{=z+uV2k77k9G*mhp-=_B>9-l_L&#vALoPulQ`qz3o=)W_(~2fT*qf+y}4UVH!iRo%iC_s@qoJFTsB0B|K^Ql z^LA-gJE_OX4f1UDQo^!*TCm4^JkNe#4!1Gd?40=yCi40`=;>VUy=N_guTzhUafA`ViGl3@DIBh}4zjNVTaZ;=qr^8A{ zzmU9Bi(hM2LEBA<7r1`F5?OVQ+Ukd1jq%71-Vfur6Ih=fi^7X1&~J$cy7veHE1yKQ zeF45ZXW&%MO>~)i3Jq1KVDL2^$T@|wfdL%3A&BjkALJntKW>h<=D)cMSg}JM`zny* z?s#+9Vqez2zmq?dx$?GH2i7QD#oZzU*-j>u`y?8&#?@YYt$84SX;5HSFFp3vRpam> zdc10HKTh!UV!!^|`9Zro`~2I;O7B+lq6Ryj``M3o*B|6VrOsTieG?ybbK%XdyZEKz z6m~g0g@3p0Vpr>J++(OeD^&)v)D<6gx_5|gtX{z;QfpX!=OJEXf0*UNhH`SzYus2i zh)X-wVEb<)Hr~*H_!Y){e1{ZYG;rlLL#MFkwsq`VI++i&EaMS=!`StP7mH7`_?GHU zo^Nl#M>ALQhC~y7VeQDrJ+*jJoEL`nBjzsj~&OBnx zX?(e?z|{q(u-dNxlV*CL&&P*Q9vp<8X3{)qYYI|=pW}3RJgOEwMBkOw_*8WlUuKk` z`>0P?VEq<#-OJJCY9%&%hC%JoZakYAf&1CMxM+3{{r8?nMs_j^lA}=DxQK@g*vda! zh%KKlC<%rw3VPAqDv=M8r$g!$THu7wh`FOu6-2S!&6UvNu&R7{%i!`@9;hB$<^LF7}m(M5} z;|Tk|HISV&5$5uRIApj8O}Fo3pPLFRDwy%!o$W|}XvFhZT!+J#fm~lJ%hq)>Ir)nk z|I62B_v^iR-(e%x%(#VZ?|&m=dVdbcH(+H?3v9GJhmSMo;>Cv?lv`-vakvjk4Rp}Q zIuzzt*U|QdQ?%gy7V^A&heCbjASvmCq5kJ6%J?ItZ0mxlTPMNY_7CZ`>cGKE4l_Q= z;Ny%Z^!e&LGSObe0ot3`7PwJ(d{H7o{+hvx9~_lE2> zYaUN)9>?}hM$B@fc+Ct4-qgvO%_bZ3&t*n@Wu^r`&7H!3{>bqE^m<^BAM64Mz1IHEKVNb~}+@q(c z8N3NyR44J=@h!N0SC_9)Jyf}{4 z!>X~kyp9=dhTj@JJ-sp*4*59bsGz^=RRIuG31p8~cW7_@k7~TGu zTp$--Vyc`(xj98~hm5M#rw2Li9F3(YUdwSgVJXPV2Cs-4VxJj1U`Vh2y_^ z!=h0RFXw)sgPX5Vc>jKgRe4FaAIoWIS}gIwG~PKcm6L9t=HfGHe5d9T9}m94qe8P- zPvboIjm+S%ey7>#%t>D3oXPz>F0s+9e3sgh&0$B+b8~1qzg?cmJ)}?b!jRMKZJnL{-&sCW zoxwLA=5Z(6n=DLnIBD$#{?we#PW{taZ)p~nb~(-7OD}OqTs~+1JIn1>=lIEnWS*Os zz>7bhVt-2Gf*F@MdU+mSx6I;+&Dq>g$J5KT4G1oXE_%%U1{XVU z!_`VpI5@sW^X0p^x$qkt(yn5;(ibe&FMyZPMTpWB@HhO2kkN%W+9t<71%J^l--Uz! zD6rDBd@MPYifw(R`J3b~u8!```k$1!-<$5NhW~#QDj{9!1NAZa#O<}=S}n>+EihDAPpMzZg^Pk z2VJY_c>LoyF4ir?s&r%Y`&3H<3`0>OVT^ec1K;^Jc&D6>&L`%<_wjmMuI`C97m`uB z&<3eWo!Det1r+>S5fxpJN&TNe-7OJ+s^wYj$xpoK-HNF)N^Cy66g%3bSo!%eoHmSu zR$VdT{(V4E$XO_#Xv1J}1pDotV{y!3m@5}R>1`a|y1m7O!ymBJtus#ycm#P_SⓈ zfb#r@IIi{yow_S>5#>YeLkg4}T3|NnAEr)ti0khkqd4wY2X0ekg?DQFu4i9XnWD;C zma2T+`3UCW0-S?>VCP^3zSs5vPIKO(TZ1f@n<{YIXgBEe3c*|ZHhj+bfyaOMqfO5X z6D4P`@Mjj%lzQWW0YfJ>7H+4)(E3RQ-(F2YRQ?d?^dE`t2TzlQXD9{R>p|~P3)vTG zW8T6R^2ncx+RQH$?R%Q!dM+fZ-@}pSoFRn;#$>`!IceBy>IH zp){%j8}{r$+jj*nYI~237C-Q2*b69VmLoj=2y{EJ?Z}*ZO!WK%d#A2!G5;fer_1u9 zAvxGFFcTUX}ST+p+}N1G1qzf-!jTc^s)E_^$N9LsxZ(r2SYKI2G$Ih2pe|5w_0=#NN?|(I+qr zee#nre`Wy^Mn*$^X%S{_Nr6lJQ_T8!61h(j@T55i9%d2PSbP{&*~jprHVm5eN!T{z zIl?nbkHwhOzx?Z#na)cB3017p7L&V>~z=%n%h2LqM3 zM`mwcGp%FaPE+8Ai5+`Pz8lA0^Fqt+>#+8f<-JOM`N-#;$hor*+c#grslT`JszetL zhHb&p#ToE8T!_Qz^3bgAfu?c&5Z`Aiifh6tzWXzJzGDEoo*#i?7hl?NyP9;;Z<1o^ z589mQM22SZB=hnVwbbWRw?&1dSy)Q?O%?R0_!JqZeH9G{CeY9=$+Z2r7QOO0OR1Jj zeXCn(d`u7>jqgcH-RecFZ7xNe?LzYHS4h$Oo=}U|#3|(iR2f%Bf5#o9rAi}kFX;qb z9j}A-^o8U;+6wBln_Aly;pJ;eeI)|l_Uxfnb3g2MET#!d{qV*{?vpJ0o-Ve~wGaYuf?!y%B zP>=hHSKbxy-17t9{&wQIGLLZ8{XM>h9L1f&gRt*jhNoMeV^!`oq^Ni2dv)=-Z~4{Rc%mg6M*nejPd*TAoPy~I=>o#;Y$smEKx=G0~1klT^GG{Ct~$M z4g8#%fJvuQ z0&!EXK}q>7_N-Uo-TuL-_<9YNPRVc|`3RvQAE@B^I;5tCVnR|W=4fidEo&AMXIUde z#}DR-9`w~z0hNQgVYJi&T)KUMq=u`Z@9JFIb5{{M+Xj&&GL)L09Hha=ZqlFKb4af0 zD19`aLn}_Elk(OHJnT@cwow4j&8HUELL9fyV$jgLdw0$`WCq@AYvB;NJMMKvrjNTW8GMx^; zp7IVO|2@L(V`Z4U>kL+Jj=~GcdrY6!jH?cJaCfu}ueQ#>hX=3FwjdZ*eJ{au&Q-+s z{*AuL%g|o)47;M{L1{%1c6jxG%Be^g2Ta1wQ+Y@+_)b&24#U#>8eOz@$L^(d6eWEG zH>YON&1XAt|3($5NGzdyyNSMya6-u7YxH@|KDcKcre6UYpxAXb=^VI9dHcK4k%Z$k zEc*aC#C@aXuG6T`txW2A;5Ic?B-8F2+v(bn7391iltT1kNxM#sQnF0QY{3&UToXsO zlW$S0?Fl+rrjGit3RqMtgM{zDsq%R($sJfhYVEJ7v@VqHefUa~ua(j*T&9_S(?~~l z0XDiyW7DN+*tJX=xw(sQF-i~5x)>wkm^5ychd^4|3=K;HAQ2;>`295OH}Aw0r7JjS zyA>;MeM3`F0cKZx#cj(p)LqC$%gZzHX;t7MX%CQ?^aS~8(HQnrfj5S{!*r=zXunqr zS^Ys=QrVlU<=*0?jy$IYyhoS5omjJVGjdLsVq0D-{=L@VH53btZ4WToISF-%FR-Oe z35PdFV5CeS#;CrB`_tZ7X}SY5-7L|GqcOh8kKQN?yqv0vd%mIQ@@)_KT~R~%_X2V{ zA%W^LHwta+fg7uWNcKTLWbgeh)GMkIl!FMq_~D+MCu`cqMIGD!?RUMl9+D3EWj7h>>OJ8Ce|CU%@d%X-hH zj|IyqBxC_~bLvVD&69+SSV%iZmIxeC3I>QlQHjxPfI+VZHa*Vh9~5t8i=;}F{GvtibrOb=zGmMXoX5cr-P3u zGPJ|CmAQzyJO@fYGf;N8Kep=Epvq$hB&GM!Lp~GdO0v*@V>+_c^RRTc3)-9C;KHI3 zY$&@Av$S`R>%gy{I($&yVcr-T=ZmR}FXP(u3hc=X#GbM?j5_1eVXL1ZX`2pi&j^F@ znMI%rWmvhqD{>yB;hK=b&~DMlNl?eTx& z#y!#`rS*#txh9o5o?o2(HXL)L8L7+ioP6iq=5E5 z^fXPM9vIgNv!R?^5`qN#tp|nP(KkeD!K`;09B((Z`qJ*!C5cs}*&7(eXXB%1s{6}i?06g;Dnnoc2{}Mv&w?X)35NHbqjUAa-902 z7K0XDK#ze{kd;$qbu)SPcgV-*UvFUc=?=`Fd_r~54z!FZ$793SSo66L%kTAvZtVWbcwR4p^b*gI>)xq%Ctyll;3vA^Us-WrP<955F|3+j3X*ay~{sxAmt7 z-;dFG(xxDnQ}kZDPN>bSq}zG#g<5?UT{7Py4h3AH;;U_vP-8v#wmH(*EIZ6u5=Iv% zC?Ni)3~jBRjH^joDYnW3#^-L+!x>v(k$aLftB=C6>le~KbOLdXKWS<Npb+f=T{o zU=wD5YXgGu`^F9G)L4vHm-L`3(}dd3iKu&9fCGimcyEx2hD;-T|NRo#9dT$^mm*Yj zu0%iSEIjSN?~~=@5Od@J(lVaHrSv5Rg~h|Cx*WlY{wQfF!hUm8gbYZ4@iRZz&3lba z5mT^mZv~EM8eq-63wSoGJ91poanWluW=V?R;crhnCc9wl`&iNq-+^Unm#D|?eQ1q1 zK%y&*2d_))jYPFVa_pJbku(C@!` zbn#vZJ>5By&YBg{^;5wj#VVY321bbSi&m2)%9#4qeA{*BoV7lY3t^adnX-Qr9F!r z3cAq>?=)Jz#-DVgkCEbz%~a`poz(w$(}p=QG&?1L!mXw8{C7V(+4zd4C_B+04Q*`f z=}#lnAJU_}`>AvNe5f9~N4HCD;k@lG-C%nhv5lvi^LCJnOQn@*i746L1!wb*1JC7Q zJ~;_(5uI_<_aXG#h9TSZHDVt}z^vPIY-l`+l)5W;y5<0azbSK(e-7ebHDPyN4X)eP zpdjlSe6J_q^3-H#`OEWeqYk`q=mtDr*TG;&A(p>;4Cj{hFzo41I|?E&I_l>j z??e|TbE$AdF?6$3k!-KIjKiv<%431M&bPm4jbisl<;qaROgFFVD#KF{WRA5qq;V*TN zlw5-vH#gkNzYHbXirCOR$jS9VPV5)xp76o8`;EAKumVv==P~N(Y1r6$qipqBoHo0Q za^K6yymA%K_B9|qI1&=6eALi5^q8>{#jiu)WpxQR)-J|m_4DwiDM+}Vj=dq z%nH*-zxin}GR&gpQ~rqC{h9KEy^(eAG(EG3L}+*sd1+<9WT-Zo_ppF%ZnaQx*TSA} z{**k{0%s2&p!E}`;_eNel7o%x^QKoPySxbZFJ`vmFHd3HzFS^)!3(ffAC$@SK={c%X z{w@QG%z7p^PfBD-6^NER$|pFmrm@j7N$w* zwCKqX@o7jV9V^ZdPrGiQp!^YH#Ic_6Qx2uOBNd?U7euOl17R~mmvo0UlkfDYWRbcK z+Y6g1c+Nrys|wO+_r#AI7im;CKg{%P)T?;K$6*IOYEsvj-O8-@t6hjXZ|Z7ooTy zk>X98AEV3jN~qVj;QrTKcyGLqo{A2rf0>5Z2e+|Pr5(T9wjiT57iP{!k$ScWihX;* zYD_8S zs^w1PrEg53KYodc1%|ZpdcFv0Z57p#C&i)MM`E1AS#eNmuV^qV7Bj0FMYZ1m>Ljm3 z>kUWJ+5j^ersX4)G!_W=h6oWix_xx2w2S_S?}&^_ zQ#xf+EuvDjMA0%0x|I7-sQy$T-yyeztV=fK+_jJ?Ku91D4M{ zMUU;5p(e|RHvSEP|A7QLy#D~4GYhHP+ZdR5f1xGX9engu8Aug8!{}EwFp#>9hsW*E zttA5+Ps`v<=zD~jF2#B6SCBOO!#(&4T*J0PVsi{@OD3RFp%H$UL$Rx|5eJ`SBjCk7 znCwZ!^3XV3>9PVJh z`w*As?}LI&7Gf^^rmwr*@N|^}{%PhT^5Z|c9T|rtl}|L!)gKFO-%{JK2uxCx!;X#T z(P?=!{S4a=^BqxiX~`CJ;n)std=ZVtTC!<=Z znO}(qmpfzX&aO1cHIJ@q>5$^to3wT!(}ibGY0Uyta_ESqe3O-EO0W(c@c$xWS9haX zLrTTJ9x*~DB|+5uOA{`+Jt*380zEFR6#4r*a8Q&w?R6~@)tx5LqBldRhvGk>GRl?$ zx1zpiOFRn1)YWG3W0-(o611q2-6k$wfl9EVog_wnt+0#VO?RSeB}6is{wa(X_7fd74=* zMb}$iP|CR$@#S?o9W+v<(vd^3^`tlHb{&B1?SXW@)fiLftI{L|O(;w?r;_g;Fp00B z6RjSIvuP!*J%`b4{WJP^>;zmNHq)r0B&>d~gj&~Rtlp&yvOb4Z0fY*xclcVk5o6KBKLcGiP9r6CC;VFYM5G<<1gGQ= z!m&;kx$WmAVUteN;FIoRdY?Qhmr@lovpUYJSFZRv<_sxj45v;#ifH@f5^<*@nvR(} ziMjsW>F%#gQRn+c=oANwUY;H6WVBWE9P1@<4^*b1QLeQ7>`#fzI892ItfjUoW9W36b@^BL{Q2BaU$799Exrh z6E_x%-pBMLKSK`*NlcV*YN7go4Kop+rQopsJr_d+RBvWlRa)(gdc&jC<;HGtN(YQfptgJQ=FL*npB z^!DU%sC<}3Q8(RD`K63BMy`aSZz(N-A6`xQKp9Cv=)RNRju(7AlkQeBpnSr>xcTmeOLv3mahHO5ED&HO0uzd+WPbk6ZmdnU`6Nj%3 z6)5f#gozz*H*{`ULtix=gH&RWk@OkoR(AOOA35;8I}8yY5@BO_o<8PA;pAI+{OVl@ zm&AWG)+HKcE54JVra!7=cGJbldvT*Khi=kQ%yd$xpU$K4rk5RQPaBNI{oQG`iyk7w zHqd|$M6p26oKD_vqW9BgP=sS64fgV&L6g4HCg)jHCSOOlQ(Q?(p_0sFV*did4~ zgTt-j#7Q-Az+IE_9%qVwI#+~TS+h7du1rWzs23VDK8fI&5}MJnkTe(fCGB&{B$s zdfHtv;(d_t>YpZ_s#?^?b} zH#|>dIoCLjr(`bw5zlrB=lO5OS(c7Y;TbK-tPp>k)d3{@JQfZ%P#PXqAdQd zpUk>TlDV_f3C{3|;fTKptRf%Bol>*dQRNJ`2gdWw=mahvoxt(o@qEB#;S^_uLALm^qx!i5SdA2A|;)?PNJ~JhbGl!kvN%e8O z&F2I+8C>Dxb(i_7RVr`pagqy$#j)bgX!fs3 Date: Tue, 10 Sep 2024 02:53:33 +0000 Subject: [PATCH 31/78] Pre-commit autofix --- tests/test_preprocessing_mrpreproc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index 0a6c3b4..7ef37a7 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -135,4 +135,3 @@ def test_niitomif_output_correctness_image(tmp_path): mrpreproc.niitomif(PATH_DWI, output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) - From 43187bb7897b5821fd8efbe23bc8c8e3c35f9f0f Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 9 Sep 2024 23:07:24 -0400 Subject: [PATCH 32/78] Fix ununused var --- pydesigner/tractography/dsistudio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydesigner/tractography/dsistudio.py b/pydesigner/tractography/dsistudio.py index ef42fc6..dda9167 100644 --- a/pydesigner/tractography/dsistudio.py +++ b/pydesigner/tractography/dsistudio.py @@ -300,7 +300,7 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= map_lps = op.join(map_dir, map_name + "_lps" + ext) convertLPS(path_map, map_lps) other_data = nib.load(map_lps) - other_img = other_img.get_fdata() + other_img = other_data.get_fdata() if not other_img.shape == amplitudes_img.shape[:3]: raise ValueError("Differing grid between other map image: {} " "and amplitudes".format(path_map)) gmap = other_img.flatten(order="F") From e1fb7accf78128134bbcc917eef038acbff52db4 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:16:24 -0400 Subject: [PATCH 33/78] Update base images and enable GH Action cache for Docker builds --- .github/workflows/pydesigner_ci.yml | 21 +++++++++++++-------- .gitignore | 1 + Dockerfile | 2 +- tests/Dockerfile | 11 ++++------- tests/entrypoint.sh | 5 +++-- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 8680aa7..72899ba 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python id: setup-python - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: 3.12 architecture: 'x64' @@ -48,33 +48,38 @@ jobs: steps: - name: Checkout code id: checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: token: ${{ secrets.GH_BRIDGE_PAT }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 + uses: docker/setup-buildx-action@v3 + + - name: Expose GitHub Runtime + uses: crazy-max/ghaction-github-runtime@v3 - name: Build Docker image - run: docker build -t pydesigner-test -f tests/Dockerfile . + run: docker buildx build -t pydesigner-test -f tests/Dockerfile . \ + --cache-to "type=gha,mode=max" \ + --cache-from "type=gha" \ - name: Run tests in Docker container - run: docker run --name pydesigner-test + run: docker run pydesigner-test - name: Copy test results - run: docker cp pydesigner-test:/tests/ ./test-results + run: docker cp pydesigner-test:/test_results/ ./test_results - name: Upload test results uses: actions/upload-artifact@v4 with: name: test-results - path: ./test-results + path: ./test_results/results.xml - name: Upload coverage report uses: actions/upload-artifact@v4 with: name: coverage-report - path: ./test-results/coverage.xml + path: ./test_results/coverage.xml - name: Clean up run: docker rm test-container diff --git a/.gitignore b/.gitignore index 2394a8b..5963969 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Folders to ignore +.coverage .idea/ __pycache__/ .ipynb_checkpoints/ diff --git a/Dockerfile b/Dockerfile index 664b5e4..94bfe75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ # ============================================================================== # Load base Ubuntu image -FROM dmri/ci-cd:e93dd885 AS base +FROM dmri/ci-cd:9b5fdb2 AS base SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] # Labels diff --git a/tests/Dockerfile b/tests/Dockerfile index 3866f2f..fd18810 100644 --- a/tests/Dockerfile +++ b/tests/Dockerfile @@ -2,14 +2,11 @@ FROM dmri/ci-cd-py3.11:e93dd885 SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] WORKDIR /src COPY . /src -ENV TEST_DIR=/tests +ENV TEST_DIR=/results -RUN pip install uv && \ - uv venv ${VIRTUAL_ENV} && \ - uv pip install -U pip setuptools wheel -RUN uv pip install -rrequirements.txt -rrequirements-dev.txt -RUN uv pip install --no-deps -e. -RUN mkdir -p ${TEST_DIR} +RUN uv pip install -rrequirements.txt && \ + uv pip install -rrequirements-dev.txt && \ + uv pip install --no-deps -e. COPY ./tests/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] diff --git a/tests/entrypoint.sh b/tests/entrypoint.sh index dba6f94..7483a42 100644 --- a/tests/entrypoint.sh +++ b/tests/entrypoint.sh @@ -1,8 +1,9 @@ -#!/bin/sh +#!/bin/bash # If no arguments are passed, run pytest with coverage if [ "$#" -eq 0 ]; then - pytest tests -vv --cov=. --cov-report=xml:/tests/coverage.xml --junitxml=/tests/results.xml + mkdir -p /test_results + pytest tests -vv --cov=pydesigner --cov-report=xml:/test_results/coverage.xml --junitxml=/test_results/results.xml else # Otherwise, run the command passed as arguments exec "$@" From b119613860b81da14ae025b8f406e0eb31d69df7 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:28:41 -0400 Subject: [PATCH 34/78] Fix base Docker image --- Dockerfile | 2 +- tests/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 94bfe75..05be765 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ # ============================================================================== # Load base Ubuntu image -FROM dmri/ci-cd:9b5fdb2 AS base +FROM dmri/ci-cd:9b5fdb22 AS base SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] # Labels diff --git a/tests/Dockerfile b/tests/Dockerfile index fd18810..7fec59a 100644 --- a/tests/Dockerfile +++ b/tests/Dockerfile @@ -1,4 +1,4 @@ -FROM dmri/ci-cd-py3.11:e93dd885 +FROM dmri/ci-cd-py3.11:9b5fdb22 SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] WORKDIR /src COPY . /src From cdcbe90a84e61b5b43e42102f013c22aa549b96b Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:31:13 -0400 Subject: [PATCH 35/78] Fix workflow file --- .github/workflows/pydesigner_ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 72899ba..7caeb50 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -59,7 +59,8 @@ jobs: uses: crazy-max/ghaction-github-runtime@v3 - name: Build Docker image - run: docker buildx build -t pydesigner-test -f tests/Dockerfile . \ + run: | + docker buildx build -t pydesigner-test -f tests/Dockerfile . \ --cache-to "type=gha,mode=max" \ --cache-from "type=gha" \ From bd04c33d0a4184b2bac3e8082709b35d157907d9 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:31:28 -0400 Subject: [PATCH 36/78] Another quick fix --- .github/workflows/pydesigner_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 7caeb50..934e712 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -62,7 +62,7 @@ jobs: run: | docker buildx build -t pydesigner-test -f tests/Dockerfile . \ --cache-to "type=gha,mode=max" \ - --cache-from "type=gha" \ + --cache-from "type=gha" - name: Run tests in Docker container run: docker run pydesigner-test From 5572155eaeb5440cc064eb07e6acb2ab297b86a6 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:38:13 -0400 Subject: [PATCH 37/78] Add support for Docker image loading --- .github/workflows/pydesigner_ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 934e712..5b241ef 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -61,6 +61,7 @@ jobs: - name: Build Docker image run: | docker buildx build -t pydesigner-test -f tests/Dockerfile . \ + --load --cache-to "type=gha,mode=max" \ --cache-from "type=gha" From 0537a2f1ff32f3d14eea7d625f7a804ee8c78bf3 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:45:44 -0400 Subject: [PATCH 38/78] Switch to Docker Build action to bypass API calls --- .github/workflows/pydesigner_ci.yml | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 5b241ef..7b43a35 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -55,15 +55,18 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Expose GitHub Runtime - uses: crazy-max/ghaction-github-runtime@v3 + # - name: Expose GitHub Runtime + # uses: crazy-max/ghaction-github-runtime@v3 - name: Build Docker image - run: | - docker buildx build -t pydesigner-test -f tests/Dockerfile . \ - --load - --cache-to "type=gha,mode=max" \ - --cache-from "type=gha" + uses: docker/build-push-action@v6 + with: + context: . + load: true + push: false + tags: pydesigner-test + cache-from: type=gha + cache-to: type=gha,mode=max - name: Run tests in Docker container run: docker run pydesigner-test From d15fb4454feb69906a87b24593cfb76201539361 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:51:34 -0400 Subject: [PATCH 39/78] Fix Docker login --- .github/workflows/pydesigner_ci.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 7b43a35..ee3017e 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -52,9 +52,21 @@ jobs: with: token: ${{ secrets.GH_BRIDGE_PAT }} - - name: Set up Docker Buildx + - name: Setup QEMU + id: qemu + uses: docker/setup-qemu-action@v3 + + - name: Setup Docker Buildx + id: buildx uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + id: login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + # - name: Expose GitHub Runtime # uses: crazy-max/ghaction-github-runtime@v3 From 7c7ffa8e210ea1a56c5a685b60861eac6e4a680d Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 00:55:02 -0400 Subject: [PATCH 40/78] Fix incorrect pointer to file location --- .github/workflows/pydesigner_ci.yml | 1 + Dockerfile | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index ee3017e..f754dae 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -76,6 +76,7 @@ jobs: context: . load: true push: false + file: tests/Dockerfile tags: pydesigner-test cache-from: type=gha cache-to: type=gha,mode=max diff --git a/Dockerfile b/Dockerfile index 05be765..d619a63 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ # ============================================================================== # Load base Ubuntu image -FROM dmri/ci-cd:9b5fdb22 AS base +FROM dmri/ci-cd-py3.11:9b5fdb22 AS base SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] # Labels From 6f7635c6133af94819d4cdcb355044136679712f Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 01:04:53 -0400 Subject: [PATCH 41/78] Disable GHA caching --- .github/workflows/pydesigner_ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index f754dae..659e02d 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -78,8 +78,6 @@ jobs: push: false file: tests/Dockerfile tags: pydesigner-test - cache-from: type=gha - cache-to: type=gha,mode=max - name: Run tests in Docker container run: docker run pydesigner-test From 1aa8ccaa03f037fccc4a60ede4a42bb0a467df8c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 01:17:28 -0400 Subject: [PATCH 42/78] Revert to non-cached building --- .github/workflows/pydesigner_ci.yml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 659e02d..cf99d6e 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -52,14 +52,6 @@ jobs: with: token: ${{ secrets.GH_BRIDGE_PAT }} - - name: Setup QEMU - id: qemu - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - name: Login to Docker Hub id: login uses: docker/login-action@v3 @@ -67,17 +59,8 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - # - name: Expose GitHub Runtime - # uses: crazy-max/ghaction-github-runtime@v3 - - name: Build Docker image - uses: docker/build-push-action@v6 - with: - context: . - load: true - push: false - file: tests/Dockerfile - tags: pydesigner-test + run: docker build -t pydesigner-test -f tests/Dockerfile . - name: Run tests in Docker container run: docker run pydesigner-test From 5b9e77e9022e768d26a83f73184a7b768cd8f790 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 01:25:51 -0400 Subject: [PATCH 43/78] Fix pytest container name --- .github/workflows/pydesigner_ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index cf99d6e..44a90f6 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -63,10 +63,10 @@ jobs: run: docker build -t pydesigner-test -f tests/Dockerfile . - name: Run tests in Docker container - run: docker run pydesigner-test + run: docker run --name pydesigner-test-container pydesigner-test - name: Copy test results - run: docker cp pydesigner-test:/test_results/ ./test_results + run: docker cp pydesigner-test-container:/test_results/ ./test_results - name: Upload test results uses: actions/upload-artifact@v4 From 5431eb670dbe46a05295bd4eeb789a16634b495b Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 01:27:20 -0400 Subject: [PATCH 44/78] Refine cleanup --- .github/workflows/pydesigner_ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 44a90f6..576fbbf 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -81,4 +81,6 @@ jobs: path: ./test_results/coverage.xml - name: Clean up - run: docker rm test-container + run: | + docker container rm pydesigner-test-container + docker image rm pydesigner-test From 08fe8791acbb863e637db8c3ce2a046477a2cbd5 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 09:29:18 -0400 Subject: [PATCH 45/78] Add code coverage summary --- .github/workflows/pydesigner_ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 576fbbf..96c29da 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -80,6 +80,19 @@ jobs: name: coverage-report path: ./test_results/coverage.xml + - name: Code coverage summary report + uses: irongut/CodeCoverageSummary@v1.2.0 + with: + filename: ./test_results/coverage.xml + badge: true + fail_below_min: true + format: markdown + hide_branch_rate: false + hide_complexity: true + indicators: true + output: both + thresholds: '10 50' + - name: Clean up run: | docker container rm pydesigner-test-container From b2e23f9c65c723d96a3d3399660d35d7883d6a1f Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 10:01:19 -0400 Subject: [PATCH 46/78] Add cov PR comment --- .github/workflows/pydesigner_ci.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 96c29da..da31370 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -6,8 +6,9 @@ on: branches: master tags: - "**" - - +permissions: + pull-requests: write + jobs: pre-commit: runs-on: ubuntu-latest @@ -81,7 +82,7 @@ jobs: path: ./test_results/coverage.xml - name: Code coverage summary report - uses: irongut/CodeCoverageSummary@v1.2.0 + uses: irongut/CodeCoverageSummary@v1.3.0 with: filename: ./test_results/coverage.xml badge: true @@ -93,6 +94,13 @@ jobs: output: both thresholds: '10 50' + - name: Add Coverage PR Comment + uses: marocchino/sticky-pull-request-comment@v2 + if: github.event_name == 'pull_request' + with: + recreate: true + path: code-coverage-results.md + - name: Clean up run: | docker container rm pydesigner-test-container From e0c85e6b60adfae0cd5b4f7cf2f814bd9006fdc3 Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Tue, 10 Sep 2024 14:01:50 +0000 Subject: [PATCH 47/78] Pre-commit autofix --- .github/workflows/pydesigner_ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index da31370..882794f 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -8,7 +8,7 @@ on: - "**" permissions: pull-requests: write - + jobs: pre-commit: runs-on: ubuntu-latest From ac3058de3a5ed76b4e084eb0f897c76f50c54dfe Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 12:15:16 -0400 Subject: [PATCH 48/78] Add test summary --- .github/workflows/pydesigner_ci.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 882794f..09b3f36 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -7,6 +7,7 @@ on: tags: - "**" permissions: + checks: write pull-requests: write jobs: @@ -94,13 +95,25 @@ jobs: output: both thresholds: '10 50' - - name: Add Coverage PR Comment + - name: Publish Coverage PR Comment uses: marocchino/sticky-pull-request-comment@v2 if: github.event_name == 'pull_request' with: recreate: true path: code-coverage-results.md + - name: Output Coverage to Job Summary + run: cat code-coverage-results.md >> $GITHUB_STEP_SUMMARY + + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + if: always() + with: + files: | + test_results/**/*.xml + test-results/**/*.trx + test-results/**/*.json + - name: Clean up run: | docker container rm pydesigner-test-container From ca40b20c053e47de8527c923583764c2eb70788c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 12:21:34 -0400 Subject: [PATCH 49/78] Fix path to test result --- .github/workflows/pydesigner_ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 09b3f36..d50b5d3 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -110,9 +110,7 @@ jobs: if: always() with: files: | - test_results/**/*.xml - test-results/**/*.trx - test-results/**/*.json + test_results/results.xml - name: Clean up run: | From f350b5bf45d64300089a9f97dd304f025162f02d Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 19:23:20 -0400 Subject: [PATCH 50/78] Rework models.py and introduce unit tests --- pydesigner/system/errors.py | 3 + pydesigner/system/models.py | 151 ++++++++++++++++++++++++++++-------- tests/test_models.py | 138 ++++++++++++++++++++++++++++++++ 3 files changed, 261 insertions(+), 31 deletions(-) create mode 100644 pydesigner/system/errors.py create mode 100644 tests/test_models.py diff --git a/pydesigner/system/errors.py b/pydesigner/system/errors.py new file mode 100644 index 0000000..d1d332d --- /dev/null +++ b/pydesigner/system/errors.py @@ -0,0 +1,3 @@ +class FileExtensionError(FileNotFoundError): + """Raise an exception for extension-related issues. """ + pass \ No newline at end of file diff --git a/pydesigner/system/models.py b/pydesigner/system/models.py index c8fcb27..71e4d32 100644 --- a/pydesigner/system/models.py +++ b/pydesigner/system/models.py @@ -1,50 +1,139 @@ import os.path as op -from typing import Optional +import typing as t -from pydantic import BaseModel, ValidationInfo, field_validator +from pydantic import BaseModel, ValidationInfo, field_validator, StrictBool +from .errors import FileExtensionError class modelmrtrix(BaseModel): - """Define model validation for MRtrix3 CLI""" + """Define model validator for common MRtrix3 CLI options.""" - file_input: str = None - file_output: Optional[str] = None - nthreads: Optional[bool] = None - force: Optional[bool] = True - verbose: Optional[bool] = False - - @field_validator("file_input") + input: t.Optional[t.Union[str, t.Any]] = None + output: t.Optional[t.Union[str, t.Any]] = None + nthreads: t.Optional[t.Union[int, t.Any]] = None + verbose: t.Optional[StrictBool] = None + force: t.Optional[StrictBool] = None + + @field_validator("input", mode="before") @classmethod - def file_input_valid(cls, var: str, info: ValidationInfo): + def input_valid(cls, var: str, info: ValidationInfo) -> str: """Validate that input file is correct type and exists.""" if not isinstance(var, str): - raise TypeError( - f"Input file path {info.field_name}: {var} is not a string " f"type. Type entered is {type(var)}." - ) + msg = f"Input file path ({info.field_name}={var}) is not a string type. Type entered is {type(var)}." + raise TypeError(msg) + if not op.exists(op.dirname(var)): + msg = f"Specified directory ({op.dirname(var)}) for output file " + msg += f"({op.basename(var)}) does not exist. " + msg += "Pleasure ensure that the input parent directory exists." + raise OSError(msg) if not op.exists(var): - raise FileNotFoundError(f"Input file {info.field_name}: {var} does not exist.") + msg = f"Input file path ({var}) does not exist." + raise FileNotFoundError(msg) + return var + - @field_validator("file_output") + @field_validator("output", mode="before") @classmethod - def file_output_valid(cls, var: str, info: ValidationInfo): + def output_valid(cls, var: str, info: ValidationInfo) -> str: """Validate output filename and parent folder.""" if not isinstance(var, str): - raise TypeError( - f"Output file path {info.field_name}: {var} is not a string " f"type. Type entered is {type(var)}." - ) + msg = f"Output file path ({info.field_name}={var}) is not a string type. " + msg += f"Type entered is {type(var)}." + raise TypeError(msg) if not op.exists(op.dirname(var)): - raise FileNotFoundError( - f"Parent directory {op.dirname(var)} for input file {var} does " - "not exists. Please ensure that the parent folder exists." - ) + msg = f"Specified directory ({op.dirname(var)}) for output file " + msg += f"({op.basename(var)}) does not exist. " + msg += "Pleasure ensure that the output parent directory exists." + raise OSError(msg) + return var + - @field_validator("nthreads") + @field_validator("nthreads", mode="before") @classmethod def correct_nthreads(cls, var: int, info: ValidationInfo) -> int: """Check that nthreads is a postive integer.""" - if not isinstance(var, int): - raise TypeError( - f"{info.field_name} is not provided as a {type(var)}. Please " "provide a positive integer." - ) - if var <= 0: - raise ValueError(f"{info.field_name} needs to be a valid integer.") + if var is not None: + if not isinstance(var, int): + msg = f"{info.field_name} is provided as a {type(var)}. " + msg += "Please provide a positive integer." + raise TypeError(msg) + if var <= 0: + raise ValueError(f"{info.field_name} needs to be a valid positive integer.") + return int(var) + else: + return var + + +def input_path_validator(path: str, ctype: str = None): + """Validates a provided input path + + Parameters + ---------- + path : str + Path to input file + ctype : str + File extension to enfore on input path + + Returns + ------- + str + Sanitized path + + See Also + -------- + output_path_validator + """ + if not isinstance(path, str): + msg = f"Entered path ({path}) is not a valid string. " + msg += "Please enter path as a string." + raise TypeError(msg) + if not ctype is None: + if not isinstance(ctype, str): + msg = f"ctype variable (ctype={ctype}) needs to be a valid string." + raise(TypeError(msg)) + if not op.exists(path): + msg = f"Input file ({path}) does not exist." + raise FileNotFoundError(msg) + if ctype: + if op.splitext(op.basename(path))[-1] != ctype: + msg = f"Input file ({path}) does not posses the required {ctype} extension." + raise FileExtensionError(msg) + return str(path) + + +def output_path_validator(path: str, ctype: str = None): + """Validates a provided input path + Parameters + ---------- + path : str + Path to output file + ctype : str + File extension to enfore on output path + + Returns + ------- + str + Sanitized path + + See Also + -------- + input_path_validator + """ + if not isinstance(path, str): + msg = f"Entered path ({path}) is not a valid string. " + msg += "Please enter path as a string." + raise TypeError(msg) + if not ctype is None: + if not isinstance(ctype, str): + msg = f"ctype variable (ctype={ctype}) needs to be a valid string." + raise(TypeError(msg)) + if not op.exists(op.dirname(path)): + msg = f"Specified directory ({op.dirname(path)}) for output file " + msg += f"({op.basename(path)}) does not exist. " + msg += "Pleasure ensure that the output parent directory exists." + raise OSError(msg) + if ctype: + if op.splitext(op.basename(path))[-1] != ctype: + msg = f"Input file ({path}) does not posses the required {ctype} extension." + raise FileExtensionError(msg) + return str(path) diff --git a/tests/test_models.py b/tests/test_models.py new file mode 100644 index 0000000..6728477 --- /dev/null +++ b/tests/test_models.py @@ -0,0 +1,138 @@ +from pydesigner.system.models import modelmrtrix, input_path_validator, output_path_validator +from pydesigner.system.errors import FileExtensionError +from pydantic import ValidationError +import pytest +from conftest import load_data + +DATA = load_data(type="hifi") +PATH_DWI = DATA["nifti"] + +def test_modelmrtrix_input_invalid(): + with pytest.raises(TypeError) as exc: + model = modelmrtrix(input=50) + assert "Input file path (input=50) is not a string type" in str(exc.value) + + +def test_modelmrtrix_input_nonexistent(tmp_path): + input_nii = str(tmp_path / "input.nii") + with pytest.raises(FileNotFoundError) as exc: + model = modelmrtrix(input=input_nii) + assert f"Input file path ({input_nii}) does not exist" in str(exc.value) + + +def test_modelmrtrix_input_basedir(): + with pytest.raises(OSError) as exc: + model = modelmrtrix(input="nonexistent/input.nii") + assert "Pleasure ensure that the input parent directory exists" in str(exc.value) + + +def test_modelmrtrix_input_success(): + model = modelmrtrix(input=PATH_DWI) + assert model.input == PATH_DWI + + +def test_modelmrtrix_output_invalid(): + with pytest.raises(TypeError) as exc: + model = modelmrtrix(output=50) + assert "Output file path (output=50) is not a string type" in str(exc.value) + + +def test_modelmrtrix_output_basedir(): + with pytest.raises(OSError) as exc: + model = modelmrtrix(output="nonexistent/output.nii") + assert "Pleasure ensure that the output parent directory exists" in str(exc.value) + + +def test_modelmrtrix_output_success(tmp_path): + output_nii = str(tmp_path / "output.nii") + model = modelmrtrix(output=output_nii) + assert model.output == output_nii + + +def test_modelmrtrix_verbose_fail(): + with pytest.raises(ValidationError) as exc: + model = modelmrtrix(verbose="foo") + assert "Input should be a valid boolean" in str(exc.value) + + +def test_modelmrtrix_verbose_success(): + model = modelmrtrix(verbose=True) + print(model) + assert model.verbose == True + + +def test_modelmrtrix_force_fail(): + with pytest.raises(ValidationError) as exc: + model = modelmrtrix(force="foo") + assert "Input should be a valid boolean" in str(exc.value) + + +def test_modelmrtrix_nthreads_invalid(): + with pytest.raises(TypeError) as exc: + model = modelmrtrix(nthreads="foo") + assert "Please provide a positive integer" in str(exc.value) + + +def test_modelmrtrix_nthreads_negative(): + with pytest.raises(ValueError) as exc: + model = modelmrtrix(nthreads=-1) + assert "nthreads needs to be a valid positive integer" in str(exc.value) + + +def test_input_validator_path_invalid(): + with pytest.raises(TypeError) as exc: + path = input_path_validator(path=10) + assert "Please enter path as a string" in str(exc.value) + + +def test_input_validator_path_nonexistent(tmp_path): + input_path = str(tmp_path / "input.nii") + with pytest.raises(FileNotFoundError) as exc: + path = input_path_validator(path=input_path) + assert f"Input file ({input_path}) does not exist" in str(exc.value) + + +def test_input_validator_ctype_invalid(): + with pytest.raises(TypeError) as exc: + path = input_path_validator(path=PATH_DWI, ctype=20) + assert "ctype variable (ctype=20) needs to be a valid string" in str(exc.value) + + +def test_input_validator_ctype_check_fail(): + with pytest.raises(FileExtensionError) as exc: + path = input_path_validator(path=PATH_DWI, ctype=".tar") + assert f"Input file ({PATH_DWI}) does not posses the required .tar extension" in str(exc.value) + + +def test_input_validator_success(): + path = input_path_validator(path=PATH_DWI) + assert path == PATH_DWI + + +def test_output_validator_path_invalid(): + with pytest.raises(TypeError) as exc: + path = output_path_validator(path=10) + assert "Please enter path as a string" in str(exc.value) + + +def test_output_validator_basepath(): + with pytest.raises(OSError) as exc: + path = output_path_validator(path="nonexistent/output.nii") + assert "Pleasure ensure that the output parent directory exists" in str(exc.value) + + +def test_output_validator_ctype_invalid(): + with pytest.raises(TypeError) as exc: + path = output_path_validator(path=PATH_DWI, ctype=20) + assert "ctype variable (ctype=20) needs to be a valid string" in str(exc.value) + + +def test_output_validator_ctype_check_fail(): + with pytest.raises(FileExtensionError) as exc: + path = output_path_validator(path=PATH_DWI, ctype=".tar") + assert f"Input file ({PATH_DWI}) does not posses the required .tar extension" in str(exc.value) + + +def test_output_validator_success(tmp_path): + path = output_path_validator(path=PATH_DWI, ctype=".nii") + assert path == PATH_DWI From fc41bb6c2339a6991fe4403f417014fccb80347c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 10 Sep 2024 19:40:18 -0400 Subject: [PATCH 51/78] Remove redundancy in models.py --- pydesigner/system/models.py | 21 +++------------------ tests/test_models.py | 27 +-------------------------- 2 files changed, 4 insertions(+), 44 deletions(-) diff --git a/pydesigner/system/models.py b/pydesigner/system/models.py index 71e4d32..af38d1e 100644 --- a/pydesigner/system/models.py +++ b/pydesigner/system/models.py @@ -83,19 +83,13 @@ def input_path_validator(path: str, ctype: str = None): -------- output_path_validator """ - if not isinstance(path, str): - msg = f"Entered path ({path}) is not a valid string. " - msg += "Please enter path as a string." - raise TypeError(msg) + opts = modelmrtrix(input=path) if not ctype is None: if not isinstance(ctype, str): msg = f"ctype variable (ctype={ctype}) needs to be a valid string." raise(TypeError(msg)) - if not op.exists(path): - msg = f"Input file ({path}) does not exist." - raise FileNotFoundError(msg) if ctype: - if op.splitext(op.basename(path))[-1] != ctype: + if op.splitext(op.basename(opts.input))[-1] != ctype: msg = f"Input file ({path}) does not posses the required {ctype} extension." raise FileExtensionError(msg) return str(path) @@ -119,21 +113,12 @@ def output_path_validator(path: str, ctype: str = None): -------- input_path_validator """ - if not isinstance(path, str): - msg = f"Entered path ({path}) is not a valid string. " - msg += "Please enter path as a string." - raise TypeError(msg) if not ctype is None: if not isinstance(ctype, str): msg = f"ctype variable (ctype={ctype}) needs to be a valid string." raise(TypeError(msg)) - if not op.exists(op.dirname(path)): - msg = f"Specified directory ({op.dirname(path)}) for output file " - msg += f"({op.basename(path)}) does not exist. " - msg += "Pleasure ensure that the output parent directory exists." - raise OSError(msg) if ctype: if op.splitext(op.basename(path))[-1] != ctype: - msg = f"Input file ({path}) does not posses the required {ctype} extension." + msg = f"Output file ({path}) does not posses the required {ctype} extension." raise FileExtensionError(msg) return str(path) diff --git a/tests/test_models.py b/tests/test_models.py index 6728477..ddf24ab 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -79,19 +79,6 @@ def test_modelmrtrix_nthreads_negative(): assert "nthreads needs to be a valid positive integer" in str(exc.value) -def test_input_validator_path_invalid(): - with pytest.raises(TypeError) as exc: - path = input_path_validator(path=10) - assert "Please enter path as a string" in str(exc.value) - - -def test_input_validator_path_nonexistent(tmp_path): - input_path = str(tmp_path / "input.nii") - with pytest.raises(FileNotFoundError) as exc: - path = input_path_validator(path=input_path) - assert f"Input file ({input_path}) does not exist" in str(exc.value) - - def test_input_validator_ctype_invalid(): with pytest.raises(TypeError) as exc: path = input_path_validator(path=PATH_DWI, ctype=20) @@ -109,18 +96,6 @@ def test_input_validator_success(): assert path == PATH_DWI -def test_output_validator_path_invalid(): - with pytest.raises(TypeError) as exc: - path = output_path_validator(path=10) - assert "Please enter path as a string" in str(exc.value) - - -def test_output_validator_basepath(): - with pytest.raises(OSError) as exc: - path = output_path_validator(path="nonexistent/output.nii") - assert "Pleasure ensure that the output parent directory exists" in str(exc.value) - - def test_output_validator_ctype_invalid(): with pytest.raises(TypeError) as exc: path = output_path_validator(path=PATH_DWI, ctype=20) @@ -130,7 +105,7 @@ def test_output_validator_ctype_invalid(): def test_output_validator_ctype_check_fail(): with pytest.raises(FileExtensionError) as exc: path = output_path_validator(path=PATH_DWI, ctype=".tar") - assert f"Input file ({PATH_DWI}) does not posses the required .tar extension" in str(exc.value) + assert f"Output file ({PATH_DWI}) does not posses the required .tar extension" in str(exc.value) def test_output_validator_success(tmp_path): From 091da0698aa0e3ce9f3795679137c0c8cbe57590 Mon Sep 17 00:00:00 2001 From: TheJaeger Date: Tue, 10 Sep 2024 23:55:25 +0000 Subject: [PATCH 52/78] Pre-commit autofix --- pydesigner/system/errors.py | 5 +++-- pydesigner/system/models.py | 15 +++++++-------- tests/test_models.py | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pydesigner/system/errors.py b/pydesigner/system/errors.py index d1d332d..c534d11 100644 --- a/pydesigner/system/errors.py +++ b/pydesigner/system/errors.py @@ -1,3 +1,4 @@ class FileExtensionError(FileNotFoundError): - """Raise an exception for extension-related issues. """ - pass \ No newline at end of file + """Raise an exception for extension-related issues.""" + + pass diff --git a/pydesigner/system/models.py b/pydesigner/system/models.py index af38d1e..8a225f0 100644 --- a/pydesigner/system/models.py +++ b/pydesigner/system/models.py @@ -1,7 +1,8 @@ import os.path as op import typing as t -from pydantic import BaseModel, ValidationInfo, field_validator, StrictBool +from pydantic import BaseModel, StrictBool, ValidationInfo, field_validator + from .errors import FileExtensionError @@ -13,7 +14,7 @@ class modelmrtrix(BaseModel): nthreads: t.Optional[t.Union[int, t.Any]] = None verbose: t.Optional[StrictBool] = None force: t.Optional[StrictBool] = None - + @field_validator("input", mode="before") @classmethod def input_valid(cls, var: str, info: ValidationInfo) -> str: @@ -31,7 +32,6 @@ def input_valid(cls, var: str, info: ValidationInfo) -> str: raise FileNotFoundError(msg) return var - @field_validator("output", mode="before") @classmethod def output_valid(cls, var: str, info: ValidationInfo) -> str: @@ -46,7 +46,6 @@ def output_valid(cls, var: str, info: ValidationInfo) -> str: msg += "Pleasure ensure that the output parent directory exists." raise OSError(msg) return var - @field_validator("nthreads", mode="before") @classmethod @@ -84,10 +83,10 @@ def input_path_validator(path: str, ctype: str = None): output_path_validator """ opts = modelmrtrix(input=path) - if not ctype is None: + if ctype is not None: if not isinstance(ctype, str): msg = f"ctype variable (ctype={ctype}) needs to be a valid string." - raise(TypeError(msg)) + raise (TypeError(msg)) if ctype: if op.splitext(op.basename(opts.input))[-1] != ctype: msg = f"Input file ({path}) does not posses the required {ctype} extension." @@ -113,10 +112,10 @@ def output_path_validator(path: str, ctype: str = None): -------- input_path_validator """ - if not ctype is None: + if ctype is not None: if not isinstance(ctype, str): msg = f"ctype variable (ctype={ctype}) needs to be a valid string." - raise(TypeError(msg)) + raise (TypeError(msg)) if ctype: if op.splitext(op.basename(path))[-1] != ctype: msg = f"Output file ({path}) does not posses the required {ctype} extension." diff --git a/tests/test_models.py b/tests/test_models.py index ddf24ab..0f6c233 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -17,7 +17,7 @@ def test_modelmrtrix_input_nonexistent(tmp_path): input_nii = str(tmp_path / "input.nii") with pytest.raises(FileNotFoundError) as exc: model = modelmrtrix(input=input_nii) - assert f"Input file path ({input_nii}) does not exist" in str(exc.value) + assert f"Input file path ({input_nii}) does not exist" in str(exc.value) def test_modelmrtrix_input_basedir(): @@ -47,7 +47,7 @@ def test_modelmrtrix_output_success(tmp_path): output_nii = str(tmp_path / "output.nii") model = modelmrtrix(output=output_nii) assert model.output == output_nii - + def test_modelmrtrix_verbose_fail(): with pytest.raises(ValidationError) as exc: @@ -58,7 +58,7 @@ def test_modelmrtrix_verbose_fail(): def test_modelmrtrix_verbose_success(): model = modelmrtrix(verbose=True) print(model) - assert model.verbose == True + assert model.verbose == True def test_modelmrtrix_force_fail(): From 0ae2a99de2ebf49db6a6a80c60ce08496d431b1a Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 11 Sep 2024 00:04:09 -0400 Subject: [PATCH 53/78] Add more tests --- pydesigner/preprocessing/mrpreproc.py | 239 ++++++++++++-------------- pydesigner/system/errors.py | 4 + tests/test_preprocessing_mrpreproc.py | 236 +++++++++++++++---------- 3 files changed, 262 insertions(+), 217 deletions(-) diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index 08de7e5..79aae36 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -11,9 +11,16 @@ import numpy as np from ..preprocessing import mrinfoutil, rician, smoothing - - -def miftonii(input, output, nthreads=None, force=True, verbose=False): +from ..system.models import modelmrtrix, input_path_validator, output_path_validator +from ..system.errors import MRTrixError + +def miftonii( + input: str, + output: str, + nthreads: bool = None, + force: bool = True, verbose: + bool = False +) -> None: """Converts input `.mif` images to output `.nii` images Parameters @@ -39,45 +46,46 @@ def miftonii(input, output, nthreads=None, force=True, verbose=False): -------- niitomif """ - if not op.exists(input): - raise IOError("Input path does not exist. Please ensure that the folder or file specified exists.") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) - if op.splitext(output)[-1] != ".nii": - raise IOError("Output specified does not possess the .nii extension.") - if nthreads is not None: - if not isinstance(nthreads, int): - raise TypeError("Please specify the number of threads as an integer.") - if not isinstance(force, bool): - raise TypeError("Please specify whether forced overwrite is True or False.") - if not isinstance(verbose, bool): - raise TypeError("Please specify whether verbose is True or False.") + opts = modelmrtrix( + input=input, + output=output, + nthreads=nthreads, + force=force, + verbose=verbose + ) + input_path_validator(opts.input, ".mif") + output_path_validator(opts.output, ".nii") arg = ["mrconvert"] - if force: + if opts.force: arg.append("-force") - if not verbose: + if not opts.verbose: arg.append("-quiet") - if nthreads is not None: + if opts.nthreads is not None: arg.extend(["-nthreads", str(nthreads)]) arg.extend( [ "-export_grad_fsl", - op.splitext(output)[0] + ".bvec", - op.splitext(output)[0] + ".bval", + op.splitext(opts.output)[0] + ".bvec", + op.splitext(opts.output)[0] + ".bval", ] ) arg.extend(["-json_export", op.splitext(output)[0] + ".json"]) - arg.extend([input, output]) + arg.extend([opts.input, opts.output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Conversion from .mif to .nii failed; check " "above for errors.") - - -def niitomif(input, output, nthreads=None, force=True, verbose=False): + msg = f"Conversion from .mif to .nii failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise MRTrixError(msg) + + +def niitomif( + input: str, + output: str, + nthreads: bool = None, + force: bool = True, + verbose: bool = False +) -> None: """Converts input `.nii` images to output `.mif` images provided that all BVEC, BVAL and JSON files are provided and named same as input .nii @@ -104,49 +112,42 @@ def niitomif(input, output, nthreads=None, force=True, verbose=False): -------- miftonii """ - if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) - if op.splitext(output)[-1] != ".mif": - msg = "Output specified does not possess the .mif extension." - raise OSError(msg) - if not op.exists(op.splitext(input)[0] + ".bvec"): - msg = f"Unable to locate BVEC file {op.splitext(input)[0]}.bvec." - raise OSError(msg) - if not op.exists(op.splitext(input)[0] + ".bval"): - msg = f"Unable to locate BVAL file {op.splitext(input)[0]}.bval." - raise OSError(msg) - if not op.exists(op.splitext(input)[0] + ".json"): - msg = f"Unable to locate JSON file {op.splitext(input)[0]}.json" - raise OSError(msg) - if nthreads is not None: - if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an integer.") - if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True or False.") - if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") + opts = modelmrtrix( + input=input, + output=output, + nthreads=nthreads, + force=force, + verbose=verbose + ) + input_path_validator(opts.input, ".nii") + path_bvec = input_path_validator(op.splitext(opts.input)[0] + ".bvec", ".bvec") + path_bval = input_path_validator(op.splitext(opts.input)[0] + ".bval", ".bval") + path_json = input_path_validator(op.splitext(opts.input)[0] + ".json", ".json") + output_path_validator(opts.output, ".mif") arg = ["mrconvert"] - if force: + if opts.force: arg.append("-force") - if not verbose: + if not opts.verbose: arg.append("-quiet") - if nthreads is not None: - arg.extend(["-nthreads", str(nthreads)]) - arg.extend(["-fslgrad", op.splitext(input)[0] + ".bvec", op.splitext(input)[0] + ".bval"]) - arg.extend(["-json_import", op.splitext(input)[0] + ".json"]) - arg.extend([input, output]) + if opts.nthreads is not None: + arg.extend(["-nthreads", str(opts.nthreads)]) + arg.extend(["-fslgrad", path_bvec, path_bval]) + arg.extend(["-json_import", path_json]) + arg.extend([opts.input, opts.output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Conversion from .nii to .mif failed; check above for errors.") - - -def stride_match(target, moving, output, nthreads=None, force=True, verbose=False): + msg = f"Conversion from .nii to .mif failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise MRTrixError(msg) + +def stride_match( + target: str, moving: str, + output: str, + nthreads: bool = None, + force: bool = True, + verbose: bool = False +) -> None: """Matches strides on inputs target and moving by converting strides on moving image to those of target image. @@ -171,51 +172,40 @@ def stride_match(target, moving, output, nthreads=None, force=True, verbose=Fals ------- None; writes out file """ - if not op.exists(target): - raise OSError("Input target path does not exist. Please ensure that " "the folder or file specified exists.") - if op.splitext(target)[-1] not in [".nii", ".mif"]: - raise OSError("Input target image needs to be a .nii or .mif file") - if not op.exists(moving): - raise OSError("Input moving path does not exist. Please ensure that " "the folder or file specified exists.") - if op.splitext(moving)[-1] not in [".nii", ".mif"]: - raise OSError("Input moving image needs to be a .nii or .mif file") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) - if op.splitext(output)[-1] not in [".nii", ".mif"]: - raise OSError("Output specified does not possess the .nii " "extension.") - if nthreads is not None: - if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") - if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") - if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") + opts = modelmrtrix( + output=output, + nthreads=nthreads, + force=force, + verbose=verbose + ) + target = input_path_validator(target) + moving = input_path_validator(moving) + arg = ["mrconvert"] - if force: + if opts.force: arg.append("-force") - if not verbose: + if not opts.verbose: arg.append("-quiet") - if nthreads is not None: + if opts.nthreads is not None: arg.extend(["-nthreads", str(nthreads)]) - arg.extend(["-strides", target, moving, output]) + arg.extend(["-strides", target, moving, opts.output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Stride matching failed; check above for errors.") + msg = f"Stride matching failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise MRTrixError(msg) def denoise( - input, - output, - noisemap=True, - extent="5,5,5", - nthreads=None, - force=True, - verbose=False, -): + input: str, + output: str, + noisemap: bool = True, + extent: str = "5,5,5", + nthreads: bool = None, + force: bool = True, + verbose: bool = False, +) -> None: """Runs MRtrix3's `dwidenoise` command with optimal parameters for PyDesigner. @@ -244,41 +234,34 @@ def denoise( ------- None; writes out file """ - if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) + opts = modelmrtrix( + input=input, + output=output, + nthreads=nthreads, + force=force, + verbose=verbose + ) if not isinstance(noisemap, bool): - raise Exception("Please specify whether noisemap generation " "is True or False.") - if not isinstance(extent, str): - raise Exception("Please specify extent as a string formatted as " '"n,n,n".') - if nthreads is not None: - if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") - if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") - if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") - noisemap_path = op.join(op.dirname(input), "noisemap.nii") + raise TypeError("Please specify whether noisemap generation is True or False.") + noisemap_path = op.join(op.dirname(opts.output), "noisemap.nii") arg = ["dwidenoise"] - if force: + if opts.force: arg.append("-force") - if not verbose: + if not opts.verbose: arg.append("-quiet") - if nthreads is not None: + if opts.nthreads is not None: arg.extend(["-nthreads", str(nthreads)]) if noisemap: arg.extend(["-noise", noisemap_path]) if extent is not None: arg.extend(["-extent", extent]) - arg.extend([input, output]) + arg.extend([opts.input, opts.output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("dwidenoise failed, please look above for error " "sources.") + msg = f"Dwidenoise failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise MRTrixError(msg) def degibbs(input, output, nthreads=None, force=False, verbose=False): diff --git a/pydesigner/system/errors.py b/pydesigner/system/errors.py index d1d332d..cbb4daf 100644 --- a/pydesigner/system/errors.py +++ b/pydesigner/system/errors.py @@ -1,3 +1,7 @@ class FileExtensionError(FileNotFoundError): """Raise an exception for extension-related issues. """ + pass + +class MRTrixError(IOError): + """Raise an exception for MRPreproc-related issues. """ pass \ No newline at end of file diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index 7ef37a7..34862c0 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -1,9 +1,11 @@ import os import nibabel as nib import pytest +from unittest.mock import patch, MagicMock from conftest import load_data from pydesigner.preprocessing import mrpreproc, mrinfoutil +from pydesigner.system.errors import MRTrixError DATA = load_data(type="hifi") PATH_DWI = DATA["nifti"] @@ -15,123 +17,179 @@ PATH_JSON = DATA["json"] PATH_MIF = DATA["mif"] - -def test_miftonii_error_path(): - """Test whether function `miftonii` raises error on invalid path""" - with pytest.raises(IOError) as exc: - mrpreproc.miftonii("nonexistentfile", "output.nii") - assert "Input path does not exist" in str(exc.value) - - -def test_miftonii_missing_input(tmp_path): - """Test whether function `miftonii` raises error when input file is missing""" - input_mif = tmp_path / "input.nii" - output_nii = tmp_path / "output.nii" - with pytest.raises(IOError) as exc: - mrpreproc.miftonii(input_mif, output_nii) - assert "Input path does not exist" in str(exc.value) - - -def test_miftonii_error_directory(): - """Test whether function `miftonii` raises error on nonexistent directory""" - with pytest.raises(OSError) as exc: - mrpreproc.miftonii(PATH_MIF, "nonexistent/output.nii") - assert "Specifed directory for output file nonexistent does not exist" in str(exc.value) - - -def test_miftonii_error_input(tmp_path): - """Test whether function `miftonii` raises error on invalid output file""" - output_nii = tmp_path / "output.tar" - with pytest.raises(IOError) as exc: - mrpreproc.miftonii(PATH_MIF, output_nii) - assert "Output specified does not possess the .nii extension" in str(exc.value) - - -def test_miftonii_success(tmp_path): - """Test whether function `miftonii` successfully converts a valid MIF file to NIfTI""" - output_nii = tmp_path / "output.nii" - mrpreproc.miftonii(PATH_MIF, output_nii) - assert os.path.exists(output_nii) - - -def test_miftonii_output_correctness_image(tmp_path): +def test_miftonii_output_failure(tmp_path): + """Test whether function `miftonii` fails when return code is non-zero""" + output_nii = str(tmp_path / "output.nii") + output_bval = str(tmp_path / "output.bval") + output_bvec = str(tmp_path / "output.bvec") + with patch("subprocess.run") as mock_subprocess: + mock_subprocess.return_value = MagicMock( + returncode=1, stderr="stderr" + ) + with pytest.raises(MRTrixError) as exc: + mrpreproc.miftonii(PATH_MIF, output_nii) + assert f"Conversion from .mif to .nii failed" in str(exc.value) + assert "stderr" in str(exc.value) + + +@pytest.mark.parametrize( + "nthreads, force, verbose", + [ + (None, None, None), + (1, None, None), + (None, True, None), + (None, False, None), + (None, None, True), + (None, None, False), + ] +) +def test_miftonii_output_success(tmp_path, nthreads, force, verbose): """Test whether function `miftonii` generates a valid NIfTI file""" - output_nii = tmp_path / "output.nii" - output_bval = tmp_path / "output.bval" - output_bvec = tmp_path / "output.bvec" - mrpreproc.miftonii(PATH_MIF, output_nii) + output_nii = str(tmp_path / "output.nii") + output_bval = str(tmp_path / "output.bval") + output_bvec = str(tmp_path / "output.bvec") + mrpreproc.miftonii(PATH_MIF, output_nii, nthreads=nthreads, force=force, verbose=verbose) assert os.path.exists(output_nii) assert os.path.exists(output_bval) assert os.path.exists(output_bvec) - assert(os.path.splitext(output_nii))[-1] == ".nii" + assert os.path.splitext(output_nii)[-1] == ".nii" img = nib.load(output_nii) assert type(img).__name__ == "Nifti1Image" assert img.shape == (2, 2, 2, 337) -def test_niitomif_error_path(): - """Test whether function `miftonii` raises error on invalid path""" - with pytest.raises(IOError) as exc: - mrpreproc.niitomif("nonexistentfile", "output.mif") - assert "Input path does not exist" in str(exc.value) - - -def test_niitomif_missing_input(tmp_path): - """Test whether function `niitomif` raises error when input file is missing""" - input_nii = tmp_path / "input.nii" - output_mif = tmp_path / "output.mif" - with pytest.raises(IOError) as exc: - mrpreproc.miftonii(input_nii, output_mif) - assert "Input path does not exist" in str(exc.value) - - -def test_niitomif_error_directory(): - """Test whether function `niitomif` raises error on nonexistent directory""" - with pytest.raises(OSError) as exc: - mrpreproc.niitomif(PATH_DWI, "nonexistent/output.mif") - assert "Specifed directory for output file nonexistent does not exist" in str(exc.value) - - -def test_niitomif_error_output(tmp_path): - """Test whether function `niitomif` raises error on invalid output file""" - output_mif = tmp_path / "output.tar" - with pytest.raises(IOError) as exc: - mrpreproc.niitomif(PATH_DWI, output_mif) - assert "Output specified does not possess the .mif extension" in str(exc.value) - - def test_niitomif_failure_bval(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" - output_mif = tmp_path / "output.mif" + output_mif = str(tmp_path / "output.mif") with pytest.raises(OSError) as exc: mrpreproc.niitomif(PATH_DWI_NO_BVAL, output_mif) - assert f"Unable to locate BVAL file {os.path.splitext(PATH_DWI_NO_BVAL)[0]}.bval" in str(exc.value) + assert f"Input file path ({os.path.splitext(PATH_DWI_NO_BVAL)[0]}.bval) does not exist" in str(exc.value) def test_niitomif_failure_bvec(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" - output_mif = tmp_path / "output.mif" + output_mif = str(tmp_path / "output.mif") with pytest.raises(OSError) as exc: mrpreproc.niitomif(PATH_DWI_NO_BVEC, output_mif) - assert f"Unable to locate BVEC file {os.path.splitext(PATH_DWI_NO_BVEC)[0]}.bvec" in str(exc.value) + assert f"Input file path ({os.path.splitext(PATH_DWI_NO_BVEC)[0]}.bvec) does not exist" in str(exc.value) def test_niitomif_failure_json(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" - output_mif = tmp_path / "output.mif" + output_mif = str(tmp_path / "output.mif") with pytest.raises(OSError) as exc: mrpreproc.niitomif(PATH_DWI_NO_JSON, output_mif) - assert f"Unable to locate JSON file {os.path.splitext(PATH_DWI_NO_JSON)[0]}.json" in str(exc.value) - -def test_niitomif_success(tmp_path): + assert f"Input file path ({os.path.splitext(PATH_DWI_NO_JSON)[0]}.json) does not exist" in str(exc.value) + + +def test_niitomif_output_failure(tmp_path): + """Test whether function `niitomif` fails when return code is non-zero""" + output_mif = str(tmp_path / "output.mif") + with patch("subprocess.run") as mock_subprocess: + mock_subprocess.return_value = MagicMock( + returncode=1, stderr="stderr" + ) + with pytest.raises(MRTrixError) as exc: + mrpreproc.niitomif(PATH_DWI, output_mif) + assert f"Conversion from .nii to .mif failed" in str(exc.value) + assert "stderr" in str(exc.value) + + +@pytest.mark.parametrize( + "nthreads, force, verbose", + [ + (None, None, None), + (1, None, None), + (None, True, None), + (None, False, None), + (None, None, True), + (None, None, False), + ] +) +def test_niitomif_success(tmp_path, nthreads, force, verbose): """Test whether function `niitomif` successfully converts a valid NifTI file to MIF""" - output_mif = tmp_path / "output.mif" - mrpreproc.niitomif(PATH_DWI, output_mif) + output_mif = str(tmp_path / "output.mif") + mrpreproc.niitomif(PATH_DWI, output_mif, nthreads=nthreads, force=force, verbose=verbose) assert os.path.exists(output_mif) + assert mrinfoutil.format(output_mif) == "MRtrix" + mrinfoutil.size(output_mif) == (2, 2, 2, 337) -def test_niitomif_output_correctness_image(tmp_path): - output_mif = tmp_path / "output.mif" - mrpreproc.niitomif(PATH_DWI, output_mif) +def test_stride_match_output_failure(tmp_path): + """Test whether function `stride_match` fails when return code is non-zero""" + output_nii = str(tmp_path / "output.nii") + with patch("subprocess.run") as mock_subprocess: + mock_subprocess.return_value = MagicMock( + returncode=1, stderr="stderr" + ) + with pytest.raises(MRTrixError) as exc: + mrpreproc.stride_match(PATH_DWI, PATH_DWI_NO_BVAL, output_nii) + assert f"Stride matching failed" in str(exc.value) + assert "stderr" in str(exc.value) + + +@pytest.mark.parametrize( + "nthreads, force, verbose", + [ + (None, None, None), + (1, None, None), + (None, True, None), + (None, False, None), + (None, None, True), + (None, None, False), + ] +) +def test_stride_match_output_success(tmp_path, nthreads, force, verbose): + """Test whether function `stride_match` fails when return code is non-zero""" + output_mif = str(tmp_path / "output.mif") + mrpreproc.stride_match(PATH_DWI, PATH_DWI_NO_BVAL, output_mif, nthreads=nthreads, force=force, verbose=verbose) + assert os.path.exists(output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) + assert mrinfoutil.strides(output_mif) == (1, 2, 3, 4) + + +def test_denoise_noisemap_invalid(tmp_path): + """Test whether function `denoise` fails when noisemap is invalid""" + output_mif = str(tmp_path / "output.mif") + with pytest.raises(TypeError) as exc: + mrpreproc.denoise(PATH_DWI, output_mif, noisemap="invalid") + assert "Please specify whether noisemap generation is True or False" in str(exc.value) + + +def test_denoise_output_failure(tmp_path): + """Test whether function `stride_match` fails when return code is non-zero""" + output_nii = str(tmp_path / "output.nii") + with patch("subprocess.run") as mock_subprocess: + mock_subprocess.return_value = MagicMock( + returncode=1, stderr="stderr" + ) + with pytest.raises(MRTrixError) as exc: + mrpreproc.denoise(PATH_DWI, output_nii, noisemap=True, extent="1,1,1") + assert f"Dwidenoise failed" in str(exc.value) + assert "stderr" in str(exc.value) + + +@pytest.mark.parametrize( + "nthreads, force, verbose", + [ + (None, None, None), + (1, None, None), + (None, True, None), + (None, False, None), + (None, None, True), + (None, None, False), + ] +) +def test_denoise_output_success(tmp_path, nthreads, force, verbose): + """Test whether function `denoise` successfully denoises a DWI dataset""" + output_nii = str(tmp_path / "output.nii") + noisemap_nii = str(tmp_path / "noisemap.nii") + mrpreproc.denoise(PATH_DWI, output_nii, noisemap=True, extent="1,1,1", nthreads=nthreads, force=force, verbose=verbose) + assert os.path.exists(output_nii) + assert os.path.exists(noisemap_nii) + assert mrinfoutil.format(output_nii) == "NIfTI-1.1" + mrinfoutil.size(output_nii) == (2, 2, 2, 337) + + + From bbdb1ce3edd9a9c79e8fb851e5b2ef9b1f996b7b Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 11 Sep 2024 00:06:14 -0400 Subject: [PATCH 54/78] Linting --- pydesigner/preprocessing/mrpreproc.py | 57 +++++---------------------- pydesigner/system/errors.py | 6 ++- tests/test_preprocessing_mrpreproc.py | 3 -- 3 files changed, 14 insertions(+), 52 deletions(-) diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index 79aae36..5956e51 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -11,16 +11,11 @@ import numpy as np from ..preprocessing import mrinfoutil, rician, smoothing -from ..system.models import modelmrtrix, input_path_validator, output_path_validator from ..system.errors import MRTrixError +from ..system.models import input_path_validator, modelmrtrix, output_path_validator -def miftonii( - input: str, - output: str, - nthreads: bool = None, - force: bool = True, verbose: - bool = False -) -> None: + +def miftonii(input: str, output: str, nthreads: bool = None, force: bool = True, verbose: bool = False) -> None: """Converts input `.mif` images to output `.nii` images Parameters @@ -46,13 +41,7 @@ def miftonii( -------- niitomif """ - opts = modelmrtrix( - input=input, - output=output, - nthreads=nthreads, - force=force, - verbose=verbose - ) + opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) input_path_validator(opts.input, ".mif") output_path_validator(opts.output, ".nii") arg = ["mrconvert"] @@ -79,13 +68,7 @@ def miftonii( raise MRTrixError(msg) -def niitomif( - input: str, - output: str, - nthreads: bool = None, - force: bool = True, - verbose: bool = False -) -> None: +def niitomif(input: str, output: str, nthreads: bool = None, force: bool = True, verbose: bool = False) -> None: """Converts input `.nii` images to output `.mif` images provided that all BVEC, BVAL and JSON files are provided and named same as input .nii @@ -112,13 +95,7 @@ def niitomif( -------- miftonii """ - opts = modelmrtrix( - input=input, - output=output, - nthreads=nthreads, - force=force, - verbose=verbose - ) + opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) input_path_validator(opts.input, ".nii") path_bvec = input_path_validator(op.splitext(opts.input)[0] + ".bvec", ".bvec") path_bval = input_path_validator(op.splitext(opts.input)[0] + ".bval", ".bval") @@ -141,12 +118,9 @@ def niitomif( msg += f"\nMRtrix3 error: {completion.stderr}" raise MRTrixError(msg) + def stride_match( - target: str, moving: str, - output: str, - nthreads: bool = None, - force: bool = True, - verbose: bool = False + target: str, moving: str, output: str, nthreads: bool = None, force: bool = True, verbose: bool = False ) -> None: """Matches strides on inputs target and moving by converting strides on moving image to those of target image. @@ -172,12 +146,7 @@ def stride_match( ------- None; writes out file """ - opts = modelmrtrix( - output=output, - nthreads=nthreads, - force=force, - verbose=verbose - ) + opts = modelmrtrix(output=output, nthreads=nthreads, force=force, verbose=verbose) target = input_path_validator(target) moving = input_path_validator(moving) @@ -234,13 +203,7 @@ def denoise( ------- None; writes out file """ - opts = modelmrtrix( - input=input, - output=output, - nthreads=nthreads, - force=force, - verbose=verbose - ) + opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) if not isinstance(noisemap, bool): raise TypeError("Please specify whether noisemap generation is True or False.") noisemap_path = op.join(op.dirname(opts.output), "noisemap.nii") diff --git a/pydesigner/system/errors.py b/pydesigner/system/errors.py index 5e24e4d..0afa16f 100644 --- a/pydesigner/system/errors.py +++ b/pydesigner/system/errors.py @@ -3,6 +3,8 @@ class FileExtensionError(FileNotFoundError): pass + class MRTrixError(IOError): - """Raise an exception for MRPreproc-related issues. """ - pass \ No newline at end of file + """Raise an exception for MRPreproc-related issues.""" + + pass diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index 34862c0..d9c99d5 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -190,6 +190,3 @@ def test_denoise_output_success(tmp_path, nthreads, force, verbose): assert os.path.exists(noisemap_nii) assert mrinfoutil.format(output_nii) == "NIfTI-1.1" mrinfoutil.size(output_nii) == (2, 2, 2, 337) - - - From 8f24668177e9b354e099bab9f4be72c12a97bd6c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 11 Sep 2024 19:36:25 -0400 Subject: [PATCH 55/78] Save tests and code changes [WIP] --- pydesigner/fitting/dwipy.py | 52 +++--- pydesigner/preprocessing/mrpreproc.py | 145 +++++++--------- tests/test_fitting_dwipy.py | 220 +++++++++++++++---------- tests/test_preprocessing_mrinfoutil.py | 5 + tests/test_preprocessing_mrpreproc.py | 115 +++++++++++-- 5 files changed, 331 insertions(+), 206 deletions(-) diff --git a/pydesigner/fitting/dwipy.py b/pydesigner/fitting/dwipy.py index df113d2..5168702 100644 --- a/pydesigner/fitting/dwipy.py +++ b/pydesigner/fitting/dwipy.py @@ -15,7 +15,8 @@ from ..plotting import outlierplot from ..system.utils import highprecisionexp, highprecisionpower, vectorize, writeNii -from ..tractography import dsistudio, odf, sphericalsampling +from ..tractography import dsistudio, odf, sphericalsampling +from ..system.models import input_path_validator from . import dwi_fnames, dwidirs from . import thresholds as th @@ -77,7 +78,8 @@ def __init__( all physically present workers). """ if not os.path.exists(imPath): - raise OSError("Input image {} not found".format(imPath)) + msg = f"Input image ({imPath}) not found." + raise FileNotFoundError(msg) self.hdr = nib.load(imPath) self.img = np.array(self.hdr.dataobj) truncateIdx = np.logical_or(np.isnan(self.img), (self.img < minZero)) @@ -87,17 +89,11 @@ def __init__( # Remove extension from NIFTI filename fName = os.path.splitext(file)[0] if bvecPath: - if not isinstance(bvecPath, str): - raise TypeError("Path to .bvec is not specified " "as a string") - if not os.path.exists(bvecPath): - raise OSError("Path to .bvec does not exist: " "{}".format(bvecPath)) + input_path_validator(bvecPath, ".bvec") else: bvecPath = os.path.join(path, fName + ".bvec") if bvalPath: - if not isinstance(bvalPath, str): - raise TypeError("Path to .bval is not specified " "as a string") - if not os.path.exists(bvalPath): - raise OSError("Path to .bvec does not exist: " "{}".format(bvalPath)) + input_path_validator(bvalPath, ".bval") else: bvalPath = os.path.join(path, fName + ".bval") if os.path.exists(bvalPath) and os.path.exists(bvecPath): @@ -113,7 +109,11 @@ def __init__( # number of DWI volumes. [Gx Gy Gz Bval] self.grad = np.c_[np.transpose(bvecs), bvals] else: - raise OSError("Unable to locate BVAL or BVEC files") + msg = "Unable to locate BVAL or BVEC files" + msg += "\nPaths being used are:" + msg += f"\nBVAL: {bvalPath}" + msg += f"\nBVEC: {bvecPath}" + raise OSError(msg) if mask is None: maskPath = os.path.join(path, "brain_mask.nii") else: @@ -125,13 +125,16 @@ def __init__( else: self.mask = np.ones((self.img.shape[0], self.img.shape[1], self.img.shape[2]), order="F") self.maskStatus = False - print("No brain mask supplied") - tqdm.write("Image " + fName + ".nii loaded successfully") + msg = "No brain mask supplied" + print(msg) + tqdm.write(f"Image {fName}.nii loaded successfully") if nthreads is not None: if not isinstance(nthreads, int): - raise TypeError("Variable nthreads need to be an integer") + msg = "Variable nthreads need to be an integer" + raise TypeError(msg) if nthreads < -1 or nthreads == 0: - raise ValueError("Variable nthreads is a positive integer or -1") + msg = "Variable nthreads is a positive integer or -1" + raise ValueError(msg) if nthreads is None: self.workers = -1 else: @@ -170,7 +173,7 @@ def getBvecs(self) -> np.ndarray: """ return self.grad[:, 0:3] - def maxBval(self) -> float: + def maxBval(self) -> int: """Returns the maximum b-value in a dataset to determine between DTI and DKI, requires no input parameters. @@ -184,9 +187,9 @@ def maxBval(self) -> float: a = dwi.maxBval(), where dwi is the DWI class object. """ - return max(np.unique(self.grad[:, 3])).astype(int) + return int(max(np.unique(self.grad[:, 3]))) - def maxDTIBval(self) -> float: + def maxDTIBval(self) -> int: """Returns the maximum DTI b-value in a dataset. Returns @@ -200,9 +203,9 @@ def maxDTIBval(self) -> float: """ exclude_idx = self.grad[:, 3] <= th.__maxdtibval__ - return max(np.unique(self.grad[exclude_idx, 3])).astype(int) + return int(max(np.unique(self.grad[exclude_idx, 3]))) - def maxDKIBval(self) -> float: + def maxDKIBval(self) -> int: """Returns the maximum DKI b-value in a dataset. Returns @@ -216,9 +219,9 @@ def maxDKIBval(self) -> float: """ exclude_idx = self.grad[:, 3] <= th.__maxdkibval__ - return max(np.unique(self.grad[exclude_idx, 3])).astype(int) + return int(max(np.unique(self.grad[exclude_idx, 3]))) - def maxFBIBval(self) -> float: + def maxFBIBval(self) -> int: """Returns the maximum FBI b-value in a dataset. Returns @@ -232,7 +235,7 @@ def maxFBIBval(self) -> float: """ exclude_idx = self.grad[:, 3] <= th.__maxfbibval__ - return max(np.unique(self.grad[exclude_idx, 3])).astype(int) + return int(max(np.unique(self.grad[exclude_idx, 3]))) def idxb0(self) -> np.ndarray[bool]: """Returns the index of all B-zeros according to bvals @@ -1015,7 +1018,8 @@ def createConstraints(self, constraints: List[int] = [0, 1, 0]) -> np.ndarray[fl axis=0, ) else: - print('Invalid constraints. Please use format "[0, 0, 0]"') + msg = "Invalid contraints. Please use format [0, 0, 0]" + raise ValueError(msg) return C def extractDTI( diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index 5956e51..a471c39 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -15,7 +15,7 @@ from ..system.models import input_path_validator, modelmrtrix, output_path_validator -def miftonii(input: str, output: str, nthreads: bool = None, force: bool = True, verbose: bool = False) -> None: +def miftonii(input: str, output: str, nthreads: int = None, force: bool = True, verbose: bool = False) -> None: """Converts input `.mif` images to output `.nii` images Parameters @@ -41,7 +41,7 @@ def miftonii(input: str, output: str, nthreads: bool = None, force: bool = True, -------- niitomif """ - opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".nii"), nthreads=nthreads, force=force, verbose=verbose) input_path_validator(opts.input, ".mif") output_path_validator(opts.output, ".nii") arg = ["mrconvert"] @@ -68,7 +68,7 @@ def miftonii(input: str, output: str, nthreads: bool = None, force: bool = True, raise MRTrixError(msg) -def niitomif(input: str, output: str, nthreads: bool = None, force: bool = True, verbose: bool = False) -> None: +def niitomif(input: str, output: str, nthreads: int = None, force: bool = True, verbose: bool = False) -> None: """Converts input `.nii` images to output `.mif` images provided that all BVEC, BVAL and JSON files are provided and named same as input .nii @@ -95,7 +95,7 @@ def niitomif(input: str, output: str, nthreads: bool = None, force: bool = True, -------- miftonii """ - opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix(input=input_path_validator(input, ".nii"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) input_path_validator(opts.input, ".nii") path_bvec = input_path_validator(op.splitext(opts.input)[0] + ".bvec", ".bvec") path_bval = input_path_validator(op.splitext(opts.input)[0] + ".bval", ".bval") @@ -120,7 +120,7 @@ def niitomif(input: str, output: str, nthreads: bool = None, force: bool = True, def stride_match( - target: str, moving: str, output: str, nthreads: bool = None, force: bool = True, verbose: bool = False + target: str, moving: str, output: str, nthreads: int = None, force: bool = True, verbose: bool = False ) -> None: """Matches strides on inputs target and moving by converting strides on moving image to those of target image. @@ -171,7 +171,7 @@ def denoise( output: str, noisemap: bool = True, extent: str = "5,5,5", - nthreads: bool = None, + nthreads: int = None, force: bool = True, verbose: bool = False, ) -> None: @@ -203,7 +203,7 @@ def denoise( ------- None; writes out file """ - opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) if not isinstance(noisemap, bool): raise TypeError("Please specify whether noisemap generation is True or False.") noisemap_path = op.join(op.dirname(opts.output), "noisemap.nii") @@ -227,7 +227,13 @@ def denoise( raise MRTrixError(msg) -def degibbs(input, output, nthreads=None, force=False, verbose=False): +def degibbs( + input: str, + output: str, + nthreads: int = None, + force: bool = False, + verbose: bool = False +) -> None: """Runs MRtrix3's `mrdegibbs` command with optimal parameters for PyDesigner. @@ -250,32 +256,21 @@ def degibbs(input, output, nthreads=None, force=False, verbose=False): ------- None; writes out file """ - if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) - if nthreads is not None: - if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") - if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") - if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") + opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) arg = ["mrdegibbs"] - if force: + if opts.force: arg.append("-force") - if not verbose: + if not opts.verbose: arg.append("-quiet") - if nthreads is not None: + if opts.nthreads is not None: arg.extend(["-nthreads", str(nthreads)]) - arg.extend([input, output]) + arg.extend([opts.input, opts.output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("mrdegibbs failed, please look above for error " "sources.") + msg = f"Mrdegibbs failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise MRTrixError(msg) def undistort( @@ -297,7 +292,7 @@ def undistort( Path to input .mif file output : str Path to output .mif file - rpe : str, {'rpe_header', 'rpe-pair', 'rpe_all, 'rpe_all'}, optional + rpe : str, {'rpe_header', 'rpe-pair', 'rpe_none, 'rpe_all'}, optional Reverse phase encoding of the dataset. (Default: 'rpe_header') epib0 : int Number of reverse PE dir B0 pairs to use in TOPUP correction @@ -317,37 +312,25 @@ def undistort( ------- None; writes out file """ - if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) + opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) + if rpe not in ["rpe_none", "rpe_pair", "rpe_all", "rpe_header"]: - raise Exception( - "Entered RPE selection is not valid. Please " - 'choose either "rpe_none", "rpe_pair", ' - '"rpe_all", or "rpe_header".' - ) + msg = "Entered RPE selection is not valid. Please choose either " + msg += "'rpe_none', 'rpe_pair' 'rpe_all', or 'rpe_header'" + raise ValueError(msg) if not isinstance(epib0, int): - raise Exception("Number of TOPUP B0s need to be specified as " "as an integer.") + msg = "Number of TOPUP B0s need to be specified as a positive integer." + raise ValueError(msg) if qc is not None: if not isinstance(qc, str): - raise Exception("Please specify QC directory as a string") + msg = "Please specify QC directory as a string" + raise TypeError(msg) if not op.exists(qc): - raise OSError("Specified QC directory does not exist. " "Please ensure that this is a valid " "directory.") - if nthreads is not None: - if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") - if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") - if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") + msg = "Specified QC directory does not exist. Please ensure that this is a valid directory." + raise OSError(msg) rpe = "-" + rpe # Get output directory - outdir = op.dirname(output) + outdir = op.dirname(opts.output) # Extract BVEC and BVALS for shell sampling deduction arg_extract = ["mrinfo"] arg_extract.extend( @@ -357,23 +340,24 @@ def undistort( op.join(outdir, "dwiec.bval"), ] ) - arg_extract.append(input) + arg_extract.append(opts.input) completion = subprocess.run(arg_extract) if completion.returncode != 0: - raise Exception( - "extracting FSL BVEC and BVEC gradients " "failed during undistortion, please look " "above for errors." - ) + msg = "Extraction of FSL BVEC and BVAL gradients failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg_extract)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise MRTrixError(msg) # Form main undistortion argument arg = [] if which("dwipreproc") is None: arg.append("dwifslpreproc") else: arg.append("dwipreproc") - if force: + if opts.force: arg.append("-force") - if not verbose: + if not opts.verbose: arg.append("-quiet") - if nthreads is not None: + if opts.nthreads is not None: arg.extend(["-nthreads", str(nthreads)]) # Determine whether half or full sphere sampling repol_string = "--repol " @@ -407,10 +391,13 @@ def undistort( arg.append(rpe) if qc is not None: arg.extend(["-eddyqc_all", qc]) - arg.extend([input, output]) + arg.extend([opts.input, opts.output]) completion = subprocess.run(arg, cwd=outdir) if completion.returncode != 0: - raise Exception("dwifslpreproc failed, please look above for " "error sources.") + msg = "Dwifslpreproc failed. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg_extract)}" + msg += f"\nMRtrix3 error: {completion.stderr}" + raise(MRTrixError(msg)) # Remove temporarily generated files os.remove(op.join(outdir, "dwiec.bvec")) os.remove(op.join(outdir, "dwiec.bval")) @@ -446,48 +433,34 @@ def brainmask(input, output, thresh=0.25, nthreads=None, force=False, verbose=Fa ------- None; writes out file """ - if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") - if not op.exists(op.dirname(output)): - raise OSError( - "Specifed directory for output file {} does not " - "exist. Please ensure that this is a valid " - "directory.".format(op.dirname(output)) - ) + opts = modelmrtrix(input=input, output=output, nthreads=nthreads, force=force, verbose=verbose) if (thresh < 0) or (thresh > 1): raise ValueError("BET Threshold needs to be within 0 to 1 range.") - if nthreads is not None: - if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") - if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") - if not isinstance(verbose, bool): - raise Exception("Please specify whether verbose is True or False.") # Read FSL NifTi output format and change it if not '.nii' fsl_suffix = os.getenv("FSLOUTPUTTYPE") if fsl_suffix is None: - raise OSError( - "Unable to determine system environment variable " - "FSF_OUTPUT_FORMAT. Ensure that FSL is installed " - "correctly." - ) + msg = "Unable to determine system environment variable 'FSF_OUTPUT_FORMAT'. Ensure that FSL is installed correctly." + raise OSError(msg) if fsl_suffix == "NIFTI_GZ": os.environ["FSLOUTPUTTYPE"] = "NIFTI" - outdir = op.dirname(output) + outdir = op.dirname(opts.output) B0_nan = op.join(outdir, "B0_nan.nii") mask = op.join(outdir, "brain") tmp_brain = op.join(outdir, "brain.nii") # Extract averaged B0 from DWI - extractmeanbzero(input=input, output=B0_nan, nthreads=nthreads, force=force, verbose=verbose) + extractmeanbzero(input=opts.input, output=B0_nan, nthreads=opts.nthreads, force=opts.force, verbose=opts.verbose) # Compute brain mask arg_mask = ["bet", B0_nan, mask, "-m", "-f", str(thresh)] completion = subprocess.run(arg_mask) if completion.returncode != 0: - raise Exception("Unable to compute brain mask from B0. See above " "for errors") + msg = f"Unable to compute brain mask from B0. Return code: {completion.returncode}" + msg += f"\nCommand: {' '.join(arg_mask)}" + msg += f"\FSL error: {completion.stderr}" + raise MRTrixError(msg) # Remove intermediary file os.remove(B0_nan) os.remove(tmp_brain) - os.rename(op.join(outdir, mask + "_mask.nii"), output) + os.rename(op.join(outdir, mask + "_mask.nii"), opts.output) def csfmask( diff --git a/tests/test_fitting_dwipy.py b/tests/test_fitting_dwipy.py index 922857f..5a69f88 100644 --- a/tests/test_fitting_dwipy.py +++ b/tests/test_fitting_dwipy.py @@ -1,89 +1,72 @@ -import numpy as np +import os.path as op +import nibabel as nib import pytest +import numpy as np from conftest import load_data from pydesigner.fitting.dwipy import DWI +from pydesigner.fitting.dwidirs import dirs30 DATA = load_data(type="hifi") PATH_DWI = DATA["nifti"] PATH_BVEC = DATA["bvec"] PATH_BVAL = DATA["bval"] -PATH_JSON = DATA["json"] -PATH_MIF = DATA["mif"] +PATH_MASK = DATA["mask"] +def test_dwi_init_image_nonexistent(tmp_path): + input_nii = str(tmp_path / "nonexistent.nii") + with pytest.raises(FileNotFoundError) as exc: + dwi = DWI(input_nii, PATH_BVEC, PATH_BVEC, PATH_BVAL, PATH_MASK) + assert f"Input image ({input_nii}) not found" in str(exc.value) -def test_dwi_image_path_nonexistent(): - """Tests whether function raises OSError when input is not found""" - with pytest.raises(OSError): - DWI("foo") +def test_dwi_init_bvec_invalid(tmp_path): + with pytest.raises(TypeError) as exc: + dwi = DWI(PATH_DWI, 50, PATH_BVAL, PATH_MASK) + assert "Input file path (input=50) is not a string type." in str(exc.value) -def test_dwi_bvec_path_invalid(): - """Tests whether function raises TypeError when bvec file input is invalid""" - with pytest.raises(TypeError): - DWI(PATH_DWI, bvecPath=10) +def test_dwi_init_bvec_nonexistent(tmp_path): + input_bvec = str(tmp_path / "nonexistent.bvec") + with pytest.raises(FileNotFoundError) as exc: + dwi = DWI(PATH_DWI, input_bvec, PATH_BVAL, PATH_MASK) + assert f"Input file path ({input_bvec}) does not exist." in str(exc.value) -def test_dwi_bvec_path_nonexistent(): - """Tests whether function raises OSError when bvec file is not found""" - with pytest.raises(OSError): - DWI(PATH_DWI, bvecPath="foo") - -def test_dwi_bval_path_invalid(): - """Tests whether function raises TypeError when bval file input is invalid""" - with pytest.raises(TypeError): - DWI(PATH_DWI, bvalPath=10) +def test_dwi_init_bval_invalid(tmp_path): + with pytest.raises(TypeError) as exc: + dwi = DWI(PATH_DWI, PATH_BVEC, 50, PATH_MASK) + assert "Input file path (input=50) is not a string type" in str(exc.value) -def test_dwi_bval_path_nonexistent(): - """Tests whether function raises OSError when bval file is not found""" - with pytest.raises(OSError): - DWI(PATH_DWI, bvalPath="foo") +def test_dwi_init_bval_nonexistent(tmp_path): + input_bval = str(tmp_path / "nonexistent.bval") + with pytest.raises(OSError) as exc: + dwi = DWI(PATH_DWI, PATH_BVEC, input_bval, PATH_MASK) + assert f"Input file path ({input_bval}) does not exist." in str(exc.value) -def test_dwi_mask_path_nonexistent(capsys): - """Tests whether function raises OSError when mask file is not found""" - DWI(PATH_DWI, mask="foo") +def test_dwi_init_mask_nonexistent(tmp_path, capsys): + input_mask = str(tmp_path / "nonexistent.nii") + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, input_mask) captured = capsys.readouterr() assert "No brain mask supplied" in captured.out -def test_dwi_path_nosidecar(): - """Tests whether function raises OSError when sidecar files are not found""" - with pytest.raises(OSError): - DWI(DATA["no_sidecar"]) - - -def test_dwi_nthreads_nonint(): - """Tests whether function raises TypeError when nthreads is not an int""" - with pytest.raises(TypeError): - DWI(PATH_DWI, nthreads="foo") - - -def test_dwi_nthreads_negative_int(): - """Tests whether function raises ValueError when nthreads is negative""" - with pytest.raises(ValueError): - DWI(PATH_DWI, nthreads=-5) - - -def test_dwi_paths_valid(capsys): - """Tests whether function responds normally when all paths are valid""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) +def test_dwi_init_success(capsys): + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) captured = capsys.readouterr() - print(captured.out) - assert dwi is not None - assert "Image hifi_splenium_4vox.nii loaded successfully" in captured.out - assert "Processing with" in captured.out - assert "workers..." in captured.out + assert dwi.hdr.header.get_data_shape() == (2, 2, 2, 337) + assert np.shape(dwi.grad) == (337, 4) + assert f"Image {op.basename(PATH_DWI)} loaded successfully" in captured.out def test_dwi_get_bvals(): """Tests whether function returns correct bvals""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) bvals = dwi.getBvals() assert bvals.dtype == np.float64 - assert len(bvals) == 337 + assert np.shape(bvals) == (337,) assert 0 in bvals assert 1 in bvals assert 2 in bvals @@ -92,7 +75,7 @@ def test_dwi_get_bvals(): def test_dwi_get_bvecs(): """Tests whether function returns correct bvecs""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) bvecs = dwi.getBvecs() assert bvecs.dtype == np.float64 assert bvecs.shape == (337, 3) @@ -100,35 +83,39 @@ def test_dwi_get_bvecs(): def test_dwi_max_bval(): """Tests whether function returns correct max bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) - dwi.maxBval() == float - assert dwi.maxBval() == 8 + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + val = dwi.maxBval() + assert isinstance(val, int) + assert val == 8 def test_dwi_max_dti_bval(): """Tests whether function returns correct max DTI bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) - dwi.maxDTIBval() == float - assert dwi.maxDTIBval() == 1 + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + val = dwi.maxDTIBval() + assert isinstance(val, int) + assert val == 1 def test_dwi_max_dki_bval(): """Tests whether function returns correct max DKI bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) - dwi.maxDKIBval() == float - assert dwi.maxDKIBval() == 2 + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + val = dwi.maxDKIBval() + assert isinstance(val, int) + assert val == 2 def test_max_fbi_bval(): """Tests whether function returns correct max FBI bval""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) - dwi.maxFBIBval() == float - assert dwi.maxFBIBval() == 8 + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + val = dwi.maxFBIBval() + assert isinstance(val, int) + assert val == 8 def test_dwi_idx_b0(): """Tests whether function returns correct index of b0""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) idx = dwi.idxb0() assert idx.dtype == bool assert len(idx) == 337 @@ -137,7 +124,7 @@ def test_dwi_idx_b0(): def test_dwi_idx_dti(): """Tests whether function returns correct index of DTI b-values""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) idx = dwi.idxdti() assert idx.dtype == bool assert len(idx) == 337 @@ -146,7 +133,7 @@ def test_dwi_idx_dti(): def test_dwi_idx_dki(): """Tests whether function returns correct index of DKI b-values""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) idx = dwi.idxdki() assert idx.dtype == bool assert len(idx) == 337 @@ -155,22 +142,21 @@ def test_dwi_idx_dki(): def test_idx_fbi(): """Tests whether function returns correct index of FBI b-values""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) idx = dwi.idxfbi() assert idx.dtype == bool assert len(idx) == 337 assert sum(idx) == 256 - def test_dwi_n_dirs(): """Tests whether function returns correct number of directions""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) assert dwi.getndirs() == 30 def test_dwi_tensor_type(): """Tests whether function returns correct tensor type""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) tensor = dwi.tensorType() assert isinstance(tensor, list) assert "dti" in tensor @@ -181,38 +167,38 @@ def test_dwi_tensor_type(): def test_dwi_is_dti(): """Tests whether function returns correct boolean for DTI dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) assert dwi.isdti() is True def test_dwi_is_dki(): """Tests whether function returns correct boolean for DKI dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) assert dwi.isdki() is True def test_dwi_is_fbi(): """Tests whether function returns correct boolean for FBI dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) assert dwi.isfbi() is True def test_dwi_is_fbwm(): """Tests whether function returns correct boolean for FBWM dataset""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) assert dwi.isfbwm() is True def test_dwi_tensor_order_invalid_order(): """Tests whether function returns correct tensor order""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) with pytest.raises(ValueError): cnt, ind = dwi.createTensorOrder(5) def test_dwi_tensor_order_valid_order(): """Tests whether function returns correct tensor order""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) cnt, ind = dwi.createTensorOrder(2) assert len(cnt) == 6 assert np.shape(ind) == (6, 2) @@ -220,22 +206,84 @@ def test_dwi_tensor_order_valid_order(): def test_dwi_tensor_order_auto_detect(): """Tests whether function returns correct tensor order""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) cnt, ind = dwi.createTensorOrder() assert len(cnt) == 15 assert np.shape(ind) == (15, 4) -def test_fibonacci_sphere_invalid_samples(): +def test_dwi_fibonacci_sphere_invalid_samples(): """Tests whether function returns correct response from invalid samples type""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) with pytest.raises(TypeError): dwi.fibonacciSphere(samples=5.2) -def test_fibonacci_sphere(): +def test_dwi_fibonacci_sphere_success(): """Tests whether function returns correct response""" - dwi = DWI(PATH_DWI, bvecPath=PATH_BVEC, bvalPath=PATH_BVAL, mask=DATA["mask"]) + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) sphere = dwi.fibonacciSphere(samples=5) assert sphere.dtype == np.float64 assert np.shape(sphere) == (5, 3) + + +def test_dwi_radial_sampling(): + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + samples = 128 + dirs = dwi.radialSampling(dirs30, samples) + assert dirs.dtype == np.float64 + assert np.shape(dirs) == (samples - 1, 3) + + +def test_dwi_constraints_invalid(): + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + with pytest.raises(ValueError) as exc: + val = dwi.createConstraints([1,2,3]) + assert "Invalid contraints" in str(exc.value) + + +@pytest.mark.parametrize( + "constraints", + ([0, 0, 0], + [1, 1, 1], + [0, 1, 0], + [1, 0, 1], + [0, 0, 1], + [1, 1, 0], + [0, 1, 1], + [1, 0, 0]) +) +def test_dwi_constraints_success(constraints): + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + val = dwi.createConstraints(constraints) + if sum(constraints) == 0: + shape = (0, 22) + elif sum(constraints) == 1: + shape = (30, 22) + elif sum(constraints) == 2: + shape = (60, 22) + elif sum(constraints) == 3: + shape = (90, 22) + print(np.shape(val)) + assert val.dtype == np.float64 + assert np.shape(val) == shape + + +def test_dwi_fit_constrained(capsys): + """Tests whether constrained fitting works normally""" + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + dwi.fit([0, 1, 0]) + captured = capsys.readouterr() + assert hasattr(dwi, "dt") + assert np.shape(dwi.dt) == (21, 5) + assert "Constrained Tensor Fit" in captured.err + + +def test_dwi_fit_unconstrained(capsys): + """Tests whether unconstrained fitting works normally""" + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + dwi.fit() + captured = capsys.readouterr() + assert hasattr(dwi, "dt") + assert np.shape(dwi.dt) == (21, 5) + assert "Unconstrained Tensor Fit" in captured.err diff --git a/tests/test_preprocessing_mrinfoutil.py b/tests/test_preprocessing_mrinfoutil.py index ec7578a..01762a4 100644 --- a/tests/test_preprocessing_mrinfoutil.py +++ b/tests/test_preprocessing_mrinfoutil.py @@ -164,3 +164,8 @@ def test_commandhistory_valid(): def test_commandhistory_dtype(): """Test whether function returns list type""" assert isinstance(mrinfoutil.commandhistory(PATH_MIF), list) + + +def test_fullsphere(): + """Test whether function returns correct full sphere""" + assert mrinfoutil.is_fullsphere(PATH_MIF) == True diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index d9c99d5..f4e3d5b 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -2,6 +2,7 @@ import nibabel as nib import pytest from unittest.mock import patch, MagicMock +import subprocess from conftest import load_data from pydesigner.preprocessing import mrpreproc, mrinfoutil @@ -56,7 +57,7 @@ def test_miftonii_output_success(tmp_path, nthreads, force, verbose): img = nib.load(output_nii) assert type(img).__name__ == "Nifti1Image" assert img.shape == (2, 2, 2, 337) - + def test_niitomif_failure_bval(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" @@ -113,6 +114,7 @@ def test_niitomif_success(tmp_path, nthreads, force, verbose): assert os.path.exists(output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) + assert "mrconvert" in mrinfoutil.commandhistory(output_mif)[-1] def test_stride_match_output_failure(tmp_path): @@ -147,28 +149,29 @@ def test_stride_match_output_success(tmp_path, nthreads, force, verbose): assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) assert mrinfoutil.strides(output_mif) == (1, 2, 3, 4) + assert "mrconvert" in mrinfoutil.commandhistory(output_mif)[-1] def test_denoise_noisemap_invalid(tmp_path): """Test whether function `denoise` fails when noisemap is invalid""" output_mif = str(tmp_path / "output.mif") with pytest.raises(TypeError) as exc: - mrpreproc.denoise(PATH_DWI, output_mif, noisemap="invalid") + mrpreproc.denoise(PATH_MIF, output_mif, noisemap="invalid") assert "Please specify whether noisemap generation is True or False" in str(exc.value) def test_denoise_output_failure(tmp_path): """Test whether function `stride_match` fails when return code is non-zero""" - output_nii = str(tmp_path / "output.nii") + output_mif = str(tmp_path / "output.mif") with patch("subprocess.run") as mock_subprocess: mock_subprocess.return_value = MagicMock( returncode=1, stderr="stderr" ) with pytest.raises(MRTrixError) as exc: - mrpreproc.denoise(PATH_DWI, output_nii, noisemap=True, extent="1,1,1") + mrpreproc.denoise(PATH_MIF, output_mif, noisemap=True, extent="1,1,1") assert f"Dwidenoise failed" in str(exc.value) assert "stderr" in str(exc.value) - + @pytest.mark.parametrize( "nthreads, force, verbose", @@ -183,10 +186,102 @@ def test_denoise_output_failure(tmp_path): ) def test_denoise_output_success(tmp_path, nthreads, force, verbose): """Test whether function `denoise` successfully denoises a DWI dataset""" - output_nii = str(tmp_path / "output.nii") + output_mif = str(tmp_path / "output.mif") noisemap_nii = str(tmp_path / "noisemap.nii") - mrpreproc.denoise(PATH_DWI, output_nii, noisemap=True, extent="1,1,1", nthreads=nthreads, force=force, verbose=verbose) - assert os.path.exists(output_nii) + mrpreproc.denoise(PATH_MIF, output_mif, noisemap=True, extent="1,1,1", nthreads=nthreads, force=force, verbose=verbose) + assert os.path.exists(output_mif) assert os.path.exists(noisemap_nii) - assert mrinfoutil.format(output_nii) == "NIfTI-1.1" - mrinfoutil.size(output_nii) == (2, 2, 2, 337) + assert mrinfoutil.format(output_mif) == "MRtrix" + mrinfoutil.size(output_mif) == (2, 2, 2, 337) + assert "dwidenoise" in mrinfoutil.commandhistory(output_mif)[-1] + + +def test_degibbs_output_failure(tmp_path): + """Test whether function `degibbs` fails when return code is non-zero""" + output_nii = str(tmp_path / "output.nii") + with patch("subprocess.run") as mock_subprocess: + mock_subprocess.return_value = MagicMock( + returncode=1, stderr="stderr" + ) + with pytest.raises(MRTrixError) as exc: + mrpreproc.degibbs(PATH_DWI, output_nii) + assert f"Mrdegibbs failed" in str(exc.value) + assert "stderr" in str(exc.value) + +@pytest.mark.parametrize( + "nthreads, force, verbose", + [ + (None, None, None), + (1, None, None), + (None, True, None), + (None, False, None), + (None, None, True), + (None, None, False), + ] +) +def test_degibbs_output_success(tmp_path, nthreads, force, verbose): + """Test whether function `degibbs` fails when return code is non-zero""" + output_mif = str(tmp_path / "output.mif") + mrpreproc.degibbs(PATH_DWI, output_mif, nthreads=nthreads, force=force, verbose=verbose) + assert os.path.exists(output_mif) + assert mrinfoutil.format(output_mif) == "MRtrix" + mrinfoutil.size(output_mif) == (2, 2, 2, 337) + assert mrinfoutil.strides(output_mif) == (1, 2, 3, 4) + assert "mrdegibbs" in mrinfoutil.commandhistory(output_mif)[-1] + + +def test_undistort_output_failure_conversion(tmp_path): + """Test whether function `undistort` fails at gradient conversion when return code is non-zero""" + output_mif = str(tmp_path / "output.mif") + with patch("subprocess.run") as mock_subprocess: + mock_subprocess.return_value = MagicMock( + returncode=1, stderr="stderr" + ) + with pytest.raises(MRTrixError) as exc: + mrpreproc.undistort(PATH_MIF, output_mif) + assert f"Extraction of FSL BVEC and BVAL gradients failed" in str(exc.value) + assert "stderr" in str(exc.value) + + +def test_undistort_output_failure_all(tmp_path): + """Test whether function `undistort` fails when final return code is non-zero""" + output_mif = str(tmp_path / "output.mif") + call_count = 0 + original_run = subprocess.run + def subprocess_side_effect(*args, **kwargs): + nonlocal call_count + call_count += 1 + if call_count == 6: + return MagicMock(returncode=1, stderr="stderr") + else: + with patch("subprocess.run", original_run): + return original_run(*args, **kwargs) + with patch("subprocess.run", side_effect=subprocess_side_effect) as mock_subprocess: + with pytest.raises(MRTrixError) as exc: + mrpreproc.undistort(PATH_MIF, output_mif, epib0=0) + assert f"Dwifslpreproc failed" in str(exc.value) + assert "stderr" in str(exc.value) + +# def test_undistort_output_success(tmp_path): +# """Test whether function `undistort` successfully undistorts a DWI dataset""" +# output_mif = str(tmp_path / "output.mif") +# mrpreproc.undistort(PATH_MIF, output_mif, epib0=0) +# assert os.path.exists(output_mif) +# assert mrinfoutil.format(output_mif) == "MRtrix" +# mrinfoutil.size(output_mif) == (2, 2, 2, 337) +# assert mrinfoutil.strides(output_mif) == (1, 2, 3, 4) +# assert "dwifslpreproc" in mrinfoutil.commandhistory(output_mif)[-1] + + + +# def test_brainmask_output_failure(tmp_path): +# """Test whether function `undistort` fails when return code is non-zero""" +# output_nii = str(tmp_path / "output.nii") +# with patch("subprocess.run") as mock_subprocess: +# mock_subprocess.return_value = MagicMock( +# returncode=1, stderr="stderr" +# ) +# with pytest.raises(MRTrixError) as exc: +# mrpreproc.brainmask(PATH_MIF, output_nii) +# assert f"Unable to compute brain mask from B0" in str(exc.value) +# assert "stderr" in str(exc.value) \ No newline at end of file From 6972cdbb4e91a390c7173b4c7153d167ca50de6c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 11 Sep 2024 19:40:48 -0400 Subject: [PATCH 56/78] Linting --- pydesigner/fitting/dwipy.py | 4 +- pydesigner/preprocessing/mrpreproc.py | 55 +++++++++++++++++++-------- tests/test_preprocessing_mrpreproc.py | 6 +-- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/pydesigner/fitting/dwipy.py b/pydesigner/fitting/dwipy.py index 5168702..408fc05 100644 --- a/pydesigner/fitting/dwipy.py +++ b/pydesigner/fitting/dwipy.py @@ -14,9 +14,9 @@ from tqdm import tqdm from ..plotting import outlierplot -from ..system.utils import highprecisionexp, highprecisionpower, vectorize, writeNii -from ..tractography import dsistudio, odf, sphericalsampling from ..system.models import input_path_validator +from ..system.utils import highprecisionexp, highprecisionpower, vectorize, writeNii +from ..tractography import dsistudio, odf, sphericalsampling from . import dwi_fnames, dwidirs from . import thresholds as th diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index a471c39..e8fc17b 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -41,7 +41,13 @@ def miftonii(input: str, output: str, nthreads: int = None, force: bool = True, -------- niitomif """ - opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".nii"), nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix( + input=input_path_validator(input, ".mif"), + output=output_path_validator(output, ".nii"), + nthreads=nthreads, + force=force, + verbose=verbose, + ) input_path_validator(opts.input, ".mif") output_path_validator(opts.output, ".nii") arg = ["mrconvert"] @@ -95,7 +101,13 @@ def niitomif(input: str, output: str, nthreads: int = None, force: bool = True, -------- miftonii """ - opts = modelmrtrix(input=input_path_validator(input, ".nii"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix( + input=input_path_validator(input, ".nii"), + output=output_path_validator(output, ".mif"), + nthreads=nthreads, + force=force, + verbose=verbose, + ) input_path_validator(opts.input, ".nii") path_bvec = input_path_validator(op.splitext(opts.input)[0] + ".bvec", ".bvec") path_bval = input_path_validator(op.splitext(opts.input)[0] + ".bval", ".bval") @@ -203,7 +215,13 @@ def denoise( ------- None; writes out file """ - opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix( + input=input_path_validator(input, ".mif"), + output=output_path_validator(output, ".mif"), + nthreads=nthreads, + force=force, + verbose=verbose, + ) if not isinstance(noisemap, bool): raise TypeError("Please specify whether noisemap generation is True or False.") noisemap_path = op.join(op.dirname(opts.output), "noisemap.nii") @@ -227,13 +245,7 @@ def denoise( raise MRTrixError(msg) -def degibbs( - input: str, - output: str, - nthreads: int = None, - force: bool = False, - verbose: bool = False -) -> None: +def degibbs(input: str, output: str, nthreads: int = None, force: bool = False, verbose: bool = False) -> None: """Runs MRtrix3's `mrdegibbs` command with optimal parameters for PyDesigner. @@ -256,7 +268,13 @@ def degibbs( ------- None; writes out file """ - opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) + opts = modelmrtrix( + input=input_path_validator(input, ".mif"), + output=output_path_validator(output, ".mif"), + nthreads=nthreads, + force=force, + verbose=verbose, + ) arg = ["mrdegibbs"] if opts.force: arg.append("-force") @@ -312,8 +330,14 @@ def undistort( ------- None; writes out file """ - opts = modelmrtrix(input=input_path_validator(input, ".mif"), output=output_path_validator(output, ".mif"), nthreads=nthreads, force=force, verbose=verbose) - + opts = modelmrtrix( + input=input_path_validator(input, ".mif"), + output=output_path_validator(output, ".mif"), + nthreads=nthreads, + force=force, + verbose=verbose, + ) + if rpe not in ["rpe_none", "rpe_pair", "rpe_all", "rpe_header"]: msg = "Entered RPE selection is not valid. Please choose either " msg += "'rpe_none', 'rpe_pair' 'rpe_all', or 'rpe_header'" @@ -397,7 +421,7 @@ def undistort( msg = "Dwifslpreproc failed. Return code: {completion.returncode}" msg += f"\nCommand: {' '.join(arg_extract)}" msg += f"\nMRtrix3 error: {completion.stderr}" - raise(MRTrixError(msg)) + raise (MRTrixError(msg)) # Remove temporarily generated files os.remove(op.join(outdir, "dwiec.bvec")) os.remove(op.join(outdir, "dwiec.bval")) @@ -439,7 +463,8 @@ def brainmask(input, output, thresh=0.25, nthreads=None, force=False, verbose=Fa # Read FSL NifTi output format and change it if not '.nii' fsl_suffix = os.getenv("FSLOUTPUTTYPE") if fsl_suffix is None: - msg = "Unable to determine system environment variable 'FSF_OUTPUT_FORMAT'. Ensure that FSL is installed correctly." + msg = "Unable to determine system environment variable 'FSF_OUTPUT_FORMAT'. " + msg += "Ensure that FSL is installed correctly." raise OSError(msg) if fsl_suffix == "NIFTI_GZ": os.environ["FSLOUTPUTTYPE"] = "NIFTI" diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index f4e3d5b..784bc8c 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -57,7 +57,7 @@ def test_miftonii_output_success(tmp_path, nthreads, force, verbose): img = nib.load(output_nii) assert type(img).__name__ == "Nifti1Image" assert img.shape == (2, 2, 2, 337) - + def test_niitomif_failure_bval(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" @@ -171,7 +171,7 @@ def test_denoise_output_failure(tmp_path): mrpreproc.denoise(PATH_MIF, output_mif, noisemap=True, extent="1,1,1") assert f"Dwidenoise failed" in str(exc.value) assert "stderr" in str(exc.value) - + @pytest.mark.parametrize( "nthreads, force, verbose", @@ -284,4 +284,4 @@ def subprocess_side_effect(*args, **kwargs): # with pytest.raises(MRTrixError) as exc: # mrpreproc.brainmask(PATH_MIF, output_nii) # assert f"Unable to compute brain mask from B0" in str(exc.value) -# assert "stderr" in str(exc.value) \ No newline at end of file +# assert "stderr" in str(exc.value) From d013c26f9a447cebf11ed03c9753bf5508181eb2 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Thu, 12 Sep 2024 09:35:33 -0400 Subject: [PATCH 57/78] Split summary-report into a separate step --- .github/workflows/pydesigner_ci.yml | 37 ++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index d50b5d3..8b0c0a6 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -68,21 +68,51 @@ jobs: run: docker run --name pydesigner-test-container pydesigner-test - name: Copy test results + if: always() run: docker cp pydesigner-test-container:/test_results/ ./test_results - name: Upload test results uses: actions/upload-artifact@v4 + if: always() with: name: test-results path: ./test_results/results.xml - name: Upload coverage report + if: always() uses: actions/upload-artifact@v4 with: name: coverage-report path: ./test_results/coverage.xml + - name: Clean up + run: | + docker container rm pydesigner-test-container + docker image rm pydesigner-test + + summary-reports: + runs-on: ubuntu-latest + steps: + - name: Checkout code + id: checkout + uses: actions/checkout@v4 + with: + token: ${{ secrets.GH_BRIDGE_PAT }} + + - name: Download test results + uses: actions/download-artifact@v4 + with: + name: test-results + path: ./test_results + + - name: Download coverage report + uses: actions/download-artifact@v4 + with: + name: coverage-report + path: ./test_results + - name: Code coverage summary report + if: always() uses: irongut/CodeCoverageSummary@v1.3.0 with: filename: ./test_results/coverage.xml @@ -96,8 +126,8 @@ jobs: thresholds: '10 50' - name: Publish Coverage PR Comment + if: always() uses: marocchino/sticky-pull-request-comment@v2 - if: github.event_name == 'pull_request' with: recreate: true path: code-coverage-results.md @@ -111,8 +141,3 @@ jobs: with: files: | test_results/results.xml - - - name: Clean up - run: | - docker container rm pydesigner-test-container - docker image rm pydesigner-test From dd8be940b5c85de8338c88eabd1c2c99d54c6c2d Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Thu, 12 Sep 2024 09:37:51 -0400 Subject: [PATCH 58/78] Force summary-report run --- .github/workflows/pydesigner_ci.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pydesigner_ci.yml b/.github/workflows/pydesigner_ci.yml index 8b0c0a6..9fee76e 100644 --- a/.github/workflows/pydesigner_ci.yml +++ b/.github/workflows/pydesigner_ci.yml @@ -91,6 +91,8 @@ jobs: docker image rm pydesigner-test summary-reports: + needs: pytest + if: always() runs-on: ubuntu-latest steps: - name: Checkout code @@ -112,7 +114,6 @@ jobs: path: ./test_results - name: Code coverage summary report - if: always() uses: irongut/CodeCoverageSummary@v1.3.0 with: filename: ./test_results/coverage.xml @@ -126,7 +127,6 @@ jobs: thresholds: '10 50' - name: Publish Coverage PR Comment - if: always() uses: marocchino/sticky-pull-request-comment@v2 with: recreate: true @@ -137,7 +137,6 @@ jobs: - name: Publish Test Results uses: EnricoMi/publish-unit-test-result-action@v2 - if: always() with: files: | test_results/results.xml From 094f1159095f147aa8ea2f3b3458594a8acea02d Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Thu, 12 Sep 2024 10:20:20 -0400 Subject: [PATCH 59/78] Fix failing tests --- .gitignore | 2 +- tests/test_fitting_dwipy.py | 1 - tests/test_preprocessing_mrpreproc.py | 8 ++++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 5963969..c1d803d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # Folders to ignore -.coverage +.coverage* .idea/ __pycache__/ .ipynb_checkpoints/ diff --git a/tests/test_fitting_dwipy.py b/tests/test_fitting_dwipy.py index 5a69f88..b57c89f 100644 --- a/tests/test_fitting_dwipy.py +++ b/tests/test_fitting_dwipy.py @@ -264,7 +264,6 @@ def test_dwi_constraints_success(constraints): shape = (60, 22) elif sum(constraints) == 3: shape = (90, 22) - print(np.shape(val)) assert val.dtype == np.float64 assert np.shape(val) == shape diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index 784bc8c..b2ae83e 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -6,7 +6,7 @@ from conftest import load_data from pydesigner.preprocessing import mrpreproc, mrinfoutil -from pydesigner.system.errors import MRTrixError +from pydesigner.system.errors import FileExtensionError, MRTrixError DATA = load_data(type="hifi") PATH_DWI = DATA["nifti"] @@ -198,13 +198,13 @@ def test_denoise_output_success(tmp_path, nthreads, force, verbose): def test_degibbs_output_failure(tmp_path): """Test whether function `degibbs` fails when return code is non-zero""" - output_nii = str(tmp_path / "output.nii") + output_mif = str(tmp_path / "output.mif") with patch("subprocess.run") as mock_subprocess: mock_subprocess.return_value = MagicMock( returncode=1, stderr="stderr" ) with pytest.raises(MRTrixError) as exc: - mrpreproc.degibbs(PATH_DWI, output_nii) + mrpreproc.degibbs(PATH_MIF, output_mif) assert f"Mrdegibbs failed" in str(exc.value) assert "stderr" in str(exc.value) @@ -222,7 +222,7 @@ def test_degibbs_output_failure(tmp_path): def test_degibbs_output_success(tmp_path, nthreads, force, verbose): """Test whether function `degibbs` fails when return code is non-zero""" output_mif = str(tmp_path / "output.mif") - mrpreproc.degibbs(PATH_DWI, output_mif, nthreads=nthreads, force=force, verbose=verbose) + mrpreproc.degibbs(PATH_MIF, output_mif, nthreads=nthreads, force=force, verbose=verbose) assert os.path.exists(output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) From f95bf6ed234eca89785306bd0d2c30b2f94e5b45 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 16 Sep 2024 23:20:49 -0400 Subject: [PATCH 60/78] Update mrgrid test file --- tests/data/hifi/hifi_splenium_mrgrid.mif | 1018 ++++++++++++++-------- 1 file changed, 678 insertions(+), 340 deletions(-) diff --git a/tests/data/hifi/hifi_splenium_mrgrid.mif b/tests/data/hifi/hifi_splenium_mrgrid.mif index d8c0a9e..8f86296 100644 --- a/tests/data/hifi/hifi_splenium_mrgrid.mif +++ b/tests/data/hifi/hifi_splenium_mrgrid.mif @@ -72,350 +72,688 @@ command_history: mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/ command_history: mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides '1,2,3,4' /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif (version=3.0.1-24-g62bb3c69) command_history: mrconvert -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.json /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi_preprocessed.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif (version=3.0.1-24-g62bb3c69) command_history: mrgrid /Users/siddhiman/Datasets/IAM_HiFI/out/pydesigner/working.mif regrid -size '1,1,1' /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_mrgrid.mif (version=3.0.4) +command_history: mrconvert -import_pe_table tests/data/pe_scheme tests/data/hifi/hifi_splenium_mrgrid.mif tests/data/hifi/hifi_splenium_mrgrid_pe.mif (version=3.0.3) comments: TE=99;Time=104142.333;phase=1;mb=2 comments: TE=99;Time=104634.188;phase=0;mb=2 comments: TE=99;Time=102301.625;phase=1;mb=2 comments: TE=99;Time=104142 comments: TE=99;Time=104142 comments: TE=99;Time=104142 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.2041193387,0.5137031909,-0.833333263,1000.0 -dw_scheme: -0.1977141975,0.5146343525,-0.8343024508,1000.0 -dw_scheme: -0.3999621792,0.1718072214,-0.900284696,1000.0 -dw_scheme: 0.4037001972,0.7264234052,-0.5561790963,1000.0 -dw_scheme: 0.2032804557,0.9391539284,-0.2768879831,1000.0 -dw_scheme: 0.8546867084,0.5149137883,-0.06613940621,1000.0 -dw_scheme: 0.7310855427,0.5144020839,-0.4482236331,1000.0 -dw_scheme: 0.4058203992,0.1702779517,-0.8979505681,1000.0 -dw_scheme: 0.7299824555,0.1701815673,-0.6619394601,1000.0 -dw_scheme: 0.6526334818,0.7283765637,0.2086555051,1000.0 -dw_scheme: 0.3244365682,0.9401997848,0.1037558568,1000.0 -dw_scheme: 0.3253184522,0.5170243383,0.791740954,1000.0 -dw_scheme: 0.6514813496,0.5175849347,0.554687197,1000.0 -dw_scheme: 0.9790823445,0.1727878311,0.1074342964,1000.0 -dw_scheme: 0.8540502963,0.1734394521,0.4904251705,1000.0 -dw_scheme: -0.002259620983,0.7302636963,0.6831616412,1000.0 -dw_scheme: -0.002591339745,0.9415239344,0.3369361451,1000.0 -dw_scheme: -0.6554853118,0.5169442435,0.5505521367,1000.0 -dw_scheme: -0.3308567768,0.5183798452,0.7885531874,1000.0 -dw_scheme: 0.1972617938,0.1747377061,0.9646525378,1000.0 -dw_scheme: -0.2056872366,0.1740635009,0.963013322,1000.0 -dw_scheme: -0.6527536174,0.7289013255,0.2064353957,1000.0 -dw_scheme: -0.3254198893,0.9404517877,0.09824627548,1000.0 -dw_scheme: -0.1993994297,0.9378278089,-0.2841106622,1000.0 -dw_scheme: -0.402190306,0.7259439266,-0.5578963821,1000.0 -dw_scheme: -0.7282749406,0.170845989,-0.6636469384,1000.0 -dw_scheme: -0.7269286759,0.5136962899,-0.455731085,1000.0 -dw_scheme: -0.8535207681,0.5157749553,-0.07401684809,1000.0 -dw_scheme: -0.8581097023,0.1742568347,0.4829930584,1000.0 -dw_scheme: -0.9798602664,0.1731730579,0.09942308757,1000.0 -dw_scheme: 0.204978745,0.5120461773,-0.8341417304,2000.0 -dw_scheme: -0.1965293814,0.5127992738,-0.8357111385,2000.0 -dw_scheme: -0.3998713053,0.1699687211,-0.9006739549,2000.0 -dw_scheme: 0.4048534043,0.7250704832,-0.5571054796,2000.0 -dw_scheme: 0.2036165985,0.9386839084,-0.2782315599,2000.0 -dw_scheme: 0.8549558168,0.5145177471,-0.06574221798,2000.0 -dw_scheme: 0.7315589065,0.5138347744,-0.4481019872,2000.0 -dw_scheme: 0.4072249602,0.1696576375,-0.8974319572,2000.0 -dw_scheme: 0.7309258671,0.1700521269,-0.6609308972,2000.0 -dw_scheme: 0.6524868782,0.7278674133,0.2108788811,2000.0 -dw_scheme: 0.3242097053,0.9401930644,0.1045230534,2000.0 -dw_scheme: 0.3238402283,0.5170630515,0.7923214671,2000.0 -dw_scheme: 0.6502088878,0.516892536,0.5568217924,2000.0 -dw_scheme: 0.9790345074,0.1722952772,0.1086543635,2000.0 -dw_scheme: 0.8532894718,0.1731874673,0.4918365364,2000.0 -dw_scheme: -0.001974410286,0.7298582035,0.6835957171,2000.0 -dw_scheme: -0.00310387162,0.9412377457,0.3377304724,2000.0 -dw_scheme: -0.655638689,0.5168712665,0.5504380105,2000.0 -dw_scheme: -0.331102832,0.5175902144,0.788968494,2000.0 -dw_scheme: 0.1965814308,0.1742203798,0.9648849674,2000.0 -dw_scheme: -0.2059179905,0.1740199847,0.9629718719,2000.0 -dw_scheme: -0.6533703702,0.7283237759,0.2065227271,2000.0 -dw_scheme: -0.3258404176,0.9402721635,0.09857119676,2000.0 -dw_scheme: -0.1997946014,0.9376822071,-0.2843135519,2000.0 -dw_scheme: -0.4019648303,0.7255111928,-0.5586213246,2000.0 -dw_scheme: -0.7282631119,0.1706087558,-0.6637209446,2000.0 -dw_scheme: -0.7267950678,0.513986761,-0.4556166579,2000.0 -dw_scheme: -0.8535307738,0.5158325871,-0.07349802909,2000.0 -dw_scheme: -0.8578799975,0.1738247724,0.4835564687,2000.0 -dw_scheme: -0.9799128072,0.1724960796,0.1000799318,2000.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.06332081897,0.01444310468,0.9978887065,8000.0 -dw_scheme: -0.07417404809,0.1564827949,-0.98489154,8000.0 -dw_scheme: -0.07409180858,-0.08248148301,0.9938345983,8000.0 -dw_scheme: -0.08880178295,0.08731895646,0.9922145147,8000.0 -dw_scheme: 0.05085716826,0.1788560869,0.9825599466,8000.0 -dw_scheme: 0.2048379922,0.1092212416,0.972682948,8000.0 -dw_scheme: 0.2154325352,-0.05118067635,0.9751765795,8000.0 -dw_scheme: -0.2138596396,0.2139010684,-0.9531581125,8000.0 -dw_scheme: 0.0482117501,0.2505349565,-0.9669063361,8000.0 -dw_scheme: 0.2049114349,0.1863776562,-0.9608718297,8000.0 -dw_scheme: -0.3529281357,-0.1188557216,0.9280706053,8000.0 -dw_scheme: -0.223297512,-0.01561593684,0.9746252427,8000.0 -dw_scheme: -0.2384915225,0.1570689408,0.9583585663,8000.0 -dw_scheme: -0.1054733643,0.2532084332,0.9616448714,8000.0 -dw_scheme: 0.03320362423,0.3381202338,0.9405169997,8000.0 -dw_scheme: 0.1935410102,0.2674794086,0.9439261853,8000.0 -dw_scheme: 0.3350161077,0.2010768489,0.9205065499,8000.0 -dw_scheme: 0.3523850069,0.03295309449,0.9352747727,8000.0 -dw_scheme: 0.3568902721,-0.1325617364,0.9246927705,8000.0 -dw_scheme: -0.3226246533,0.3043923819,-0.8962469587,8000.0 -dw_scheme: -0.1253864024,0.3382875593,-0.932652013,8000.0 -dw_scheme: 0.02618126578,0.3950301729,-0.9182949982,8000.0 -dw_scheme: 0.1879427584,0.343759089,-0.9200582635,8000.0 -dw_scheme: 0.3389068547,0.2822803585,-0.8974742019,8000.0 -dw_scheme: 0.4806508488,0.2138671441,-0.8504325994,8000.0 -dw_scheme: -0.4906817579,-0.05222510449,0.8697723558,8000.0 -dw_scheme: -0.3638629425,0.04948088767,0.9301373021,8000.0 -dw_scheme: -0.3758752589,0.2264993174,0.8985632137,8000.0 -dw_scheme: -0.2501143667,0.3262073881,0.9116093152,8000.0 -dw_scheme: -0.11469697,0.4144088082,0.902834395,8000.0 -dw_scheme: 0.02856305646,0.4899053085,0.8713076038,8000.0 -dw_scheme: 0.1772886584,0.4119213007,0.8938062283,8000.0 -dw_scheme: 0.3262734121,0.3807595781,0.8651981301,8000.0 -dw_scheme: 0.454391951,0.272429718,0.8481214557,8000.0 -dw_scheme: 0.4809612063,0.1052273006,0.8704042355,8000.0 -dw_scheme: 0.4913592531,-0.06113377373,0.8688088087,8000.0 -dw_scheme: -0.4703498943,0.2325802215,-0.8512798702,8000.0 -dw_scheme: -0.4284839936,0.3954535384,-0.8124148978,8000.0 -dw_scheme: -0.269230545,0.4444057824,-0.8544111506,8000.0 -dw_scheme: -0.12290081,0.4872007472,-0.8645986484,8000.0 -dw_scheme: 0.02310278889,0.5349069715,-0.8445950468,8000.0 -dw_scheme: 0.1738345832,0.4919811729,-0.8530744769,8000.0 -dw_scheme: 0.3204745421,0.4381379528,-0.8398399861,8000.0 -dw_scheme: 0.4611122499,0.3725046699,-0.8053668505,8000.0 -dw_scheme: 0.6111564904,0.1407586621,-0.7788932811,8000.0 -dw_scheme: -0.6164448666,0.0182915636,0.7871855849,8000.0 -dw_scheme: -0.491308456,0.1153364724,0.8633154112,8000.0 -dw_scheme: -0.5021993072,0.2917622033,0.8140458664,8000.0 -dw_scheme: -0.3822782783,0.3934250602,0.8361100645,8000.0 -dw_scheme: -0.2521442149,0.4854616575,0.8371082809,8000.0 -dw_scheme: -0.1129679822,0.5642476573,0.8178403366,8000.0 -dw_scheme: 0.03941977651,0.6247156598,0.77985667,8000.0 -dw_scheme: 0.185218657,0.5425577119,0.8193443588,8000.0 -dw_scheme: 0.3310889531,0.5432284415,0.7715458285,8000.0 -dw_scheme: 0.4491133268,0.436742144,0.7794571954,8000.0 -dw_scheme: 0.5684476951,0.319874619,0.7579890804,8000.0 -dw_scheme: 0.5980293927,0.1620609684,0.7849185232,8000.0 -dw_scheme: 0.6149706868,0.0009513636549,0.7885493956,8000.0 -dw_scheme: -0.6024246598,0.1645783385,-0.7810240071,8000.0 -dw_scheme: -0.5704450247,0.3264348418,-0.7536794862,8000.0 -dw_scheme: -0.5144035982,0.482909799,-0.7086515816,8000.0 -dw_scheme: -0.3644130073,0.5444430013,-0.7555031294,8000.0 -dw_scheme: -0.2130411425,0.5955142482,-0.7745813397,8000.0 -dw_scheme: -0.06001856711,0.641344364,-0.7649020711,8000.0 -dw_scheme: 0.1167986839,0.6382102822,-0.7609505261,8000.0 -dw_scheme: 0.2708287664,0.5908007885,-0.7600040839,8000.0 -dw_scheme: 0.419013,0.5286408254,-0.7382187911,8000.0 -dw_scheme: 0.5569609966,0.455047383,-0.6947850945,8000.0 -dw_scheme: 0.5948040245,0.3000380191,-0.7457783582,8000.0 -dw_scheme: -0.7280700238,-0.04582590336,0.6839693173,8000.0 -dw_scheme: -0.7176359257,0.1226390699,0.6855350733,8000.0 -dw_scheme: -0.6066098645,0.1800032163,0.7743534816,8000.0 -dw_scheme: -0.6428185047,0.3099967155,0.7004901187,8000.0 -dw_scheme: -0.5237393276,0.4318488107,0.734304924,8000.0 -dw_scheme: -0.3942280895,0.5347683254,0.7474001951,8000.0 -dw_scheme: -0.2555117198,0.6226413207,0.7396158102,8000.0 -dw_scheme: -0.1057790974,0.6926381847,0.7134865995,8000.0 -dw_scheme: 0.05300474118,0.7396424228,0.6709095198,8000.0 -dw_scheme: 0.1994248317,0.6638078249,0.7208251578,8000.0 -dw_scheme: 0.340485266,0.6823473806,0.6468939911,8000.0 -dw_scheme: 0.4578772784,0.5831494363,0.6710328851,8000.0 -dw_scheme: 0.5690836021,0.4758604012,0.6705972952,8000.0 -dw_scheme: 0.6721958221,0.3592127516,0.6473939881,8000.0 -dw_scheme: 0.7062910286,0.2092882899,0.6762776018,8000.0 -dw_scheme: 0.7257541526,0.05640646761,0.6856378201,8000.0 -dw_scheme: 0.7232268738,-0.1017622955,0.6830719759,8000.0 -dw_scheme: -0.6977125493,0.2592782172,-0.667811354,8000.0 -dw_scheme: -0.6522665461,0.4117082555,-0.6364311944,8000.0 -dw_scheme: -0.5849001722,0.5583872161,-0.5882988233,8000.0 -dw_scheme: -0.4432526,0.6299118936,-0.6377602519,8000.0 -dw_scheme: -0.2937871727,0.6865539754,-0.6650809996,8000.0 -dw_scheme: -0.1386295555,0.7340533923,-0.6647912933,8000.0 -dw_scheme: 0.03313822298,0.7447047783,-0.666570815,8000.0 -dw_scheme: 0.2045279417,0.7250875013,-0.6575837867,8000.0 -dw_scheme: 0.3589659154,0.673169997,-0.6465180792,8000.0 -dw_scheme: 0.5040616146,0.6048231825,-0.6165312698,8000.0 -dw_scheme: 0.6385154351,0.5186963987,-0.5685526229,8000.0 -dw_scheme: 0.6882258778,0.3681749577,-0.625133859,8000.0 -dw_scheme: 0.7161919627,0.2092634907,-0.6657911565,8000.0 -dw_scheme: 0.8199740941,0.1128854052,-0.5611589528,8000.0 -dw_scheme: -0.819885839,0.0476596813,0.5705398897,8000.0 -dw_scheme: -0.7868730917,0.2093606719,0.5805160175,8000.0 -dw_scheme: -0.7323024624,0.3510300601,0.5835332043,8000.0 -dw_scheme: -0.6321236638,0.4683934059,0.617274081,8000.0 -dw_scheme: -0.5150729771,0.5747325861,0.6359105933,8000.0 -dw_scheme: -0.3852421309,0.6666535005,0.6380921648,8000.0 -dw_scheme: -0.2441540138,0.7433702255,0.6227274889,8000.0 -dw_scheme: -0.09282097362,0.8007161943,0.5918089583,8000.0 -dw_scheme: 0.06286774212,0.8362776041,0.5446902018,8000.0 -dw_scheme: 0.2076470152,0.7723939575,0.6002418609,8000.0 -dw_scheme: 0.3564213436,0.7827111091,0.5102226431,8000.0 -dw_scheme: 0.4816276925,0.6897290431,0.540655725,8000.0 -dw_scheme: 0.5978744474,0.582455926,0.5507188388,8000.0 -dw_scheme: 0.705565045,0.4624713035,0.5369341307,8000.0 -dw_scheme: 0.7831973251,0.3020716403,0.5434654305,8000.0 -dw_scheme: 0.8139604231,0.1426528656,0.5631328348,8000.0 -dw_scheme: 0.8233406414,-0.02018070931,0.5671886169,8000.0 -dw_scheme: -0.8097333473,0.1790681973,-0.558808095,8000.0 -dw_scheme: -0.7756290022,0.3336803,-0.535777107,8000.0 -dw_scheme: -0.7201623938,0.4793810155,-0.5015575425,8000.0 -dw_scheme: -0.6443097748,0.6170346265,-0.4518110045,8000.0 -dw_scheme: -0.5105673453,0.6984576953,-0.5014756562,8000.0 -dw_scheme: -0.3675039569,0.7591211833,-0.5372856509,8000.0 -dw_scheme: -0.214162085,0.8088383146,-0.5476451243,8000.0 -dw_scheme: -0.04766454497,0.8314585939,-0.5535383435,8000.0 -dw_scheme: 0.1214588272,0.8271395101,-0.5487148478,8000.0 -dw_scheme: 0.2860192726,0.7947013157,-0.5353903198,8000.0 -dw_scheme: 0.4375195625,0.7372610723,-0.5148035972,8000.0 -dw_scheme: 0.5778323019,0.6602265138,-0.4798028567,8000.0 -dw_scheme: 0.7039755117,0.5681861023,-0.4261256061,8000.0 -dw_scheme: 0.7634896137,0.4272225035,-0.4843186371,8000.0 -dw_scheme: 0.7993196384,0.2725635687,-0.535534515,8000.0 -dw_scheme: 0.892023962,0.1644988813,-0.4209909372,8000.0 -dw_scheme: -0.9008095313,-0.00444673563,0.4341916798,8000.0 -dw_scheme: -0.8801383526,0.1566742573,0.4481179056,8000.0 -dw_scheme: -0.833588434,0.3164883212,0.4527311181,8000.0 -dw_scheme: -0.7476996175,0.4671631635,0.471915099,8000.0 -dw_scheme: -0.6384525233,0.584977424,0.5001797566,8000.0 -dw_scheme: -0.5148155306,0.6871896114,0.512577221,8000.0 -dw_scheme: -0.3786273152,0.7727038682,0.5094802138,8000.0 -dw_scheme: -0.2317657191,0.8409689541,0.4889334,8000.0 -dw_scheme: -0.08325846942,0.8881056773,0.4520357654,8000.0 -dw_scheme: 0.07276379679,0.9110191785,0.405893442,8000.0 -dw_scheme: 0.2181698334,0.8595404182,0.4621603546,8000.0 -dw_scheme: 0.3612681501,0.8604875047,0.359230536,8000.0 -dw_scheme: 0.4899333344,0.7774544789,0.3943727438,8000.0 -dw_scheme: 0.6076412517,0.677345114,0.4146995368,8000.0 -dw_scheme: 0.7186929217,0.5589655307,0.4135674307,8000.0 -dw_scheme: 0.8100333253,0.4080585691,0.4211106935,8000.0 -dw_scheme: 0.8710687337,0.2402921623,0.4283677602,8000.0 -dw_scheme: 0.8955631444,0.07453726985,0.4386466115,8000.0 -dw_scheme: -0.8964299798,0.08746374523,-0.4344690837,8000.0 -dw_scheme: -0.8747732604,0.2439653071,-0.4186319049,8000.0 -dw_scheme: -0.8320740318,0.3918674458,-0.3925464438,8000.0 -dw_scheme: -0.7697598404,0.5305679724,-0.3549188847,8000.0 -dw_scheme: -0.6883147697,0.6562741874,-0.3090743742,8000.0 -dw_scheme: -0.5667966036,0.7447687085,-0.3522231976,8000.0 -dw_scheme: -0.4335187154,0.8122232692,-0.3903266379,8000.0 -dw_scheme: -0.2888653644,0.8639301371,-0.4125306285,8000.0 -dw_scheme: -0.1283189259,0.8958558073,-0.4254134762,8000.0 -dw_scheme: 0.03860043854,0.9039295961,-0.4259357833,8000.0 -dw_scheme: 0.2045540783,0.8861204638,-0.4158703557,8000.0 -dw_scheme: 0.3629923696,0.8423047515,-0.398446038,8000.0 -dw_scheme: 0.5091712898,0.7772611108,-0.36960758,8000.0 -dw_scheme: 0.6381868495,0.6971635412,-0.3266198737,8000.0 -dw_scheme: 0.752372513,0.5994685683,-0.2730806426,8000.0 -dw_scheme: 0.8169817446,0.472667973,-0.3303419686,8000.0 -dw_scheme: 0.8617377132,0.3209212823,-0.3929601052,8000.0 -dw_scheme: 0.9375595419,0.2179446082,-0.2710761023,8000.0 -dw_scheme: 0.9555966918,0.05702525674,-0.2891073895,8000.0 -dw_scheme: -0.9471304776,0.1049414681,0.3032014953,8000.0 -dw_scheme: -0.9105876731,0.2658216855,0.3164947411,8000.0 -dw_scheme: -0.840558662,0.4272505338,0.3330437166,8000.0 -dw_scheme: -0.7427197603,0.570761042,0.3501416721,8000.0 -dw_scheme: -0.6268012665,0.6855815813,0.3702675622,8000.0 -dw_scheme: -0.496135299,0.7826243854,0.3759638766,8000.0 -dw_scheme: -0.3557236392,0.8602266998,0.3653364442,8000.0 -dw_scheme: -0.2135046737,0.9174750369,0.3356416407,8000.0 -dw_scheme: -0.06818893746,0.9523916699,0.2971537916,8000.0 -dw_scheme: 0.08411369757,0.9628881513,0.2564591469,8000.0 -dw_scheme: 0.2274177456,0.9236773123,0.3083851355,8000.0 -dw_scheme: 0.3321697904,0.9249732567,0.1846285586,8000.0 -dw_scheme: 0.4665459188,0.8537404989,0.2312186545,8000.0 -dw_scheme: 0.5949481397,0.7602384547,0.2609103353,8000.0 -dw_scheme: 0.7094965346,0.647689679,0.2776918203,8000.0 -dw_scheme: 0.814180146,0.5031101104,0.289811847,8000.0 -dw_scheme: 0.8929068524,0.3382074937,0.2972087551,8000.0 -dw_scheme: 0.9392646018,0.1633776009,0.3018108137,8000.0 -dw_scheme: 0.9545904645,-0.003861267585,0.2978961826,8000.0 -dw_scheme: -0.9440986455,0.1658584334,-0.2849012595,8000.0 -dw_scheme: -0.9101178014,0.3214264192,-0.2614778091,8000.0 -dw_scheme: -0.8531759641,0.4692083556,-0.2278909683,8000.0 -dw_scheme: -0.7721725819,0.607244662,-0.1870920209,8000.0 -dw_scheme: -0.645807238,0.7412639773,-0.1829227356,8000.0 -dw_scheme: -0.513860755,0.8291838007,-0.2200030663,8000.0 -dw_scheme: -0.3742727226,0.8916918008,-0.2545695612,8000.0 -dw_scheme: -0.2199564893,0.9341170799,-0.2811484019,8000.0 -dw_scheme: -0.1488791261,0.9779519823,-0.1464408619,8000.0 -dw_scheme: -0.05190444702,0.9554263089,-0.290631204,8000.0 -dw_scheme: 0.1182897011,0.9511485388,-0.2851736378,8000.0 -dw_scheme: 0.2851026621,0.9194528994,-0.2707819008,8000.0 -dw_scheme: 0.4423647384,0.8630716032,-0.2437639146,8000.0 -dw_scheme: 0.5813417681,0.7883521096,-0.201352179,8000.0 -dw_scheme: 0.7055825937,0.6916730098,-0.1540832602,8000.0 -dw_scheme: 0.8226685514,0.5496269159,-0.1453502938,8000.0 -dw_scheme: 0.894613166,0.3765378384,-0.2405962167,8000.0 -dw_scheme: 0.956140104,0.2694377303,-0.1148886898,8000.0 -dw_scheme: 0.9845220492,0.1117963671,-0.1349737267,8000.0 -dw_scheme: -0.9872926918,0.05066637614,0.15061892,8000.0 -dw_scheme: -0.9629710484,0.2107304325,0.1681649333,8000.0 -dw_scheme: -0.9089156,0.3704065174,0.1914978953,8000.0 -dw_scheme: -0.8246628192,0.5260661652,0.2078115119,8000.0 -dw_scheme: -0.7143233921,0.6634391927,0.2226893107,8000.0 -dw_scheme: -0.5868388963,0.7754107475,0.2331486274,8000.0 -dw_scheme: -0.447517209,0.8646691738,0.2282007178,8000.0 -dw_scheme: -0.3052100428,0.9312358401,0.19911464,8000.0 -dw_scheme: -0.156882597,0.9745527475,0.1601086914,8000.0 -dw_scheme: 0.0012529542,0.992147907,0.1250638269,8000.0 -dw_scheme: 0.103493427,0.9945772314,-0.01025871795,8000.0 -dw_scheme: 0.1833466381,0.9737792427,0.1346773801,8000.0 -dw_scheme: 0.2771711523,0.9607764896,0.009202679436,8000.0 -dw_scheme: 0.4256892524,0.9032464531,0.05417107545,8000.0 -dw_scheme: 0.5595333971,0.8226806043,0.1005932442,8000.0 -dw_scheme: 0.6865561464,0.7165393857,0.1233368017,8000.0 -dw_scheme: 0.7933340115,0.5898145858,0.1507975484,8000.0 -dw_scheme: 0.8870805306,0.431028964,0.165233666,8000.0 -dw_scheme: 0.9515182668,0.2557980704,0.1708225252,8000.0 -dw_scheme: 0.9834626085,0.08625805841,0.1592508873,8000.0 -dw_scheme: -0.9859385825,0.07900435081,-0.1472529258,8000.0 -dw_scheme: -0.9621451618,0.2409599237,-0.1273381437,8000.0 -dw_scheme: -0.9131052483,0.3957468441,-0.09809811843,8000.0 -dw_scheme: -0.8384106194,0.5414064462,-0.06282271332,8000.0 -dw_scheme: -0.7256598187,0.6861416117,-0.05125930337,8000.0 -dw_scheme: -0.5902093395,0.8056551284,-0.05072227971,8000.0 -dw_scheme: -0.4530853873,0.8877269874,-0.08157467544,8000.0 -dw_scheme: -0.3071214675,0.9442886333,-0.1183020761,8000.0 -dw_scheme: -0.2348733933,0.9718218262,0.01992052207,8000.0 -dw_scheme: -0.07369321841,0.9972231773,-0.01073518634,8000.0 -dw_scheme: 0.02545736524,0.9880834471,-0.1517992892,8000.0 -dw_scheme: 0.1990285953,0.9696963233,-0.1416921266,8000.0 -dw_scheme: 0.3651382256,0.9234293502,-0.1181199028,8000.0 -dw_scheme: 0.5105772936,0.8565718699,-0.07480280104,8000.0 -dw_scheme: 0.6408011166,0.7670788095,-0.03104881642,8000.0 -dw_scheme: 0.7651513262,0.6437562058,-0.01101796353,8000.0 -dw_scheme: 0.8577863249,0.5134139191,0.02467323426,8000.0 -dw_scheme: 0.9007738794,0.4232833333,-0.09714750669,8000.0 -dw_scheme: 0.9384675954,0.3433556976,0.03722146364,8000.0 -dw_scheme: 0.9837385072,0.1782771958,0.02181263184,8000.0 -dw_scheme: 0.9998989022,0.01354134724,0.004337901547,8000.0 -dw_scheme: -0.9887006469,0.1494578566,0.01154902032,8000.0 -dw_scheme: -0.9499255232,0.3104793482,0.03527144325,8000.0 -dw_scheme: -0.8837898775,0.4634960663,0.06392846706,8000.0 -dw_scheme: -0.7843304257,0.6155660518,0.07683891774,8000.0 -dw_scheme: -0.6610135002,0.745246834,0.08756888122,8000.0 -dw_scheme: -0.5225877151,0.8481793297,0.08656734195,8000.0 -dw_scheme: -0.3816685677,0.9224450057,0.05851765547,8000.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -dw_scheme: 0.0,0.0,0.0,0.0 -mrtrix_version: 3.0.4 +dw_scheme: 0,0,0,0 +dw_scheme: 0.2041193387,0.5137031909,-0.833333263,1000 +dw_scheme: -0.1977141975,0.5146343525,-0.8343024508,1000 +dw_scheme: -0.3999621792,0.1718072214,-0.900284696,1000 +dw_scheme: 0.4037001972,0.7264234052,-0.5561790963,1000 +dw_scheme: 0.2032804557,0.9391539284,-0.2768879831,1000 +dw_scheme: 0.8546867084,0.5149137883,-0.06613940621,1000 +dw_scheme: 0.7310855427,0.5144020839,-0.4482236331,999.9999999 +dw_scheme: 0.4058203992,0.1702779517,-0.8979505681,1000 +dw_scheme: 0.7299824555,0.1701815673,-0.6619394601,1000 +dw_scheme: 0.6526334818,0.7283765637,0.2086555051,999.9999999 +dw_scheme: 0.3244365682,0.9401997848,0.1037558568,999.9999999 +dw_scheme: 0.3253184522,0.5170243383,0.791740954,1000 +dw_scheme: 0.6514813496,0.5175849347,0.554687197,1000 +dw_scheme: 0.9790823445,0.1727878311,0.1074342964,999.9999999 +dw_scheme: 0.8540502963,0.1734394521,0.4904251705,1000 +dw_scheme: -0.002259620983,0.7302636963,0.6831616412,1000 +dw_scheme: -0.002591339745,0.9415239344,0.3369361451,1000 +dw_scheme: -0.6554853118,0.5169442435,0.5505521367,1000 +dw_scheme: -0.3308567768,0.5183798452,0.7885531874,1000 +dw_scheme: 0.1972617938,0.1747377061,0.9646525378,999.9999999 +dw_scheme: -0.2056872366,0.1740635009,0.963013322,1000 +dw_scheme: -0.6527536174,0.7289013255,0.2064353957,999.9999999 +dw_scheme: -0.3254198893,0.9404517877,0.09824627548,1000 +dw_scheme: -0.1993994297,0.9378278089,-0.2841106622,1000 +dw_scheme: -0.402190306,0.7259439266,-0.5578963821,1000 +dw_scheme: -0.7282749406,0.170845989,-0.6636469384,999.9999999 +dw_scheme: -0.7269286759,0.5136962899,-0.455731085,999.9999999 +dw_scheme: -0.8535207681,0.5157749553,-0.07401684809,999.9999999 +dw_scheme: -0.8581097023,0.1742568347,0.4829930584,1000 +dw_scheme: -0.9798602664,0.1731730579,0.09942308757,1000 +dw_scheme: 0.204978745,0.5120461773,-0.8341417304,2000 +dw_scheme: -0.1965293814,0.5127992738,-0.8357111385,2000 +dw_scheme: -0.3998713053,0.1699687211,-0.9006739549,2000 +dw_scheme: 0.4048534043,0.7250704832,-0.5571054796,2000 +dw_scheme: 0.2036165985,0.9386839084,-0.2782315599,2000 +dw_scheme: 0.8549558168,0.5145177471,-0.06574221798,2000 +dw_scheme: 0.7315589065,0.5138347744,-0.4481019872,2000 +dw_scheme: 0.4072249602,0.1696576375,-0.8974319572,2000 +dw_scheme: 0.7309258671,0.1700521269,-0.6609308972,2000 +dw_scheme: 0.6524868782,0.7278674133,0.2108788811,2000 +dw_scheme: 0.3242097053,0.9401930644,0.1045230534,2000 +dw_scheme: 0.3238402283,0.5170630515,0.7923214671,2000 +dw_scheme: 0.6502088878,0.516892536,0.5568217924,2000 +dw_scheme: 0.9790345074,0.1722952772,0.1086543635,2000 +dw_scheme: 0.8532894718,0.1731874673,0.4918365364,2000 +dw_scheme: -0.001974410286,0.7298582035,0.6835957171,2000 +dw_scheme: -0.00310387162,0.9412377457,0.3377304724,2000 +dw_scheme: -0.655638689,0.5168712665,0.5504380105,2000 +dw_scheme: -0.331102832,0.5175902144,0.788968494,2000 +dw_scheme: 0.1965814308,0.1742203798,0.9648849674,2000 +dw_scheme: -0.2059179905,0.1740199847,0.9629718719,2000 +dw_scheme: -0.6533703702,0.7283237759,0.2065227271,2000 +dw_scheme: -0.3258404176,0.9402721635,0.09857119676,2000 +dw_scheme: -0.1997946014,0.9376822071,-0.2843135519,2000 +dw_scheme: -0.4019648303,0.7255111928,-0.5586213246,2000 +dw_scheme: -0.7282631119,0.1706087558,-0.6637209446,2000 +dw_scheme: -0.7267950678,0.513986761,-0.4556166579,2000 +dw_scheme: -0.8535307738,0.5158325871,-0.07349802909,2000 +dw_scheme: -0.8578799975,0.1738247724,0.4835564687,2000 +dw_scheme: -0.9799128072,0.1724960796,0.1000799318,2000 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0.06332081897,0.01444310468,0.9978887065,8000 +dw_scheme: -0.07417404809,0.1564827949,-0.98489154,8000.000001 +dw_scheme: -0.07409180858,-0.08248148301,0.9938345983,7999.999999 +dw_scheme: -0.08880178295,0.08731895646,0.9922145147,8000 +dw_scheme: 0.05085716826,0.1788560869,0.9825599466,8000 +dw_scheme: 0.2048379922,0.1092212416,0.972682948,8000 +dw_scheme: 0.2154325352,-0.05118067635,0.9751765795,8000 +dw_scheme: -0.2138596396,0.2139010684,-0.9531581125,7999.999999 +dw_scheme: 0.0482117501,0.2505349565,-0.9669063361,8000.000001 +dw_scheme: 0.2049114349,0.1863776562,-0.9608718297,8000 +dw_scheme: -0.3529281357,-0.1188557216,0.9280706053,8000 +dw_scheme: -0.223297512,-0.01561593684,0.9746252427,8000 +dw_scheme: -0.2384915225,0.1570689408,0.9583585663,8000.000001 +dw_scheme: -0.1054733643,0.2532084332,0.9616448714,7999.999999 +dw_scheme: 0.03320362423,0.3381202338,0.9405169998,7999.999999 +dw_scheme: 0.1935410102,0.2674794086,0.9439261853,8000 +dw_scheme: 0.3350161077,0.2010768489,0.9205065499,8000 +dw_scheme: 0.3523850069,0.03295309449,0.9352747727,8000 +dw_scheme: 0.3568902721,-0.1325617364,0.9246927705,8000.000001 +dw_scheme: -0.3226246533,0.3043923819,-0.8962469587,8000 +dw_scheme: -0.1253864024,0.3382875593,-0.932652013,8000 +dw_scheme: 0.02618126578,0.3950301729,-0.9182949982,7999.999999 +dw_scheme: 0.1879427584,0.343759089,-0.9200582635,8000 +dw_scheme: 0.3389068547,0.2822803585,-0.8974742019,8000 +dw_scheme: 0.4806508488,0.2138671441,-0.8504325994,7999.999999 +dw_scheme: -0.4906817579,-0.05222510449,0.8697723558,8000 +dw_scheme: -0.3638629425,0.04948088767,0.9301373021,7999.999999 +dw_scheme: -0.3758752589,0.2264993174,0.8985632137,8000 +dw_scheme: -0.2501143667,0.3262073881,0.9116093152,8000 +dw_scheme: -0.11469697,0.4144088082,0.902834395,8000 +dw_scheme: 0.02856305646,0.4899053085,0.8713076038,7999.999999 +dw_scheme: 0.1772886584,0.4119213007,0.8938062282,8000.000001 +dw_scheme: 0.3262734121,0.3807595781,0.8651981301,8000.000001 +dw_scheme: 0.454391951,0.272429718,0.8481214557,8000 +dw_scheme: 0.4809612063,0.1052273006,0.8704042355,7999.999999 +dw_scheme: 0.4913592531,-0.06113377373,0.8688088087,8000 +dw_scheme: -0.4703498943,0.2325802215,-0.8512798702,7999.999999 +dw_scheme: -0.4284839936,0.3954535384,-0.8124148978,8000 +dw_scheme: -0.269230545,0.4444057824,-0.8544111506,8000 +dw_scheme: -0.12290081,0.4872007472,-0.8645986484,8000 +dw_scheme: 0.02310278889,0.5349069715,-0.8445950468,8000.000001 +dw_scheme: 0.1738345832,0.4919811729,-0.8530744769,8000 +dw_scheme: 0.3204745421,0.4381379528,-0.8398399861,8000.000001 +dw_scheme: 0.4611122499,0.3725046699,-0.8053668505,8000 +dw_scheme: 0.6111564904,0.1407586621,-0.7788932811,8000 +dw_scheme: -0.6164448666,0.0182915636,0.7871855849,7999.999999 +dw_scheme: -0.491308456,0.1153364724,0.8633154112,8000 +dw_scheme: -0.5021993072,0.2917622033,0.8140458664,8000 +dw_scheme: -0.3822782783,0.3934250602,0.8361100645,8000 +dw_scheme: -0.2521442149,0.4854616575,0.8371082809,8000 +dw_scheme: -0.1129679822,0.5642476573,0.8178403366,8000 +dw_scheme: 0.03941977651,0.6247156598,0.77985667,8000.000001 +dw_scheme: 0.185218657,0.5425577119,0.8193443588,8000 +dw_scheme: 0.3310889531,0.5432284415,0.7715458285,8000 +dw_scheme: 0.4491133268,0.436742144,0.7794571954,8000.000001 +dw_scheme: 0.5684476951,0.319874619,0.7579890804,8000 +dw_scheme: 0.5980293927,0.1620609684,0.7849185232,8000.000001 +dw_scheme: 0.6149706868,0.0009513636549,0.7885493956,8000 +dw_scheme: -0.6024246598,0.1645783385,-0.7810240071,7999.999999 +dw_scheme: -0.5704450247,0.3264348418,-0.7536794862,8000.000001 +dw_scheme: -0.5144035982,0.482909799,-0.7086515816,7999.999999 +dw_scheme: -0.3644130073,0.5444430013,-0.7555031294,8000.000001 +dw_scheme: -0.2130411425,0.5955142482,-0.7745813397,8000 +dw_scheme: -0.06001856711,0.641344364,-0.7649020711,8000 +dw_scheme: 0.1167986839,0.6382102822,-0.7609505261,8000 +dw_scheme: 0.2708287664,0.5908007885,-0.7600040839,8000 +dw_scheme: 0.419013,0.5286408254,-0.7382187911,8000 +dw_scheme: 0.5569609966,0.455047383,-0.6947850945,8000 +dw_scheme: 0.5948040245,0.3000380191,-0.7457783582,8000 +dw_scheme: -0.7280700238,-0.04582590336,0.6839693173,8000 +dw_scheme: -0.7176359257,0.1226390699,0.6855350733,8000 +dw_scheme: -0.6066098645,0.1800032163,0.7743534816,8000 +dw_scheme: -0.6428185047,0.3099967155,0.7004901187,8000 +dw_scheme: -0.5237393276,0.4318488107,0.734304924,8000 +dw_scheme: -0.3942280895,0.5347683254,0.7474001951,8000 +dw_scheme: -0.2555117198,0.6226413207,0.7396158102,7999.999999 +dw_scheme: -0.1057790974,0.6926381847,0.7134865995,8000 +dw_scheme: 0.05300474118,0.7396424228,0.6709095198,8000 +dw_scheme: 0.1994248317,0.6638078249,0.7208251578,8000 +dw_scheme: 0.340485266,0.6823473806,0.6468939911,7999.999999 +dw_scheme: 0.4578772784,0.5831494363,0.6710328851,8000 +dw_scheme: 0.5690836021,0.4758604012,0.6705972952,8000 +dw_scheme: 0.6721958221,0.3592127516,0.6473939881,8000 +dw_scheme: 0.7062910286,0.2092882899,0.6762776018,8000.000001 +dw_scheme: 0.7257541526,0.05640646761,0.6856378201,8000 +dw_scheme: 0.7232268738,-0.1017622955,0.6830719759,8000 +dw_scheme: -0.6977125493,0.2592782172,-0.667811354,7999.999999 +dw_scheme: -0.6522665461,0.4117082555,-0.6364311944,8000 +dw_scheme: -0.5849001722,0.5583872161,-0.5882988233,8000 +dw_scheme: -0.4432526,0.6299118936,-0.6377602519,8000 +dw_scheme: -0.2937871727,0.6865539754,-0.6650809996,8000 +dw_scheme: -0.1386295555,0.7340533923,-0.6647912933,8000 +dw_scheme: 0.03313822298,0.7447047783,-0.666570815,8000 +dw_scheme: 0.2045279417,0.7250875013,-0.6575837867,8000 +dw_scheme: 0.3589659154,0.673169997,-0.6465180792,8000 +dw_scheme: 0.5040616146,0.6048231825,-0.6165312698,8000 +dw_scheme: 0.6385154351,0.5186963987,-0.5685526229,7999.999999 +dw_scheme: 0.6882258778,0.3681749577,-0.625133859,8000 +dw_scheme: 0.7161919627,0.2092634907,-0.6657911565,8000 +dw_scheme: 0.8199740941,0.1128854052,-0.5611589528,8000 +dw_scheme: -0.819885839,0.0476596813,0.5705398897,8000 +dw_scheme: -0.7868730917,0.2093606719,0.5805160175,8000 +dw_scheme: -0.7323024624,0.3510300601,0.5835332043,8000 +dw_scheme: -0.6321236638,0.4683934059,0.617274081,8000.000001 +dw_scheme: -0.5150729771,0.5747325861,0.6359105933,7999.999999 +dw_scheme: -0.3852421309,0.6666535005,0.6380921648,7999.999999 +dw_scheme: -0.2441540138,0.7433702255,0.6227274889,8000 +dw_scheme: -0.09282097362,0.8007161943,0.5918089583,8000.000001 +dw_scheme: 0.06286774212,0.8362776041,0.5446902018,8000 +dw_scheme: 0.2076470152,0.7723939575,0.6002418609,8000.000001 +dw_scheme: 0.3564213436,0.7827111091,0.5102226431,8000 +dw_scheme: 0.4816276925,0.6897290431,0.540655725,8000 +dw_scheme: 0.5978744474,0.582455926,0.5507188388,8000 +dw_scheme: 0.705565045,0.4624713035,0.5369341307,8000 +dw_scheme: 0.7831973251,0.3020716403,0.5434654305,8000.000001 +dw_scheme: 0.8139604231,0.1426528656,0.5631328348,8000.000001 +dw_scheme: 0.8233406414,-0.02018070931,0.5671886169,8000 +dw_scheme: -0.8097333473,0.1790681973,-0.558808095,8000 +dw_scheme: -0.7756290022,0.3336803,-0.535777107,8000 +dw_scheme: -0.7201623938,0.4793810155,-0.5015575425,7999.999999 +dw_scheme: -0.6443097748,0.6170346265,-0.4518110045,8000 +dw_scheme: -0.5105673453,0.6984576953,-0.5014756562,8000 +dw_scheme: -0.3675039569,0.7591211833,-0.5372856509,7999.999999 +dw_scheme: -0.214162085,0.8088383146,-0.5476451243,8000 +dw_scheme: -0.04766454497,0.8314585939,-0.5535383435,8000 +dw_scheme: 0.1214588272,0.8271395101,-0.5487148478,8000.000001 +dw_scheme: 0.2860192726,0.7947013157,-0.5353903198,8000 +dw_scheme: 0.4375195625,0.7372610723,-0.5148035972,8000 +dw_scheme: 0.5778323019,0.6602265138,-0.4798028567,8000 +dw_scheme: 0.7039755117,0.5681861023,-0.4261256061,8000.000001 +dw_scheme: 0.7634896137,0.4272225035,-0.4843186371,8000 +dw_scheme: 0.7993196384,0.2725635687,-0.535534515,8000.000001 +dw_scheme: 0.892023962,0.1644988813,-0.4209909372,7999.999999 +dw_scheme: -0.9008095313,-0.00444673563,0.4341916798,8000 +dw_scheme: -0.8801383526,0.1566742573,0.4481179056,7999.999999 +dw_scheme: -0.833588434,0.3164883212,0.4527311181,8000 +dw_scheme: -0.7476996175,0.4671631635,0.471915099,8000 +dw_scheme: -0.6384525233,0.584977424,0.5001797566,8000 +dw_scheme: -0.5148155306,0.6871896114,0.512577221,8000 +dw_scheme: -0.3786273152,0.7727038682,0.5094802138,8000 +dw_scheme: -0.2317657191,0.8409689541,0.4889334,8000 +dw_scheme: -0.08325846942,0.8881056773,0.4520357654,8000 +dw_scheme: 0.07276379679,0.9110191785,0.405893442,8000 +dw_scheme: 0.2181698334,0.8595404182,0.4621603546,8000.000001 +dw_scheme: 0.3612681501,0.8604875047,0.359230536,8000 +dw_scheme: 0.4899333344,0.7774544789,0.3943727438,8000 +dw_scheme: 0.6076412517,0.677345114,0.4146995368,8000 +dw_scheme: 0.7186929217,0.5589655307,0.4135674307,8000 +dw_scheme: 0.8100333253,0.4080585691,0.4211106935,8000.000001 +dw_scheme: 0.8710687337,0.2402921623,0.4283677602,8000.000001 +dw_scheme: 0.8955631444,0.07453726985,0.4386466115,8000 +dw_scheme: -0.8964299798,0.08746374523,-0.4344690837,8000.000001 +dw_scheme: -0.8747732604,0.2439653071,-0.4186319049,8000 +dw_scheme: -0.8320740318,0.3918674458,-0.3925464438,8000 +dw_scheme: -0.7697598404,0.5305679724,-0.3549188847,8000 +dw_scheme: -0.6883147697,0.6562741874,-0.3090743742,8000 +dw_scheme: -0.5667966036,0.7447687085,-0.3522231976,8000 +dw_scheme: -0.4335187154,0.8122232692,-0.3903266379,7999.999999 +dw_scheme: -0.2888653644,0.8639301371,-0.4125306285,8000 +dw_scheme: -0.1283189259,0.8958558073,-0.4254134762,8000 +dw_scheme: 0.03860043854,0.9039295961,-0.4259357833,8000 +dw_scheme: 0.2045540783,0.8861204638,-0.4158703557,8000.000001 +dw_scheme: 0.3629923696,0.8423047515,-0.398446038,8000 +dw_scheme: 0.5091712898,0.7772611108,-0.36960758,7999.999999 +dw_scheme: 0.6381868495,0.6971635412,-0.3266198737,8000 +dw_scheme: 0.752372513,0.5994685683,-0.2730806426,8000 +dw_scheme: 0.8169817446,0.472667973,-0.3303419686,7999.999999 +dw_scheme: 0.8617377132,0.3209212823,-0.3929601052,8000.000001 +dw_scheme: 0.9375595419,0.2179446082,-0.2710761023,8000.000001 +dw_scheme: 0.9555966918,0.05702525674,-0.2891073895,8000 +dw_scheme: -0.9471304776,0.1049414681,0.3032014953,8000.000001 +dw_scheme: -0.9105876731,0.2658216855,0.3164947411,8000 +dw_scheme: -0.840558662,0.4272505338,0.3330437166,8000 +dw_scheme: -0.7427197603,0.570761042,0.3501416721,8000 +dw_scheme: -0.6268012665,0.6855815813,0.3702675622,7999.999999 +dw_scheme: -0.496135299,0.7826243854,0.3759638766,8000 +dw_scheme: -0.3557236392,0.8602266998,0.3653364442,8000 +dw_scheme: -0.2135046737,0.9174750369,0.3356416407,8000 +dw_scheme: -0.06818893746,0.9523916699,0.2971537916,8000 +dw_scheme: 0.08411369757,0.9628881513,0.2564591469,8000 +dw_scheme: 0.2274177456,0.9236773123,0.3083851355,8000.000001 +dw_scheme: 0.3321697904,0.9249732567,0.1846285586,7999.999999 +dw_scheme: 0.4665459188,0.8537404989,0.2312186545,8000 +dw_scheme: 0.5949481397,0.7602384547,0.2609103353,8000 +dw_scheme: 0.7094965346,0.647689679,0.2776918203,8000 +dw_scheme: 0.814180146,0.5031101104,0.289811847,8000 +dw_scheme: 0.8929068524,0.3382074937,0.2972087551,8000 +dw_scheme: 0.9392646018,0.1633776009,0.3018108137,7999.999999 +dw_scheme: 0.9545904645,-0.003861267585,0.2978961826,7999.999999 +dw_scheme: -0.9440986455,0.1658584334,-0.2849012595,8000 +dw_scheme: -0.9101178014,0.3214264192,-0.2614778091,8000 +dw_scheme: -0.8531759641,0.4692083556,-0.2278909683,8000.000001 +dw_scheme: -0.7721725819,0.607244662,-0.1870920209,8000 +dw_scheme: -0.645807238,0.7412639773,-0.1829227356,7999.999999 +dw_scheme: -0.513860755,0.8291838007,-0.2200030663,8000 +dw_scheme: -0.3742727226,0.8916918008,-0.2545695612,8000 +dw_scheme: -0.2199564893,0.9341170799,-0.2811484019,8000 +dw_scheme: -0.1488791261,0.9779519823,-0.1464408619,7999.999999 +dw_scheme: -0.05190444702,0.9554263089,-0.290631204,8000.000001 +dw_scheme: 0.1182897011,0.9511485388,-0.2851736378,8000 +dw_scheme: 0.2851026621,0.9194528994,-0.2707819008,8000 +dw_scheme: 0.4423647384,0.8630716032,-0.2437639146,8000.000001 +dw_scheme: 0.5813417681,0.7883521096,-0.201352179,8000 +dw_scheme: 0.7055825937,0.6916730098,-0.1540832602,8000.000001 +dw_scheme: 0.8226685514,0.5496269159,-0.1453502938,8000 +dw_scheme: 0.894613166,0.3765378384,-0.2405962167,8000 +dw_scheme: 0.956140104,0.2694377303,-0.1148886898,8000 +dw_scheme: 0.9845220492,0.1117963671,-0.1349737267,8000 +dw_scheme: -0.9872926918,0.05066637614,0.15061892,8000 +dw_scheme: -0.9629710484,0.2107304325,0.1681649333,8000 +dw_scheme: -0.9089156,0.3704065174,0.1914978953,8000 +dw_scheme: -0.8246628192,0.5260661652,0.2078115119,8000 +dw_scheme: -0.7143233921,0.6634391927,0.2226893107,8000 +dw_scheme: -0.5868388963,0.7754107475,0.2331486274,8000 +dw_scheme: -0.447517209,0.8646691738,0.2282007178,8000.000001 +dw_scheme: -0.3052100428,0.9312358401,0.19911464,8000 +dw_scheme: -0.156882597,0.9745527475,0.1601086914,8000 +dw_scheme: 0.0012529542,0.992147907,0.1250638269,8000 +dw_scheme: 0.103493427,0.9945772314,-0.01025871795,8000 +dw_scheme: 0.1833466381,0.9737792427,0.1346773801,7999.999999 +dw_scheme: 0.2771711523,0.9607764896,0.009202679436,8000 +dw_scheme: 0.4256892524,0.9032464531,0.05417107545,8000 +dw_scheme: 0.5595333971,0.8226806043,0.1005932442,8000 +dw_scheme: 0.6865561464,0.7165393857,0.1233368017,8000.000001 +dw_scheme: 0.7933340115,0.5898145858,0.1507975484,8000 +dw_scheme: 0.8870805306,0.431028964,0.165233666,8000 +dw_scheme: 0.9515182668,0.2557980704,0.1708225252,8000 +dw_scheme: 0.9834626085,0.08625805841,0.1592508873,8000.000001 +dw_scheme: -0.9859385825,0.07900435081,-0.1472529258,8000.000001 +dw_scheme: -0.9621451618,0.2409599237,-0.1273381437,8000 +dw_scheme: -0.9131052483,0.3957468441,-0.09809811843,7999.999999 +dw_scheme: -0.8384106194,0.5414064462,-0.06282271332,8000 +dw_scheme: -0.7256598187,0.6861416117,-0.05125930337,8000 +dw_scheme: -0.5902093395,0.8056551284,-0.05072227971,8000 +dw_scheme: -0.4530853873,0.8877269874,-0.08157467544,8000 +dw_scheme: -0.3071214675,0.9442886333,-0.1183020761,8000 +dw_scheme: -0.2348733933,0.9718218262,0.01992052207,8000 +dw_scheme: -0.07369321841,0.9972231773,-0.01073518634,8000 +dw_scheme: 0.02545736524,0.9880834471,-0.1517992892,8000.000001 +dw_scheme: 0.1990285953,0.9696963233,-0.1416921266,7999.999999 +dw_scheme: 0.3651382256,0.9234293502,-0.1181199028,8000 +dw_scheme: 0.5105772936,0.8565718699,-0.07480280104,8000.000001 +dw_scheme: 0.6408011166,0.7670788095,-0.03104881642,8000 +dw_scheme: 0.7651513262,0.6437562058,-0.01101796353,8000 +dw_scheme: 0.8577863249,0.5134139191,0.02467323426,8000 +dw_scheme: 0.9007738793,0.4232833333,-0.09714750668,8000.000001 +dw_scheme: 0.9384675954,0.3433556976,0.03722146364,8000 +dw_scheme: 0.9837385072,0.1782771958,0.02181263184,8000 +dw_scheme: 0.9998989022,0.01354134724,0.004337901547,8000.000001 +dw_scheme: -0.9887006469,0.1494578566,0.01154902032,8000 +dw_scheme: -0.9499255232,0.3104793482,0.03527144325,8000 +dw_scheme: -0.8837898775,0.4634960663,0.06392846706,8000 +dw_scheme: -0.7843304257,0.6155660518,0.07683891774,8000.000001 +dw_scheme: -0.6610135002,0.745246834,0.08756888122,8000 +dw_scheme: -0.5225877151,0.8481793297,0.08656734195,8000 +dw_scheme: -0.3816685677,0.9224450056,0.05851765547,8000.000001 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +dw_scheme: 0,0,0,0 +mrtrix_version: 3.0.3 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 +pe_scheme: 0,-1,0,0.027 prior_pe_scheme: 0.0,-1.0,0.0,0.027 prior_pe_scheme: 0.0,-1.0,0.0,0.027 prior_pe_scheme: 0.0,-1.0,0.0,0.027 @@ -753,9 +1091,9 @@ prior_pe_scheme: 0.0,-1.0,0.0,0.027 prior_pe_scheme: 0.0,-1.0,0.0,0.027 prior_pe_scheme: 0.0,-1.0,0.0,0.027 prior_pe_scheme: 0.0,-1.0,0.0,0.027 -file: . 36060 +file: . 44140 END -šƒIBxl€As€A°ý€A  }A¬?}AîANë~A˜Añ€AÒbAð~ALÓ€A‰a€AzAÙTAP¶€AÌN€Am8AÞ¼€AÓ¹A­‚A`À€AÁUA~A'6AAA\€A– AcüAˆµA…A •AÆÆA¦ Aëñ AIRAŒ9AÙfAuAbñ A<AGëA?AbAGöA°AñWAÙÞA®¹A§,A+èA‘ËA¶Û Aþ A$k A¯nAÅñAA¢AX8AË®GBÓŸIB"JBÛžIB JBþ5JB¥ +šƒIBxl€As€A°ý€A  }A¬?}AîANë~A˜Añ€AÒbAð~ALÓ€A‰a€AzAÙTAP¶€AÌN€Am8AÞ¼€AÓ¹A­‚A`À€AÁUA~A'6AAA\€A– AcüAˆµA…A •AÆÆA¦ Aëñ AIRAŒ9AÙfAuAbñ A<AGëA?AbAGöA°AñWAÙÞA®¹A§,A+èA‘ËA¶Û Aþ A$k A¯nAÅñAA¢AX8AË®GBÓŸIB"JBÛžIB JBþ5JB¥ JBÔèIBµÑIB,&LBêÏ=BzÇ#@œp#@˜N"@2I$@x}!@”â"@•€@Š"@HÎ"@†˜"@w›@†]!@÷ @>@º!@6 @ ¤#@à~"@³Û#@3"@+^!@~ƒ!@æë"@cÄ#@Є$@A‡$@ë#@J¡!@z"@°¡"@ò¥"@¡3!@ø¥@À!@¯™$@‡^#@™Ù"@,/ @À @Ž«@à!@5¿!@“?!@JÓ!@Ð$@Ô÷#@šÉ#@;x#@Vñ@_‰ @-å"@&>#@Ÿô!@fß!@VÎ"@–n"@Xj#@r?%@8…#@±Æ!@¼Š@ N @«Þ@‘@†¦@•Å@‰ @µ“ @§d!@u¹%@ØA$@SÏ#@ôþ#@_B#@êã"@q…#@y$@ËÃ"@92$@C‘"@ÒN#@Eå#@í%$@S'@Èe'@•Y(@ÞÉ$@!o#@1"@i„ @X¡@þY@sã@·i@. @,…@èG@¥Ü@’À$@Àq%@Ž­&@OI&@®Ò%@Ø%@ãõ#@X$@}%@H%@äÆ'@&b&@™°%@òŠ#@xR!@fÕ @M%@z(@ѱ'@Áë&@Vù"@Cæ"@p!@o @™´@°V@(d@­@SÖ@X‰@Nm@u°@ÉŸ!@ ½#@U:&@·<(@‡&@‰Ï&@#ª#@¨{#@G—%@Œ$@ñ‚%@†(@{)@<È'@ro'@¿Â$@l®$@*º%@ ä&@Ô~'@¬='@Sç&@1‹&@•!@ ©"@m$@/@|¥@@Í@Ê@ma@üE@Àç@*J@Ù@Á@S®@EÞ @€Î$@íD)@b?'@ç’'@ßP'@¿€$@ Ì#@Š#@ú…$@†Ž'@™p&@1½&@-Ý&@S…$@ãg$@=ó!@¿K#@â¼#@ô­%@@(@?)&@¥œ'@Š '@zG$@¿"@33!@Ù!@%@Ìw@è…!@Kì@{ @ á@1 @€@=' @;!@Œ%$@p&@uc)@ÿð*@à”)@Î`'@ãg%@Wu$@YL#@°!@m$@¿#@\$@ü›#@Øn%@Æ|#@Lh"@ÒF"@Þ/"@€°#@9§$@”('@øa*@Å*@',)@Ks'@50%@Øi"@R"@Š!@+•!@%§@•@ßÎ@àÖ@gÍ@é¸@b @¹@àú!@x@ÑÔ!@íÆ'@r(@c*@/è&@N]#@½ @ìk!@ )@q« @D=BÞ From 2b3ca8ef068c997ebeacd94b107ba21da63270b1 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 16 Sep 2024 23:45:36 -0400 Subject: [PATCH 61/78] Add distributed unit testing - xdist --- poetry.lock | 36 +++++++++++++++++++++++++++++++++++- pyproject.toml | 1 + requirements-dev.txt | 2 ++ tests/entrypoint.sh | 2 +- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/poetry.lock b/poetry.lock index f1b31f7..4206951 100644 --- a/poetry.lock +++ b/poetry.lock @@ -446,6 +446,20 @@ files = [ numpy = ">=1.6" scipy = ">=0.9" +[[package]] +name = "execnet" +version = "2.1.1" +description = "execnet: rapid multi-Python deployment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, +] + +[package.extras] +testing = ["hatch", "pre-commit", "pytest", "tox"] + [[package]] name = "fonttools" version = "4.47.2" @@ -1173,6 +1187,26 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] +[[package]] +name = "pytest-xdist" +version = "3.6.1" +description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, + {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, +] + +[package.dependencies] +execnet = ">=2.1" +pytest = ">=7.0.0" + +[package.extras] +psutil = ["psutil (>=3.0)"] +setproctitle = ["setproctitle"] +testing = ["filelock"] + [[package]] name = "python-dateutil" version = "2.8.2" @@ -1398,4 +1432,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <4.0" -content-hash = "6bc8f848a266b1ee5a770d3119200c98149e9cd17e8560490a665581ec0565b9" +content-hash = "0bb79f207fd85920ddda3bf857e0c17fb5f12a7fbd3ec29020f960d693cf4a35" diff --git a/pyproject.toml b/pyproject.toml index b71cf57..aa2921b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,6 +45,7 @@ pydesigner = "pydesigner.main:main" [tool.poetry.group.dev.dependencies] pytest = ">=7.4.0, <8.0.0" pytest-cov = "^5.0.0" +pytest-xdist = "^3.6.1" [build-system] requires = ["poetry-core"] diff --git a/requirements-dev.txt b/requirements-dev.txt index 836328f..cab9f33 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,7 +1,9 @@ colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" coverage[toml]==7.6.1 ; python_version >= "3.11" and python_version < "4.0" +execnet==2.1.1 ; python_version >= "3.11" and python_version < "4.0" iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" pytest-cov==5.0.0 ; python_version >= "3.11" and python_version < "4.0" +pytest-xdist==3.6.1 ; python_version >= "3.11" and python_version < "4.0" pytest==7.4.4 ; python_version >= "3.11" and python_version < "4.0" diff --git a/tests/entrypoint.sh b/tests/entrypoint.sh index 7483a42..ff6ae20 100644 --- a/tests/entrypoint.sh +++ b/tests/entrypoint.sh @@ -3,7 +3,7 @@ # If no arguments are passed, run pytest with coverage if [ "$#" -eq 0 ]; then mkdir -p /test_results - pytest tests -vv --cov=pydesigner --cov-report=xml:/test_results/coverage.xml --junitxml=/test_results/results.xml + pytest tests -vv -n auto --cov=pydesigner --cov-report=xml:/test_results/coverage.xml --junitxml=/test_results/results.xml else # Otherwise, run the command passed as arguments exec "$@" From 022d2147a54649553cf4cde2f1d03e5d541f2fdc Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Mon, 16 Sep 2024 23:45:45 -0400 Subject: [PATCH 62/78] Fix ref to API docs --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index e42acb9..6724809 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -11,7 +11,7 @@ BUILDDIR = build # Added to auto build API doc during make APIBUILD ?= sphinx-apidoc APIBUILDDIR = source/api -APIDIR = ../designer +APIDIR = ../pydesigner # Put it first so that "make" without argument is like "make help". help: From 973f66ca34e00708f3e05a2b1980a95f7cc733f0 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 17 Sep 2024 02:23:52 -0400 Subject: [PATCH 63/78] Add some big tests --- tests/test_fitting_dwipy.py | 130 ++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/tests/test_fitting_dwipy.py b/tests/test_fitting_dwipy.py index b57c89f..18dbba5 100644 --- a/tests/test_fitting_dwipy.py +++ b/tests/test_fitting_dwipy.py @@ -13,6 +13,11 @@ PATH_BVAL = DATA["bval"] PATH_MASK = DATA["mask"] +def is_all_none(array): + """Check if all elements in an array are None""" + return not np.all(np.vectorize(lambda x: x is None)(array)) + + def test_dwi_init_image_nonexistent(tmp_path): input_nii = str(tmp_path / "nonexistent.nii") with pytest.raises(FileNotFoundError) as exc: @@ -286,3 +291,128 @@ def test_dwi_fit_unconstrained(capsys): assert hasattr(dwi, "dt") assert np.shape(dwi.dt) == (21, 5) assert "Unconstrained Tensor Fit" in captured.err + + +def test_dwi_dti_dki_params(capsys): + """Tests whether function returns correct DTI values""" + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + dwi.fit([0, 1, 0]) + md, rd, ad, fa, fe, trace = dwi.extractDTI() + mk, rk, ak, kfa, mkt, trace = dwi.extractDKI() + awf, eas_ad, eas_rd, eas_tort, ias_da = dwi.extractWMTI() + + captured = capsys.readouterr() + + assert "Constrained Tensor Fit" in captured.err + assert "DTI Parameters" in captured.err + assert "DKI Parameters" in captured.err + assert "Extracting AWF" in captured.err + assert "Extracting EAS and IAS" in captured.err + + assert md.dtype == np.float64 + assert rd.dtype == np.float64 + assert ad.dtype == np.float64 + assert fa.dtype == np.float64 + assert fe.dtype == np.float64 + assert trace.dtype == np.float64 + + assert np.shape(md) == (2, 2, 2) + assert np.shape(rd) == (2, 2, 2) + assert np.shape(ad) == (2, 2, 2) + assert np.shape(fa) == (2, 2, 2) + assert np.shape(fe) == (2, 2, 2, 3) + assert np.shape(trace) == (2, 2, 2, 61) + + assert np.nanmean(md) > 0.40 and np.nanmean(md) < 0.60 + assert np.nanmean(rd) > 0.15 and np.nanmean(rd) < 0.40 + assert np.nanmean(ad) > 1.00 and np.nanmean(ad) < 1.30 + assert np.nanmean(fa) > 0.70 and np.nanmean(fa) < 0.80 + assert np.nanmean(fe) > 0.15 and np.nanmean(fe) < 0.40 + assert np.nanmean(trace) > 0.15 and np.nanmean(trace) < 0.40 + + assert mk.dtype == np.float64 + assert rk.dtype == np.float64 + assert ak.dtype == np.float64 + assert kfa.dtype == np.float64 + assert mkt.dtype == np.float64 + assert trace.dtype == np.float64 + + assert np.shape(mk) == (2, 2, 2) + assert np.shape(rk) == (2, 2, 2) + assert np.shape(ak) == (2, 2, 2) + assert np.shape(kfa) == (2, 2, 2) + assert np.shape(mkt) == (2, 2, 2) + assert np.shape(trace) == (2, 2, 2, 61) + + assert np.nanmean(mk) > 0.60 and np.nanmean(mk) < 0.80 + assert np.nanmean(rk) > 1.20 and np.nanmean(rk) < 1.70 + assert np.nanmean(ak) > 0.15 and np.nanmean(ak) < 0.50 + assert np.nanmean(kfa) > 0.20 and np.nanmean(kfa) < 0.50 + assert np.nanmean(mkt) > 0.40 and np.nanmean(mkt) < 0.60 + assert np.nanmean(trace) > 0.15 and np.nanmean(trace) < 0.40 + + assert awf.dtype == np.float64 + assert eas_ad.dtype == np.float64 + assert eas_rd.dtype == np.float64 + assert eas_tort.dtype == np.float64 + assert ias_da.dtype == np.float64 + + assert np.shape(awf) == (2, 2, 2) + assert np.shape(eas_ad) == (2, 2, 2) + assert np.shape(eas_rd) == (2, 2, 2) + assert np.shape(eas_tort) == (2, 2, 2) + assert np.shape(ias_da) == (2, 2, 2) + + assert np.nanmean(awf) > 0.20 and np.nanmean(awf) < 0.40 + assert np.nanmean(eas_ad) > 1.50 and np.nanmean(eas_ad) < 1.75 + assert np.nanmean(eas_rd) > 0.35 and np.nanmean(eas_rd) < 0.55 + assert np.nanmean(eas_tort) > 2.40 and np.nanmean(eas_tort) < 2.70 + assert np.nanmean(ias_da) > 0.80 and np.nanmean(ias_da) < 0.90 + + +def test_dwi_fbi_without_fbwm(capsys): + """Tests whether FBI fitting works normally""" + dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) + dwi.fit([0, 1, 0]) + zeta, faa, sph, sph_mrtrix, min_awf, Da, De_mean, De_ax, De_rad, De_fa, min_cost, min_cost_fn = dwi.fbi(fbwm=False) + captured = capsys.readouterr() + + assert "Constrained Tensor Fit" in captured.err + assert "FBI Fit" in captured.err + + assert zeta.dtype == np.float64 + assert faa.dtype == np.float64 + assert sph.dtype == np.complex128 + assert sph_mrtrix.dtype == np.complex128 + assert min_awf.dtype == np.dtype("O") + assert Da.dtype == np.dtype("O") + assert De_mean.dtype == np.dtype("O") + assert De_ax.dtype == np.dtype("O") + assert De_rad.dtype == np.dtype("O") + assert De_fa.dtype == np.dtype("O") + assert min_cost.dtype == np.dtype("O") + assert min_cost_fn.dtype == np.dtype("O") + + assert np.shape(zeta) == (2, 2, 2) + assert np.shape(faa) == (2, 2, 2) + assert np.shape(sph) == (2, 2, 2, 28) + assert np.shape(sph_mrtrix) == (2, 2, 2, 28) + assert np.shape(min_awf) == (2, 2, 2) + assert np.shape(Da) == (2, 2, 2) + assert np.shape(De_mean) == (2, 2, 2) + assert np.shape(De_ax) == (2, 2, 2) + assert np.shape(De_rad) == (2, 2, 2) + assert np.shape(De_fa) == (2, 2, 2) + assert np.shape(min_cost) == (2, 2, 2) + assert np.shape(min_cost_fn) == (2, 2, 2) + + assert np.nanmean(zeta) > 0.20 and np.nanmean(zeta) < 0.30 + assert np.nanmean(faa) > 0.50 and np.nanmean(faa) < 0.55 + assert is_all_none(min_awf) + assert is_all_none(Da) + assert is_all_none(De_mean) + assert is_all_none(De_ax) + assert is_all_none(De_rad) + assert is_all_none(De_fa) + assert is_all_none(min_cost) + assert is_all_none(min_cost_fn) From 58dfd868cad661a535fa91c7e4632f24be9f52b0 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sun, 26 Jan 2025 17:33:13 -0500 Subject: [PATCH 64/78] Update deps --- .pre-commit-config.yaml | 9 +- docs/source/conf.py | 1 - poetry.lock | 1821 +++++++++--------- pydesigner/fitting/dwipy.py | 20 +- pydesigner/main.py | 48 +- pydesigner/plotting/motionplot.py | 12 +- pydesigner/plotting/outlierplot.py | 10 +- pydesigner/plotting/snrplot.py | 16 +- pydesigner/postprocessing/filters.py | 4 +- pydesigner/preprocessing/mrinfoutil.py | 36 +- pydesigner/preprocessing/mrpreproc.py | 165 +- pydesigner/preprocessing/preparation.py | 2 +- pydesigner/preprocessing/util.py | 8 +- pydesigner/tractography/dsistudio.py | 40 +- pydesigner/tractography/odf.py | 22 +- pydesigner/tractography/sphericalsampling.py | 4 +- pyproject.toml | 40 +- requirements-dev.txt | 6 +- requirements.txt | 68 +- tests/conftest.py | 2 +- tests/test_fitting_dwipy.py | 38 +- tests/test_models.py | 17 +- tests/test_preprocessing_mrinfoutil.py | 38 +- tests/test_preprocessing_mrpreproc.py | 112 +- 24 files changed, 1318 insertions(+), 1221 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 20a747f..dd341e1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,7 +7,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema - rev: '0.29.2' + rev: '0.31.0' hooks: - id: check-readthedocs @@ -18,13 +18,8 @@ repos: args: ['--html-dir', 'docs/html', '--source-dir', 'docs/source'] language_version: python3 -# - repo: https://github.com/psf/black -# rev: '24.4.2' -# hooks: -# - id: black - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.6.4' + rev: 'v0.9.3' hooks: - id: ruff args: [--config, pyproject.toml, --fix, --exit-non-zero-on-fix] diff --git a/docs/source/conf.py b/docs/source/conf.py index 2176953..78e6492 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -7,7 +7,6 @@ # -- Imports ----------------------------------------------------------------- # import os # import sys -import sphinx_rtd_theme # -- Path setup -------------------------------------------------------------- diff --git a/poetry.lock b/poetry.lock index 4206951..8914bd7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,31 +1,31 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. [[package]] name = "annotated-types" -version = "0.6.0" +version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" files = [ - {file = "annotated_types-0.6.0-py3-none-any.whl", hash = "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43"}, - {file = "annotated_types-0.6.0.tar.gz", hash = "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d"}, + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, ] [[package]] name = "clarabel" -version = "0.6.0" +version = "0.9.0" description = "Clarabel Conic Interior Point Solver for Rust / Python" optional = false python-versions = ">=3.7" files = [ - {file = "clarabel-0.6.0-cp37-abi3-macosx_10_7_x86_64.whl", hash = "sha256:4f366de79b8bc66bef8dc170987840b672ccab9222e710c09536d78ef47f606d"}, - {file = "clarabel-0.6.0-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:edcebbfc14073cd32bfb664317fd2555716c96be8b2a54efdb2b728453582bea"}, - {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e737d2818b9ca10e92ccd3fa9ad1a805b039976016415a0c45adef3427d70792"}, - {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e0b1891d8e507eb0bfc7e0b981584c388b2ab28658056e600997dbbc23f1ab4"}, - {file = "clarabel-0.6.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9946d3b5db346421b6d839d868e7b1151b590f871344fe95113bfd55b5be2433"}, - {file = "clarabel-0.6.0-cp37-abi3-win32.whl", hash = "sha256:73ed408c975a8ea021c3d8262d5d023a18e1ac3f6bb59a37cd69a11dba8f86ed"}, - {file = "clarabel-0.6.0-cp37-abi3-win_amd64.whl", hash = "sha256:5a6be4df9fed98b6f73f034836def913a1ecd52e8b79ca230ddf7cd66ebcdee7"}, - {file = "clarabel-0.6.0.tar.gz", hash = "sha256:ef909a393e72981ca10b1d866d9cc7fb6295ece20ae035def764338894961184"}, + {file = "clarabel-0.9.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:702cc4666c0ccf893c936f9f1f55cbb3233ae2d5fa05f67b370ac3e7ec50f222"}, + {file = "clarabel-0.9.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8ea616757b460153ead375b3dd3ce763d46fc3717248077bbfa7b2c844b1775f"}, + {file = "clarabel-0.9.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b5ae16d7dd87aabf72260cf9590ba0d037c52d48555bcf3a86b1f0d9cf88dd4"}, + {file = "clarabel-0.9.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85cb560a5c4cdfb079e3437e21f0b62b69ba766ae082aeb96ced0b5763214077"}, + {file = "clarabel-0.9.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0eaeb3fbb5a90b598700d5435c7f102592a1a79ee25df5a097e0af575838786b"}, + {file = "clarabel-0.9.0-cp37-abi3-win32.whl", hash = "sha256:759c2fa0ccc61ae1a02691c43753638a0ae793bf1de81c6f6763c346789a7e25"}, + {file = "clarabel-0.9.0-cp37-abi3-win_amd64.whl", hash = "sha256:d24e4ed1b686eb2fe2a1b6e77935af6ad62a2c044131e70801ec1d3ef3d33280"}, + {file = "clarabel-0.9.0.tar.gz", hash = "sha256:0d6d3fe8800be5b4b5d40a8e14bd492667b3e46cc5dbe37677ce5ed25f0719d4"}, ] [package.dependencies] @@ -45,146 +45,146 @@ files = [ [[package]] name = "contourpy" -version = "1.2.0" +version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, - {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, - {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, - {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, - {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, - {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, - {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, - {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, - {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, - {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, - {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, - {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, - {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, - {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, - {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, - {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, - {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, - {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, - {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, - {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, - {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, - {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, - {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, + {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453"}, + {file = "contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277"}, + {file = "contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595"}, + {file = "contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697"}, + {file = "contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b"}, + {file = "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85"}, + {file = "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291"}, + {file = "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f"}, + {file = "contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375"}, + {file = "contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509"}, + {file = "contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec"}, + {file = "contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b"}, + {file = "contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d"}, + {file = "contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e"}, + {file = "contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750"}, + {file = "contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, ] [package.dependencies] -numpy = ">=1.20,<2.0" +numpy = ">=1.23" [package.extras] bokeh = ["bokeh", "selenium"] docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] -test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.6.1" +version = "7.6.10" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, - {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, - {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, - {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, - {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, - {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, - {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, - {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, - {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, - {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, - {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, - {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, - {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, - {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, - {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, - {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, - {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, - {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, - {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, - {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, - {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, - {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, - {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, - {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, - {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, - {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, - {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, - {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, - {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, - {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, - {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, - {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, - {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, - {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, - {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, - {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, - {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, - {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, + {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165"}, + {file = "coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3"}, + {file = "coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5"}, + {file = "coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244"}, + {file = "coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3"}, + {file = "coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f"}, + {file = "coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd"}, + {file = "coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377"}, + {file = "coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8"}, + {file = "coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853"}, + {file = "coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50"}, + {file = "coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0"}, + {file = "coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852"}, + {file = "coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359"}, + {file = "coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9"}, + {file = "coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18"}, + {file = "coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e"}, + {file = "coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694"}, + {file = "coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6"}, + {file = "coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe"}, + {file = "coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098"}, + {file = "coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf"}, + {file = "coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2"}, + {file = "coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312"}, + {file = "coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a"}, + {file = "coverage-7.6.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f"}, + {file = "coverage-7.6.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90"}, + {file = "coverage-7.6.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d"}, + {file = "coverage-7.6.10-cp39-cp39-win32.whl", hash = "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18"}, + {file = "coverage-7.6.10-cp39-cp39-win_amd64.whl", hash = "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59"}, + {file = "coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f"}, + {file = "coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23"}, ] [package.extras] @@ -192,60 +192,67 @@ toml = ["tomli"] [[package]] name = "cvxpy" -version = "1.4.1" +version = "1.6.0" description = "A domain-specific language for modeling convex optimization problems in Python." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "cvxpy-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03588055b660c043848f5281fe24dbd21f005b34bd8bd3b56906d8ad457c14ae"}, - {file = "cvxpy-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:315609ff96adeda4970471b349bc19d44ff4043e15630cf5ac70c029658fe8fc"}, - {file = "cvxpy-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55e08ffb973d62b3fabc675ad464cb6013ea5ce69799f330b33a084a2e580d8d"}, - {file = "cvxpy-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f1482558b785f2db51c76b9c6e91cc85dbd146675b126a799e7d7aab5b15354"}, - {file = "cvxpy-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:2f84687d15d11f9b49ca902f20103a2076efd47773c399cace71237ef53cdadc"}, - {file = "cvxpy-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6bfbd535fdaabc5fa55f28de7a1d40f3a803a27fe3fec86e90700fa159a3afc"}, - {file = "cvxpy-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71a95aaccf22431fd25a63bcb12d583e1b0baeaeb4fafa3e25857cec03b9e2f3"}, - {file = "cvxpy-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bae3bf31e4eb6ed6407f78c6bc3c7bc4b4145cdbbb9ba8c61c3fc541d7067"}, - {file = "cvxpy-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41cfaecf86f85162ca53c7be7377b4143e316204fb9b6a7df8b7a08c826e3806"}, - {file = "cvxpy-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:edf66010e49b64d3f2dd1a7abde8fa3e615ce7a2b3eb185ab744b0beb3a6adb9"}, - {file = "cvxpy-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6b0f17dca85b2a410e73f5d84b28f35f57a20cfec1b0adc9b16f0f8aabff9961"}, - {file = "cvxpy-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9318c4e679b3db470e76e7f23cce362b038bd2d68c4a7326a7c21577ddbdc542"}, - {file = "cvxpy-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a46ef722c8d1590875e86360d5781703dfcbd08be73eb98a2fc91a280870064"}, - {file = "cvxpy-1.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57593a852c563ce77bdb075a3e75f23d36d4b3162ebf3199b54cc7fe75088ef2"}, - {file = "cvxpy-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:db89b55025514bad821b1f1781bed373cbb6aa22fe84420431efd510dbe7f858"}, - {file = "cvxpy-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:372c0825cc6e6bb03ecc550d83718761a1bbdbbb48010fec6f9718581ebd45b5"}, - {file = "cvxpy-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:163caffd7f7f27b6cb151f4ccff283068e063c3673158793048761690cbe4bbe"}, - {file = "cvxpy-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24067c54979b09910aea0a03256247121d8a8169538facf087c1923e9e2701a"}, - {file = "cvxpy-1.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a3ec054279880a9ebf5fd9d2ac4109acf944b8c45ea8b24e461680e34f3d7b5"}, - {file = "cvxpy-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d220a7ee55907da9b55b98e5238d03735118d03b82855ba87b872cb2e6977367"}, - {file = "cvxpy-1.4.1.tar.gz", hash = "sha256:7a9ef34e3c57ff8c844d86f0a3834fb5575af19233947639de0ba577c6122e3e"}, + {file = "cvxpy-1.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa557789ff5d9ecdf88dee15c47dbd2f79fa47aa4d71e939126ad654e43484"}, + {file = "cvxpy-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aaff709f5a12a5984b33303a0db5c129aeeba39c98001b630e6943d0cd5a53ed"}, + {file = "cvxpy-1.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:376e43113f19c2e448b5a1fc06e276eae0952e398c6b76092b2fd21c8e14333f"}, + {file = "cvxpy-1.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32bbc9ad7c4423a68e8ec0ac7b59187937d0472e9a331e84c811c89c24799512"}, + {file = "cvxpy-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe295d5eff0f7adab80fca54e2796da878827432f4f97f5d87e47208d52e0aab"}, + {file = "cvxpy-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:99f3f72d84b6424dcbac582f9d50853ab0b473ef63087f1afefd0ddebd94999f"}, + {file = "cvxpy-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5f8c2535541baca557a170a90fad5722f413f9898d3b6111f5f0d46707009b02"}, + {file = "cvxpy-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96de6ec5d2cb7ca2c2f767d8a8485ef9c7fb0269f5668d52210c8d7c32dda610"}, + {file = "cvxpy-1.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ccc3fc4a54126e90c858eee6d2d729afe954d9fab09d23ec92551728ce1e490c"}, + {file = "cvxpy-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:94da5c6897db0718376153ac51a40d6cd6e33b4cc033d99783c506db794caeca"}, + {file = "cvxpy-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3ad0a0928dbd051d3e3b34bf76b078ee3e3b3b3418a86e406c048f9c06196ffa"}, + {file = "cvxpy-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bc013ce8f868c2c25917a79c33e78ca6da7e9f4a498a35c3172a57a5d2626851"}, + {file = "cvxpy-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a4305e85cc4c916a560818f03fe61521492c7cd4d43783e9e8713ed9dd6854d"}, + {file = "cvxpy-1.6.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12067d6a540037c0bf2d936961b84482002a231f37a994b5c9adff71360ba7a2"}, + {file = "cvxpy-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca12f4045e6118a296e2fdbc451d4fa5f4c3bb1f4e8a770e5065b070144b9342"}, + {file = "cvxpy-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1f0fcf10d3d85e0e4828197348426ca49403c637cc7f19d68a2a2bd0ecf08b7e"}, + {file = "cvxpy-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52412e4af1137ce8fb4ae927b2cffb00d71ece2ace1c9fa784827a3672b22fff"}, + {file = "cvxpy-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cee9e376a45b9b0d7f20ec4ef380102cb960d496e074f49e596a0415c01dc00"}, + {file = "cvxpy-1.6.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6df39b5b5d0400b2edacdf784f42459237e956ba4a844d7ee33acc6af2a91709"}, + {file = "cvxpy-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:d4a368defabbe07188c061865851075a38632aadbdc09b587b86fdbea215b79e"}, + {file = "cvxpy-1.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6be5987555efcedce8f3cf52a2c56204927b370fb9bd2be81b3126c68fc5130c"}, + {file = "cvxpy-1.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f1ca20b753eb96e2e2d410d7735191cddf7f9a81944161e7f203ecf966166c4"}, + {file = "cvxpy-1.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed19c2ee4d874241217a5205af0b002dfe4f60f4a193518579f71260c1ef3343"}, + {file = "cvxpy-1.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b83be26ac70f8ce961386389e7f56a3c1a18bb524fae38b10b3041348810a6"}, + {file = "cvxpy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:1ce23246463a61478190ba5c5b6e5c22d52b06afd1875d28214925a49abec1ad"}, + {file = "cvxpy-1.6.0.tar.gz", hash = "sha256:679a9531877dfe0e2defabe106bc62a3e7ea094a7fcfcb797e121127ff8ff39a"}, ] [package.dependencies] clarabel = ">=0.5.0" -ecos = ">=2" -numpy = ">=1.15" +numpy = ">=1.20" osqp = ">=0.6.2" -pybind11 = "*" scipy = ">=1.1.0" -scs = ">=3.0" +scs = ">=3.2.4.post1" [package.extras] cbc = ["cylp (>=0.91.5)"] -clarabel = ["clarabel"] cvxopt = ["cvxopt"] +daqp = ["daqp"] diffcp = ["diffcp"] -glop = ["ortools (>=9.5,<9.8)"] +doc = ["sphinx", "sphinx-design", "sphinx-immaterial (>=0.11.7)", "sphinx-inline-tabs", "sphinxcontrib.jquery"] +ecos = ["ecos"] +ecos-bb = ["ecos"] +glop = ["ortools (>=9.7,<9.10)"] glpk = ["cvxopt"] glpk-mi = ["cvxopt"] gurobi = ["gurobipy"] -highs = ["scipy (>=1.6.1)"] +highs = ["highspy"] mosek = ["Mosek"] -pdlp = ["ortools (>=9.5,<9.8)"] +pdlp = ["ortools (>=9.7,<9.10)"] piqp = ["piqp"] proxqp = ["proxsuite"] scip = ["PySCIPOpt"] scipy = ["scipy"] scs = ["setuptools (>65.5.1)"] +testing = ["hypothesis", "pytest"] xpress = ["xpress"] [[package]] @@ -263,142 +270,70 @@ files = [ docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] tests = ["pytest", "pytest-cov", "pytest-xdist"] -[[package]] -name = "cython" -version = "3.0.8" -description = "The Cython compiler for writing C extensions in the Python language." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636"}, - {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520"}, - {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39"}, - {file = "Cython-3.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f"}, - {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782"}, - {file = "Cython-3.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd"}, - {file = "Cython-3.0.8-cp310-cp310-win32.whl", hash = "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12"}, - {file = "Cython-3.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539"}, - {file = "Cython-3.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba"}, - {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3"}, - {file = "Cython-3.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee"}, - {file = "Cython-3.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1"}, - {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b"}, - {file = "Cython-3.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795"}, - {file = "Cython-3.0.8-cp311-cp311-win32.whl", hash = "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871"}, - {file = "Cython-3.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02"}, - {file = "Cython-3.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f"}, - {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419"}, - {file = "Cython-3.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6"}, - {file = "Cython-3.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717"}, - {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658"}, - {file = "Cython-3.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388"}, - {file = "Cython-3.0.8-cp312-cp312-win32.whl", hash = "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c"}, - {file = "Cython-3.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a"}, - {file = "Cython-3.0.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:870d2a0a7e3cbd5efa65aecdb38d715ea337a904ea7bb22324036e78fb7068e7"}, - {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e8f2454128974905258d86534f4fd4f91d2f1343605657ecab779d80c9d6d5e"}, - {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1949d6aa7bc792554bee2b67a9fe41008acbfe22f4f8df7b6ec7b799613a4b3"}, - {file = "Cython-3.0.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9f2c6e1b8f3bcd6cb230bac1843f85114780bb8be8614855b1628b36bb510e0"}, - {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:05d7eddc668ae7993643f32c7661f25544e791edb745758672ea5b1a82ecffa6"}, - {file = "Cython-3.0.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bfabe115deef4ada5d23c87bddb11289123336dcc14347011832c07db616dd93"}, - {file = "Cython-3.0.8-cp36-cp36m-win32.whl", hash = "sha256:0c38c9f0bcce2df0c3347285863621be904ac6b64c5792d871130569d893efd7"}, - {file = "Cython-3.0.8-cp36-cp36m-win_amd64.whl", hash = "sha256:6c46939c3983217d140999de7c238c3141f56b1ea349e47ca49cae899969aa2c"}, - {file = "Cython-3.0.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:115f0a50f752da6c99941b103b5cb090da63eb206abbc7c2ad33856ffc73f064"}, - {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c0f29246734561c90f36e70ed0506b61aa3d044e4cc4cba559065a2a741fae"}, - {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ab75242869ff71e5665fe5c96f3378e79e792fa3c11762641b6c5afbbbbe026"}, - {file = "Cython-3.0.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6717c06e9cfc6c1df18543cd31a21f5d8e378a40f70c851fa2d34f0597037abc"}, - {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9d3f74388db378a3c6fd06e79a809ed98df3f56484d317b81ee762dbf3c263e0"}, - {file = "Cython-3.0.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae7ac561fd8253a9ae96311e91d12af5f701383564edc11d6338a7b60b285a6f"}, - {file = "Cython-3.0.8-cp37-cp37m-win32.whl", hash = "sha256:97b2a45845b993304f1799664fa88da676ee19442b15fdcaa31f9da7e1acc434"}, - {file = "Cython-3.0.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9e2be2b340fea46fb849d378f9b80d3c08ff2e81e2bfbcdb656e2e3cd8c6b2dc"}, - {file = "Cython-3.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2cde23c555470db3f149ede78b518e8274853745289c956a0e06ad8d982e4db9"}, - {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7990ca127e1f1beedaf8fc8bf66541d066ef4723ad7d8d47a7cbf842e0f47580"}, - {file = "Cython-3.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b983c8e6803f016146c26854d9150ddad5662960c804ea7f0c752c9266752f0"}, - {file = "Cython-3.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a973268d7ca1a2bdf78575e459a94a78e1a0a9bb62a7db0c50041949a73b02ff"}, - {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:61a237bc9dd23c7faef0fcfce88c11c65d0c9bb73c74ccfa408b3a012073c20e"}, - {file = "Cython-3.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3a3d67f079598af49e90ff9655bf85bd358f093d727eb21ca2708f467c489cae"}, - {file = "Cython-3.0.8-cp38-cp38-win32.whl", hash = "sha256:17a642bb01a693e34c914106566f59844b4461665066613913463a719e0dd15d"}, - {file = "Cython-3.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:2cdfc32252f3b6dc7c94032ab744dcedb45286733443c294d8f909a4854e7f83"}, - {file = "Cython-3.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa97893d99385386925d00074654aeae3a98867f298d1e12ceaf38a9054a9bae"}, - {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f05c0bf9d085c031df8f583f0d506aa3be1692023de18c45d0aaf78685bbb944"}, - {file = "Cython-3.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7"}, - {file = "Cython-3.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:314f2355a1f1d06e3c431eaad4708cf10037b5e91e4b231d89c913989d0bdafd"}, - {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:78825a3774211e7d5089730f00cdf7f473042acc9ceb8b9eeebe13ed3a5541de"}, - {file = "Cython-3.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df8093deabc55f37028190cf5e575c26aad23fc673f34b85d5f45076bc37ce39"}, - {file = "Cython-3.0.8-cp39-cp39-win32.whl", hash = "sha256:1aca1b97e0095b3a9a6c33eada3f661a4ed0d499067d121239b193e5ba3bb4f0"}, - {file = "Cython-3.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:16873d78be63bd38ffb759da7ab82814b36f56c769ee02b1d5859560e4c3ac3c"}, - {file = "Cython-3.0.8-py2.py3-none-any.whl", hash = "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6"}, - {file = "Cython-3.0.8.tar.gz", hash = "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6"}, -] - [[package]] name = "deepdiff" -version = "6.7.1" +version = "8.1.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "deepdiff-6.7.1-py3-none-any.whl", hash = "sha256:58396bb7a863cbb4ed5193f548c56f18218060362311aa1dc36397b2f25108bd"}, - {file = "deepdiff-6.7.1.tar.gz", hash = "sha256:b367e6fa6caac1c9f500adc79ada1b5b1242c50d5f716a1a4362030197847d30"}, + {file = "deepdiff-8.1.1-py3-none-any.whl", hash = "sha256:b0231fa3afb0f7184e82535f2b4a36636442ed21e94a0cf3aaa7982157e7ebca"}, + {file = "deepdiff-8.1.1.tar.gz", hash = "sha256:dd7bc7d5c8b51b5b90f01b0e2fe23c801fd8b4c6a7ee7e31c5a3c3663fcc7ceb"}, ] [package.dependencies] -ordered-set = ">=4.0.2,<4.2.0" +orderly-set = ">=5.2.3,<6" [package.extras] -cli = ["click (==8.1.3)", "pyyaml (==6.0.1)"] +cli = ["click (==8.1.7)", "pyyaml (==6.0.2)"] optimize = ["orjson"] [[package]] name = "dill" -version = "0.3.7" +version = "0.3.9" description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, - {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "dipy" -version = "1.8.0" +version = "1.10.0" description = "Diffusion MRI Imaging in Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "dipy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:73ed2a3f61f0ce7b6ccd6bac077c74e1d22e83821435b7db08484081ad54c35e"}, - {file = "dipy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bb763b773745d1fb49118a5c15cf5d672097e0dd1ab92046387cca17675a5a1"}, - {file = "dipy-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b03824d44dd4d1c02e593f7464d40591e96f79fb9e22bb07462d369d3391909f"}, - {file = "dipy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:335383d87206cc5a86119352e323e3ccda7e459f2297672dbdfdb34186564f58"}, - {file = "dipy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:a59dbaa1dd20aa17f81b28a624efe4a77d83c998e033c981c99bbe11bf23eefc"}, - {file = "dipy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8095377f4f13d0e33e564d28fd4a1556935ce4c34e754545c2e57d2a636b04aa"}, - {file = "dipy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:875fd4caac15a48b1304e22f9411ebd2df867a5bea2f90dfd81ebe2ef0d8c0d5"}, - {file = "dipy-1.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:355a7b521b84b20d707893cc280666490d79c513fdc97859a1e1072d34cda1e7"}, - {file = "dipy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ba7d8a4645c66f9fa6a65ddb794e7d8ccfe79f447dfbde74b4a6dc3d9fb872"}, - {file = "dipy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:e2984d4058e294584510119605e802e2a5fa4aed5b3c5435c02d3d1245ba9610"}, - {file = "dipy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:37cb73c27f346b868d67c35140a0a9b54268fa564df495e90e266c64c08fb487"}, - {file = "dipy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bfdb7c4247db24362fee942d2ad2cbaecf4ce7dd77b67e468e9f4271fe913d14"}, - {file = "dipy-1.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9c18f87eacaca27a2bf9f0b24691bc28b8e38bc1315ebb191ea209e7c4a4dad"}, - {file = "dipy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55cd4beb24a973079069d64fff1fd73e1b91d6f03d124798a6b256a96f0f2fbb"}, - {file = "dipy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:fafbb3f4593f379e88848b4ca699e22903eb516191b140c3356ba9041059223b"}, - {file = "dipy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea3075643a81a0af1367886c58c28dfbc7e5a5ef500f4724345885be9990f8ac"}, - {file = "dipy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5430b48941992b0e23b95933fe13423e67acfe234cc924a56d909f81a3a80ea3"}, - {file = "dipy-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cf0910fece4b77432b38e8a4e9e5cdaaf1a27c7b043f4504c46c9436962efa4"}, - {file = "dipy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:238d96379539861977998f3289bd5625189727aac61e147d812652a97e4ce28b"}, - {file = "dipy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:7e14db9fed595f236763e9f14bc7f9bc3e02de05188d2f26397cf1e8d0764ccf"}, - {file = "dipy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1f9f3c5458ebb2e4d2f1a637c9e63bda5cf290e55ef4ef6c57fa0c3cf241f877"}, - {file = "dipy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2b6198f7b27337a5b5eea43f78351065613162ffd5e848907a8ca16c85444d8"}, - {file = "dipy-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5e48614f6ea0babad00989f8a4da1b3e8659d10f25ba82af79db770b2c63596"}, - {file = "dipy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:442cba11e27ef8edb0b83c08cb75ec244b4929e106da5d171cb661f9ce61b1dc"}, - {file = "dipy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e343d959a69787c0db25a772a46efcf632534c26e5fa8597bef26ddf9c31caa8"}, - {file = "dipy-1.8.0.tar.gz", hash = "sha256:cc3845585b6ccd5d7bf43094d52a00eb73111072eee36c2149fabdb1b071f008"}, + {file = "dipy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4c9ba9204f85fcd75277cbdca3dab3d7ed299d5e4c9a5b4d1eda0f76395c426"}, + {file = "dipy-1.10.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:85abe515c0baf6f1feb8d6452e4fe28915bc5d909dfb8625b3669fc0b494d816"}, + {file = "dipy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97594288b1118b9cb0598ecf1bd5a3304a327c0c7b39a7cf60e1837e6b10d602"}, + {file = "dipy-1.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc654c86d662ec4005d41f3f763502d59da64854135f5a4c56be1f68c7cd761"}, + {file = "dipy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:a1b8494d21b02df6ae92fdff3c01dd07b0161b39d371dc31f3b4f81190d843ea"}, + {file = "dipy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4a8e0fc3cb039d3924aab960d5947942f7cd72077cf202bb85f2fd7b0118fb"}, + {file = "dipy-1.10.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:8b9108806270de7ea12ce8d28a975a2d63cf62d60843f102cdfc4baddcf44af1"}, + {file = "dipy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0545345b704b46ab4bc53da39632d4fe024d6d830ef20f5bcc0d58fd068188e"}, + {file = "dipy-1.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:273fbed45693398627083376a7249f4c03bed86230a6e8d187626728cbb4b005"}, + {file = "dipy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:d198a9184e85eb2aa870eb10c02240fa5bc39c72eae8c305b171b00ff747e72a"}, + {file = "dipy-1.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bea75f2c564e0d667e61e2ea0bc5e67a91f9058bcdc59f2a6392801e7babb145"}, + {file = "dipy-1.10.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:57c13806ee63d4cf9f253e813401e69b4044d878a48141e2834aa07c31fe9a0a"}, + {file = "dipy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:777530dff6ab26c84792a699b08ab91f07d461d99fd2cf1949847b5918defd3b"}, + {file = "dipy-1.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734baf9bbeb2ae6bc09346a3cc042fee7d8f2f992f3dcf9cd1853606cda5546a"}, + {file = "dipy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:fcd2df5c1000d1c24123f29ea24d83029600ddb1ce2e512f4486c7c52f85db33"}, + {file = "dipy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7507b739ca08163212b626fcad3d4599ccf7df3039cc8375396859218133b4b3"}, + {file = "dipy-1.10.0-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:0719e28970ab907d8682475103a43a1e15c8206d52f3ebf55dcd90c859252b71"}, + {file = "dipy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6aa0885fc6432576a01f0c6832da974e813df1a64988e47bdf6d47cc0e8325cf"}, + {file = "dipy-1.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a1f2c4f28a69738b3853ab042656a87c8b50e9194be5a7deca50fa73f545e1f"}, + {file = "dipy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cf58a1d995cf9f8228425836c00b0002779dc21c97121792bad0b7c6fb44e82"}, + {file = "dipy-1.10.0.tar.gz", hash = "sha256:b9c8559c1ceec118bd8ebafa1c654582fc13d64c66266ca4d15a2df2367be870"}, ] [package.dependencies] -cython = ">=0.29.24,<0.29.29 || >0.29.29" h5py = ">=3.1.0" nibabel = ">=3.0.0" numpy = ">=1.22.4" @@ -409,42 +344,13 @@ trx-python = ">=0.2.9" [package.extras] all = ["dipy[dev,doc,extra,ml,style,test,viz]"] -dev = ["Cython (>=0.29.32)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.22)", "packaging (>=21)", "setuptools (>=67)", "spin (>=0.5)", "wheel"] -doc = ["Jinja2", "grg-sphinx-theme (>=0.2.0)", "numpydoc", "sphinx (>=5.3,<6.0)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli", "tomli (>=2.0.1)"] +dev = ["Cython (>=0.29.35)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.22.4)", "packaging (>=21)", "setuptools (>=69.5,<70.0)", "spin (>=0.5)", "wheel"] +doc = ["Jinja2", "grg-sphinx-theme (>=0.4.0)", "numpydoc", "sphinx (>=7.2.6)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli", "tomli (>=2.0.1)"] extra = ["boto3", "cvxpy", "dipy[ml,viz]", "scikit-image"] -ml = ["pandas", "scikit_learn", "statsmodels (>=0.14.0)", "tables", "tensorflow", "tensorflow-addons"] -style = ["flake8", "isort"] +ml = ["pandas", "scikit_learn", "statsmodels (>=0.14.0)", "tables", "tensorflow", "torch"] +style = ["pre-commit", "ruff"] test = ["asv", "codecov", "coverage", "coveralls", "pytest"] -viz = ["fury (>=0.9.0)", "matplotlib"] - -[[package]] -name = "ecos" -version = "2.0.12" -description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." -optional = false -python-versions = "*" -files = [ - {file = "ecos-2.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:835298a299c88c207b3402fba60ad9b5688b59bbbf2ac34a46de5b37165d773a"}, - {file = "ecos-2.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608bc822ee8e070927ab3519169b13a1a0fe88f3d562212d6b5dbb1039776360"}, - {file = "ecos-2.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:5184a9d8521ad1af90ffcd9902a6fa75c7bc473f37d30d86f97beda1033dfca2"}, - {file = "ecos-2.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eba07599084724eedc20b2862d5580eebebb09609f4740baadc78401cb99827c"}, - {file = "ecos-2.0.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4979dc2d1cb6667e371a45a61887068505c1305437eef104ed6ef16f4b6aa0e3"}, - {file = "ecos-2.0.12-cp311-cp311-win_amd64.whl", hash = "sha256:da8fbbca3feb83a9e27075d29b3765417d0c80af8ea83cbdc4a558cae7b564af"}, - {file = "ecos-2.0.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f70e4547966f530fd7715756f7a65d5b9b90b312b9d37f243ef9356c05e7d74c"}, - {file = "ecos-2.0.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:617be25d74222849622b0f82b94a11abcf1fae78ccaf69977b328321ee6ffa0b"}, - {file = "ecos-2.0.12-cp37-cp37m-win_amd64.whl", hash = "sha256:29d00164eaea66ed54697a3b361c575284a8bca54f2623381a0635806c7303a7"}, - {file = "ecos-2.0.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e86671397d1d2cd7cccff8a9c45be0541b0c60af8b92a0ff3581c9ed869db67"}, - {file = "ecos-2.0.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:858a4dd3177bdc8cc6e362031732f5177b62138a1e4ef91c0dc3c6bd7d2d1248"}, - {file = "ecos-2.0.12-cp38-cp38-win_amd64.whl", hash = "sha256:528b02f53835bd1baeb2e23f8153b8d6cc2b3704e1768be6a1a972f542241670"}, - {file = "ecos-2.0.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e42bd4c19af6e04f76ccc85d941b1f1adc7faeee4d06d482395a6beb7bec895"}, - {file = "ecos-2.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6def54336a15b5a49bc3bfcaa36035e8557cae8a4853b17ca84f5a29c93bcaea"}, - {file = "ecos-2.0.12-cp39-cp39-win_amd64.whl", hash = "sha256:7af08941552fce108bd80145cdb6be7fa74477a20bacdac170800442cc7027d4"}, - {file = "ecos-2.0.12.tar.gz", hash = "sha256:f48816d73b87ae325556ea537b7c8743187311403c80e3832035224156337c4e"}, -] - -[package.dependencies] -numpy = ">=1.6" -scipy = ">=0.9" +viz = ["fury (>=0.10.0)", "matplotlib"] [[package]] name = "execnet" @@ -462,60 +368,68 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "fonttools" -version = "4.47.2" +version = "4.55.6" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, - {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, - {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, - {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, - {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, - {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, - {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, - {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, - {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, - {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, - {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, - {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, - {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, + {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:57d55fc965e5dd20c8a60d880e0f43bafb506be87af0b650bdc42591e41e0d0d"}, + {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:127999618afe3a2490fad54bab0650c5fbeab1f8109bdc0205f6ad34306deb8b"}, + {file = "fonttools-4.55.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3226d40cb92787e09dcc3730f54b3779dfe56bdfea624e263685ba17a6faac4"}, + {file = "fonttools-4.55.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e82772f70b84e17aa36e9f236feb2a4f73cb686ec1e162557a36cf759d1acd58"}, + {file = "fonttools-4.55.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a632f85bd73e002b771bcbcdc512038fa5d2e09bb18c03a22fb8d400ea492ddf"}, + {file = "fonttools-4.55.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:791e0cf862cdd3a252df395f1bb5f65e3a760f1da3c7ce184d0f7998c266614d"}, + {file = "fonttools-4.55.6-cp310-cp310-win32.whl", hash = "sha256:94f7f2c5c5f3a6422e954ecb6d37cc363e27d6f94050a7ed3f79f12157af6bb2"}, + {file = "fonttools-4.55.6-cp310-cp310-win_amd64.whl", hash = "sha256:2d15e02b93a46982a8513a208e8f89148bca8297640527365625be56151687d0"}, + {file = "fonttools-4.55.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0879f99eabbf2171dfadd9c8c75cec2b7b3aa9cd1f3955dd799c69d60a5189ef"}, + {file = "fonttools-4.55.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d77d83ca77a4c3156a2f4cbc7f09f5a8503795da658fa255b987ad433a191266"}, + {file = "fonttools-4.55.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07478132407736ee5e54f9f534e73923ae28e9bb6dba17764a35e3caf7d7fea3"}, + {file = "fonttools-4.55.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c06fbc2fd76b9bab03eddfd8aa9fb7c0981d314d780e763c80aa76be1c9982"}, + {file = "fonttools-4.55.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:09ed667c4753e1270994e5398cce8703e6423c41702a55b08f843b2907b1be65"}, + {file = "fonttools-4.55.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0ee6ed68af8d57764d69da099db163aaf37d62ba246cfd42f27590e3e6724b55"}, + {file = "fonttools-4.55.6-cp311-cp311-win32.whl", hash = "sha256:9f99e7876518b2d059a9cc67c506168aebf9c71ac8d81006d75e684222f291d2"}, + {file = "fonttools-4.55.6-cp311-cp311-win_amd64.whl", hash = "sha256:3aa6c684007723895aade9b2fe76d07008c9dc90fd1ef6c310b3ca9c8566729f"}, + {file = "fonttools-4.55.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:51120695ee13001533e50abd40eec32c01b9c6f44c5567db38a7acd3eedcd19d"}, + {file = "fonttools-4.55.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:76ac5a595f86892b49ba86ba2e46185adc76328ce6eff0583b30e5c3ab02a914"}, + {file = "fonttools-4.55.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7535a5ac386e549e2b00b34c59b53f805e2423000676723b6867df3c10df04"}, + {file = "fonttools-4.55.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c42009177d3690894288082d5e3dac6bdc9f5d38e25054535e341a19cf5183a4"}, + {file = "fonttools-4.55.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:88f74bc19dbab3dee6a00ca67ca54bb4793e44ff0c4dcf1fa61d68651ae3fa0a"}, + {file = "fonttools-4.55.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bc6f58976ffc19fe1630119a2736153b66151d023c6f30065f31c9e8baed1303"}, + {file = "fonttools-4.55.6-cp312-cp312-win32.whl", hash = "sha256:4259159715142c10b0f4d121ef14da3fa6eafc719289d9efa4b20c15e57fef82"}, + {file = "fonttools-4.55.6-cp312-cp312-win_amd64.whl", hash = "sha256:d91fce2e9a87cc0db9f8042281b6458f99854df810cfefab2baf6ab2acc0f4b4"}, + {file = "fonttools-4.55.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9394813cc73fa22c5413ec1c5745c0a16f68dd2b890f7c55eaba5cb40187ed55"}, + {file = "fonttools-4.55.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ac817559a7d245454231374e194b4e457dca6fefa5b52af466ab0516e9a09c6e"}, + {file = "fonttools-4.55.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34405f1314f1e88b1877a9f9e497fe45190e8c4b29a6c7cd85ed7f666a57d702"}, + {file = "fonttools-4.55.6-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af5469bbf555047efd8752d85faeb2a3510916ddc6c50dd6fb168edf1677408f"}, + {file = "fonttools-4.55.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8a8004a19195eb8a8a13de69e26ec9ed60a5bc1fde336d0021b47995b368fac9"}, + {file = "fonttools-4.55.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:73a4aaf672e7b2265c6354a69cbbadf71b7f3133ecb74e98fec4c67c366698a3"}, + {file = "fonttools-4.55.6-cp313-cp313-win32.whl", hash = "sha256:73bdff9c44d36c57ea84766afc20517eda0c9bb1571b4a09876646264bd5ff3b"}, + {file = "fonttools-4.55.6-cp313-cp313-win_amd64.whl", hash = "sha256:132fa22be8a99784de8cb171b30425a581f04a40ec1c05183777fb2b1fe3bac9"}, + {file = "fonttools-4.55.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8398928acb8a57073606feb9a310682d4a7e2d7536f2c61719261f4c0974504c"}, + {file = "fonttools-4.55.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2f78ebfdef578d4db7c44bc207ac5f9a5c1f22c9db606460dcc8ad48e183338"}, + {file = "fonttools-4.55.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fb545f3a4ebada908fa717ec732277de18dd10161f03ee3b3144d34477804de"}, + {file = "fonttools-4.55.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1062daa0390b32bfd062ded2b450db9e9cf10e5a9919561c13f535e818b1952b"}, + {file = "fonttools-4.55.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:860ab9ed3f9e088d3bdb77b9074e656635f173b039e77d550b603cba052a0dca"}, + {file = "fonttools-4.55.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:03701e7de70c71eb5965cb200986b0c11dfa3cf8e843e4f517ee30a0f43f0a25"}, + {file = "fonttools-4.55.6-cp38-cp38-win32.whl", hash = "sha256:f66561fbfb75785d06513b8025a50be37bf970c3c413e87581cc6eff10bc78f1"}, + {file = "fonttools-4.55.6-cp38-cp38-win_amd64.whl", hash = "sha256:edf159a8f1e48dc4683a715b36da76dd2f82954b16bfe11a215d58e963d31cfc"}, + {file = "fonttools-4.55.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61aa1997c520bee4cde14ffabe81efc4708c500c8c81dce37831551627a2be56"}, + {file = "fonttools-4.55.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7954ea66a8d835f279c17d8474597a001ddd65a2c1ca97e223041bfbbe11f65e"}, + {file = "fonttools-4.55.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f4e88f15f5ed4d2e4bdfcc98540bb3987ae25904f9be304be9a604e7a7050a1"}, + {file = "fonttools-4.55.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d419483a6295e83cabddb56f1c7b7bfdc8169de2fcb5c68d622bd11140355f9"}, + {file = "fonttools-4.55.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:acc74884afddc2656bffc50100945ff407574538c152931c402fccddc46f0abc"}, + {file = "fonttools-4.55.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a55489c7e9d5ea69690a2afad06723c3d0c48c6d276a25391ea97cb31a16b37c"}, + {file = "fonttools-4.55.6-cp39-cp39-win32.whl", hash = "sha256:8c9de8d16d02ecc8b65e3f3d2d1e3002be2c4a3f094d580faf76d7f768bd45fe"}, + {file = "fonttools-4.55.6-cp39-cp39-win_amd64.whl", hash = "sha256:471961af7a4b8461fac0c8ee044b4986e6fe3746d4c83a1aacbdd85b4eb53f93"}, + {file = "fonttools-4.55.6-py3-none-any.whl", hash = "sha256:d20ab5a78d0536c26628eaadba661e7ae2427b1e5c748a0a510a44d914e1b155"}, + {file = "fonttools-4.55.6.tar.gz", hash = "sha256:1beb4647a0df5ceaea48015656525eb8081af226fe96554089fd3b274d239ef0"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -527,40 +441,60 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "h5py" -version = "3.10.0" +version = "3.12.1" description = "Read and write HDF5 files from Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, - {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, - {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, - {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, - {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, - {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, - {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, - {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, - {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, - {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, - {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, - {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, - {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, - {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, - {file = "h5py-3.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641"}, - {file = "h5py-3.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3"}, - {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af"}, - {file = "h5py-3.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97"}, - {file = "h5py-3.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99"}, - {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, - {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, - {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, - {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, - {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, - {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, + {file = "h5py-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda"}, + {file = "h5py-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3"}, + {file = "h5py-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b15d8dbd912c97541312c0e07438864d27dbca857c5ad634de68110c6beb1c2"}, + {file = "h5py-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59685fe40d8c1fbbee088c88cd4da415a2f8bee5c270337dc5a1c4aa634e3307"}, + {file = "h5py-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:577d618d6b6dea3da07d13cc903ef9634cde5596b13e832476dd861aaf651f3e"}, + {file = "h5py-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ccd9006d92232727d23f784795191bfd02294a4f2ba68708825cb1da39511a93"}, + {file = "h5py-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad8a76557880aed5234cfe7279805f4ab5ce16b17954606cca90d578d3e713ef"}, + {file = "h5py-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1473348139b885393125126258ae2d70753ef7e9cec8e7848434f385ae72069e"}, + {file = "h5py-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:018a4597f35092ae3fb28ee851fdc756d2b88c96336b8480e124ce1ac6fb9166"}, + {file = "h5py-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fdf95092d60e8130ba6ae0ef7a9bd4ade8edbe3569c13ebbaf39baefffc5ba4"}, + {file = "h5py-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06a903a4e4e9e3ebbc8b548959c3c2552ca2d70dac14fcfa650d9261c66939ed"}, + {file = "h5py-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7b3b8f3b48717e46c6a790e3128d39c61ab595ae0a7237f06dfad6a3b51d5351"}, + {file = "h5py-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:050a4f2c9126054515169c49cb900949814987f0c7ae74c341b0c9f9b5056834"}, + {file = "h5py-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c4b41d1019322a5afc5082864dfd6359f8935ecd37c11ac0029be78c5d112c9"}, + {file = "h5py-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc"}, + {file = "h5py-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:513171e90ed92236fc2ca363ce7a2fc6f2827375efcbb0cc7fbdd7fe11fecafc"}, + {file = "h5py-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:59400f88343b79655a242068a9c900001a34b63e3afb040bd7cdf717e440f653"}, + {file = "h5py-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e465aee0ec353949f0f46bf6c6f9790a2006af896cee7c178a8c3e5090aa32"}, + {file = "h5py-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba51c0c5e029bb5420a343586ff79d56e7455d496d18a30309616fdbeed1068f"}, + {file = "h5py-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8"}, + {file = "h5py-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2b8dd64f127d8b324f5d2cd1c0fd6f68af69084e9e47d27efeb9e28e685af3e"}, + {file = "h5py-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4532c7e97fbef3d029735db8b6f5bf01222d9ece41e309b20d63cfaae2fb5c4d"}, + {file = "h5py-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdf6d7936fa824acfa27305fe2d9f39968e539d831c5bae0e0d83ed521ad1ac"}, + {file = "h5py-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84342bffd1f82d4f036433e7039e241a243531a1d3acd7341b35ae58cdab05bf"}, + {file = "h5py-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:62be1fc0ef195891949b2c627ec06bc8e837ff62d5b911b6e42e38e0f20a897d"}, + {file = "h5py-3.12.1.tar.gz", hash = "sha256:326d70b53d31baa61f00b8aa5f95c2fcb9621a3ee8365d770c551a13dbbcbfdf"}, ] [package.dependencies] -numpy = ">=1.17.3" +numpy = ">=1.19.3" + +[[package]] +name = "importlib-resources" +version = "6.5.2" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.9" +files = [ + {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, + {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -575,163 +509,145 @@ files = [ [[package]] name = "joblib" -version = "1.3.2" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "joblib-1.3.2-py3-none-any.whl", hash = "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9"}, - {file = "joblib-1.3.2.tar.gz", hash = "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] [[package]] name = "kiwisolver" -version = "1.4.5" +version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" files = [ - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, - {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, - {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, - {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, - {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, - {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, - {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, - {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, - {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, - {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, - {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, - {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, - {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, - {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, - {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, - {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, - {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, - {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, - {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, - {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, - {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, - {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, - {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, - {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, + {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, + {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, + {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, + {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, + {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, + {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, + {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, + {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, + {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, + {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, + {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, + {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, ] [[package]] name = "matplotlib" -version = "3.8.2" +version = "3.10.0" description = "Python plotting package" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, + {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5"}, + {file = "matplotlib-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6"}, + {file = "matplotlib-3.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1"}, + {file = "matplotlib-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363"}, + {file = "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef"}, + {file = "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683"}, + {file = "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765"}, + {file = "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59"}, + {file = "matplotlib-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95"}, + {file = "matplotlib-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8"}, + {file = "matplotlib-3.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12"}, + {file = "matplotlib-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, + {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, + {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, + {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, + {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea"}, + {file = "matplotlib-3.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef"}, + {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, ] [package.dependencies] @@ -739,160 +655,176 @@ contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" kiwisolver = ">=1.3.1" -numpy = ">=1.21,<2" +numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" +[package.extras] +dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setuptools (>=64)", "setuptools_scm (>=7)"] + [[package]] name = "multiprocess" -version = "0.70.15" +version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "multiprocess-0.70.15-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:aa36c7ed16f508091438687fe9baa393a7a8e206731d321e443745e743a0d4e5"}, - {file = "multiprocess-0.70.15-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:20e024018c46d0d1602024c613007ac948f9754659e3853b0aa705e83f6931d8"}, - {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_i686.whl", hash = "sha256:e576062981c91f0fe8a463c3d52506e598dfc51320a8dd8d78b987dfca91c5db"}, - {file = "multiprocess-0.70.15-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e73f497e6696a0f5433ada2b3d599ae733b87a6e8b008e387c62ac9127add177"}, - {file = "multiprocess-0.70.15-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73db2e7b32dcc7f9b0f075c2ffa45c90b6729d3f1805f27e88534c8d321a1be5"}, - {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_i686.whl", hash = "sha256:4271647bd8a49c28ecd6eb56a7fdbd3c212c45529ad5303b40b3c65fc6928e5f"}, - {file = "multiprocess-0.70.15-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:cf981fb998d6ec3208cb14f0cf2e9e80216e834f5d51fd09ebc937c32b960902"}, - {file = "multiprocess-0.70.15-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:18f9f2c7063346d1617bd1684fdcae8d33380ae96b99427260f562e1a1228b67"}, - {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_i686.whl", hash = "sha256:0eac53214d664c49a34695e5824872db4006b1a465edd7459a251809c3773370"}, - {file = "multiprocess-0.70.15-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:1a51dd34096db47fb21fa2b839e615b051d51b97af9a67afbcdaa67186b44883"}, - {file = "multiprocess-0.70.15-py310-none-any.whl", hash = "sha256:7dd58e33235e83cf09d625e55cffd7b0f0eede7ee9223cdd666a87624f60c21a"}, - {file = "multiprocess-0.70.15-py311-none-any.whl", hash = "sha256:134f89053d82c9ed3b73edd3a2531eb791e602d4f4156fc92a79259590bd9670"}, - {file = "multiprocess-0.70.15-py37-none-any.whl", hash = "sha256:f7d4a1629bccb433114c3b4885f69eccc200994323c80f6feee73b0edc9199c5"}, - {file = "multiprocess-0.70.15-py38-none-any.whl", hash = "sha256:bee9afba476c91f9ebee7beeee0601face9eff67d822e893f9a893725fbd6316"}, - {file = "multiprocess-0.70.15-py39-none-any.whl", hash = "sha256:3e0953f5d52b4c76f1c973eaf8214554d146f2be5decb48e928e55c7a2d19338"}, - {file = "multiprocess-0.70.15.tar.gz", hash = "sha256:f20eed3036c0ef477b07a4177cf7c1ba520d9a2677870a4f47fe026f0cd6787e"}, + {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, + {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, + {file = "multiprocess-0.70.17-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2c82d0375baed8d8dd0d8c38eb87c5ae9c471f8e384ad203a36f095ee860f67"}, + {file = "multiprocess-0.70.17-pp38-pypy38_pp73-macosx_10_9_arm64.whl", hash = "sha256:a22a6b1a482b80eab53078418bb0f7025e4f7d93cc8e1f36481477a023884861"}, + {file = "multiprocess-0.70.17-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:349525099a0c9ac5936f0488b5ee73199098dac3ac899d81d326d238f9fd3ccd"}, + {file = "multiprocess-0.70.17-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:27b8409c02b5dd89d336107c101dfbd1530a2cd4fd425fc27dcb7adb6e0b47bf"}, + {file = "multiprocess-0.70.17-pp39-pypy39_pp73-macosx_10_13_arm64.whl", hash = "sha256:2ea0939b0f4760a16a548942c65c76ff5afd81fbf1083c56ae75e21faf92e426"}, + {file = "multiprocess-0.70.17-pp39-pypy39_pp73-macosx_10_13_x86_64.whl", hash = "sha256:2b12e081df87ab755190e227341b2c3b17ee6587e9c82fecddcbe6aa812cd7f7"}, + {file = "multiprocess-0.70.17-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:a0f01cd9d079af7a8296f521dc03859d1a414d14c1e2b6e676ef789333421c95"}, + {file = "multiprocess-0.70.17-py310-none-any.whl", hash = "sha256:38357ca266b51a2e22841b755d9a91e4bb7b937979a54d411677111716c32744"}, + {file = "multiprocess-0.70.17-py311-none-any.whl", hash = "sha256:2884701445d0177aec5bd5f6ee0df296773e4fb65b11903b94c613fb46cfb7d1"}, + {file = "multiprocess-0.70.17-py312-none-any.whl", hash = "sha256:2818af14c52446b9617d1b0755fa70ca2f77c28b25ed97bdaa2c69a22c47b46c"}, + {file = "multiprocess-0.70.17-py313-none-any.whl", hash = "sha256:20c28ca19079a6c879258103a6d60b94d4ffe2d9da07dda93fb1c8bc6243f522"}, + {file = "multiprocess-0.70.17-py38-none-any.whl", hash = "sha256:1d52f068357acd1e5bbc670b273ef8f81d57863235d9fbf9314751886e141968"}, + {file = "multiprocess-0.70.17-py39-none-any.whl", hash = "sha256:c3feb874ba574fbccfb335980020c1ac631fbf2a3f7bee4e2042ede62558a021"}, + {file = "multiprocess-0.70.17.tar.gz", hash = "sha256:4ae2f11a3416809ebc9a48abfc8b14ecce0652a0944731a1493a3c1ba44ff57a"}, ] [package.dependencies] -dill = ">=0.3.7" +dill = ">=0.3.9" [[package]] name = "nibabel" -version = "5.2.0" +version = "5.3.2" description = "Access a multitude of neuroimaging data formats" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "nibabel-5.2.0-py3-none-any.whl", hash = "sha256:77724af6e29fd9c4173702e4d031e7d8c45b5963887905a0f90edab880381b7f"}, - {file = "nibabel-5.2.0.tar.gz", hash = "sha256:3df8f1ab981d1bd92f4331d565528d126ab9717fdbd4cfe68f43fcd1c2bf3f52"}, + {file = "nibabel-5.3.2-py3-none-any.whl", hash = "sha256:52970a5a8a53b1b55249cba4d9bcfaa8cc57e3e5af35a29d7352237e8680a6f8"}, + {file = "nibabel-5.3.2.tar.gz", hash = "sha256:0bdca6503b1c784b446c745a4542367de7756cfba0d72143b91f9ffb78be569b"}, ] [package.dependencies] -numpy = ">=1.20" -packaging = ">=17" +importlib-resources = {version = ">=5.12", markers = "python_version < \"3.12\""} +numpy = ">=1.22" +packaging = ">=20" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.13\""} [package.extras] -all = ["nibabel[dicomfs,minc2,spm,zstd]"] +all = ["h5py", "pillow", "pydicom (>=2.3)", "pyzstd (>=0.14.3)", "scipy"] dev = ["tox"] -dicom = ["pydicom (>=1.0.0)"] -dicomfs = ["nibabel[dicom]", "pillow"] -doc = ["matplotlib (>=1.5.3)", "numpydoc", "sphinx", "texext", "tomli"] +dicom = ["pydicom (>=2.3)"] +dicomfs = ["pillow", "pydicom (>=2.3)"] +doc = ["matplotlib (>=3.5)", "numpydoc", "sphinx", "texext", "tomli"] doctest = ["tox"] minc2 = ["h5py"] spm = ["scipy"] style = ["tox"] -test = ["pytest", "pytest-cov", "pytest-doctestplus", "pytest-httpserver", "pytest-xdist"] +test = ["coverage (>=7.2)", "pytest", "pytest-cov", "pytest-doctestplus", "pytest-httpserver", "pytest-xdist"] typing = ["tox"] zstd = ["pyzstd (>=0.14.3)"] [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] -name = "ordered-set" -version = "4.1.0" -description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +name = "orderly-set" +version = "5.2.3" +description = "Orderly set" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, - {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, + {file = "orderly_set-5.2.3-py3-none-any.whl", hash = "sha256:d357cedcf67f4ebff0d4cbd5b0997e98eeb65dd24fdf5c990a501ae9e82c7d34"}, + {file = "orderly_set-5.2.3.tar.gz", hash = "sha256:571ed97c5a5fca7ddeb6b2d26c19aca896b0ed91f334d9c109edd2f265fb3017"}, ] -[package.extras] -dev = ["black", "mypy", "pytest"] - [[package]] name = "osqp" -version = "0.6.3" +version = "0.6.7.post3" description = "OSQP: The Operator Splitting QP Solver" optional = false python-versions = "*" files = [ - {file = "osqp-0.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7d923c836f1d07115057e595245ccc1694ecae730a1affda78fc6f3c8d239"}, - {file = "osqp-0.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dfda08c38c3521012740a73ef782f97dfc54a41deae4b0bc4afd18d0e74da0"}, - {file = "osqp-0.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7eafa3f3e82dd36c52f3f4ef19a95142405c807c272c4b53c5971c53535d7804"}, - {file = "osqp-0.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:3cbb6efdaffb7387dc0037dfe3259d4803e5ad7217e6f20fb605c92953214b9d"}, - {file = "osqp-0.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b2049b2c42565dcaa63ddca1c4028b1fb20aab141453f5d77e8ff5b1a99a2cf"}, - {file = "osqp-0.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146b89f2cfbf59eaeb2c47e3a312f2034138df78d80ce052364810dc0ef70fc4"}, - {file = "osqp-0.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0084e3d733c75687d68bc133bc380ce471dfe6f7724af2718a43491782eec8d6"}, - {file = "osqp-0.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:1b573fe1cd0e82239a279c58817c1d365187ef862e928b2b9c828c3c516ad3c2"}, - {file = "osqp-0.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c3951ef505177b858c6cd34de980346014cae3d2234c93db960b12c5885f9a2"}, - {file = "osqp-0.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc18f87c9549032c163ce590a5e32079df94ee656c8fb357ba607aa9d78fab81"}, - {file = "osqp-0.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b1a4b538aab629b0fae69f644b7e76f81f94d65230014d482e296dacd046b"}, - {file = "osqp-0.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:60abec3593870990b16f00bd5017096a7091fb00b68d0db3383fc048ca8e55c9"}, - {file = "osqp-0.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b73bdd9589901841af83c5ed6a4092b4fac5a0beff9e32682d8526d1f16a728c"}, - {file = "osqp-0.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d9f611823af4a8b241c86805920e5382cd65c7f94fd3615b4eef999ed94c7c"}, - {file = "osqp-0.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fbc3b3c028c06a6c5f1e66be7b7106ad48a29e0dc5bd82393f82dd68235ef8"}, - {file = "osqp-0.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fe57e4bde071b388518ecb068f26319506dd9cb107363d3d80c12d2e59fc1e81"}, - {file = "osqp-0.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41f304d1d7f91af07d8f0b01e5af29ec3bb8824f0102c7fd8b13b497be120da4"}, - {file = "osqp-0.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea7d8c92bcdf4fef98d777f13d39060d425ef2e8778ed487c96a6fa10848cdea"}, - {file = "osqp-0.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f3a3c6d2708868e5e3fe2da300d6523cbf68a3d8734ce9c5043db37391969f5"}, - {file = "osqp-0.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:1c548a0b3691850e7e22f3624a128d8af33416d70a9b5976a47d4d832028dcd8"}, - {file = "osqp-0.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:387e7abd737dfe32c9ec00ad74af25328cdd0d0f634d79530655c040a5cb9590"}, - {file = "osqp-0.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1445e10a94e01698e13c87a7debf6ac1a15f3acd1f8f6340cb1ad945db4732b"}, - {file = "osqp-0.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0441c10f7fe5f46692a9b44a57138977bb112ae3f8127151671968c5d9ec5dbb"}, - {file = "osqp-0.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:b15e65a307fbbabf60248bb9bc204e61d5d4ae64e00427a69e2dad9622f4c29d"}, - {file = "osqp-0.6.3.tar.gz", hash = "sha256:03e460e683ec2ce0f839353ddfa3c4c8ffa509ab8cf6a2b2afbb586fa453e180"}, + {file = "osqp-0.6.7.post3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f751ca1332b480753cfe3c08bf14ca66259bf69679b572e1f8095ad3e26b201d"}, + {file = "osqp-0.6.7.post3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1b30df65f2d938452e3bd2ca11388b5b16ec7406daedfc4b9dce3747c282e44"}, + {file = "osqp-0.6.7.post3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e1c4550853a5f1e0a90ae7ccbee1cb990f34f98514911955ad14841613110dd"}, + {file = "osqp-0.6.7.post3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0cce816af77b28fc5eff1a4e6d8d25d0653f48275e6e2814bd5f1767181e715"}, + {file = "osqp-0.6.7.post3-cp310-cp310-win_amd64.whl", hash = "sha256:78a1d63b36876996a7125e061145280949334d667060a20895c5d1f183c70242"}, + {file = "osqp-0.6.7.post3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b1a1dcd869fd6ac501e06262c21483a3691b6281e4f3f65af6951330958b89ca"}, + {file = "osqp-0.6.7.post3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46b93d1110dc0ad311f6691c4df9ee41cbbde5ffc0d8c8d520d4555bf5d8765b"}, + {file = "osqp-0.6.7.post3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5209104d6fe3ace4fdbf9ace08caa2cba9de1e7ccd5f56279a346c235917138b"}, + {file = "osqp-0.6.7.post3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfefa07740e9fb1c574cdc836e5afe2600b73c0c12089955d4ae6587c55f0eb"}, + {file = "osqp-0.6.7.post3-cp311-cp311-win_amd64.whl", hash = "sha256:c48c91dfba02ce11e8b8f5d401ec5b67a316782bfdf4f53ca753e49907f7387f"}, + {file = "osqp-0.6.7.post3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:023af06764f7aba9c64536ecb7204019906bb7e78237f335f82b404f16623eef"}, + {file = "osqp-0.6.7.post3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4cec7cb5bf1615c4129277275dc08e20a037372a874cff35eb891b4b35a463de"}, + {file = "osqp-0.6.7.post3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb882ab24b97b14843b7c71d2474fb8b415bafc8dd60aa94870c2ef338c20bfb"}, + {file = "osqp-0.6.7.post3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:502fde0ae710cef1e6418fb8d26efef9597d1dcba877489a1c2eb9c3eb2ff2e9"}, + {file = "osqp-0.6.7.post3-cp312-cp312-win_amd64.whl", hash = "sha256:468588cfb690becba4d1f460c2a53e75530584e3efcf2caed59f5219032e6888"}, + {file = "osqp-0.6.7.post3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cee478eedf9cfad11ff9c27ef0b1e032506a16888b8b874f622816cf8749db7f"}, + {file = "osqp-0.6.7.post3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5dd739c4c6c91e40d2e3ea2bb78c635c897e07697ab24a46d3a5d197e254b0f3"}, + {file = "osqp-0.6.7.post3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:002f280f23d15ad3c6386a868688f0b17c90dba13d0f7f8da1c833a14fc4d7f8"}, + {file = "osqp-0.6.7.post3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a2922fe8cb666964cf01b643da81eadf4bb435139a5f042d5bb6dcb87496778"}, + {file = "osqp-0.6.7.post3-cp313-cp313-win_amd64.whl", hash = "sha256:acb219e941f5248da5de3ee9b70e6a5aaddf5f3989dffd1d4c03b0f7b1dfa17b"}, + {file = "osqp-0.6.7.post3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d12757f9594f87219820aa7ae06ce7800fef9ea52828b7d1970016d6c9749b5f"}, + {file = "osqp-0.6.7.post3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:565205e0dbe5b6ac1dcd7eee8d2e9c4ba5d88b7aaaa522140cdb7d197a9275bb"}, + {file = "osqp-0.6.7.post3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34974c8441260e8952f63a17b0461da9b554a3ed9122042dd0f2e0a4c19e9732"}, + {file = "osqp-0.6.7.post3-cp36-cp36m-win_amd64.whl", hash = "sha256:01d99ced6f43d0d10fa0f01631c5b0a27aca44a5e4743b7ce9a174fcfebfde6e"}, + {file = "osqp-0.6.7.post3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d54837f762b17cb77aa16be3e85cc424cb93fd4ec84f5cbb14f9c0520191fecf"}, + {file = "osqp-0.6.7.post3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c353997ebe57cd8252bd5d7100d997086ab0524b946dc49a4e4d4a774752ee9"}, + {file = "osqp-0.6.7.post3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30c37552731443295b629999c6d100f76310a2cd368503095af6165e2f52993d"}, + {file = "osqp-0.6.7.post3-cp37-cp37m-win_amd64.whl", hash = "sha256:2c3c31712c60d0421178040a6ee9644318fb579bd83375af4ffd9d5d7c9d2d2e"}, + {file = "osqp-0.6.7.post3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb3c73386d18be58097115f5f8623860d5736c5b956eb54e492b91380cab549e"}, + {file = "osqp-0.6.7.post3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:27396891b4c52baae44d9aef4ad2abf7da9a19946c5cbdd163f96a55de02515f"}, + {file = "osqp-0.6.7.post3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb39a937c5fbfe935cebc21c9ef51434cabe5a6f415a775b8a0939c39aa31671"}, + {file = "osqp-0.6.7.post3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:204857fdd4100ad0d487cac4e9c1698843440ec49c1d49b03aa369588cd2db65"}, + {file = "osqp-0.6.7.post3-cp38-cp38-win_amd64.whl", hash = "sha256:4981c0f2b28bce3731d614953da11b4dd30106ea3e4d7d0a5f7dd3a93270934a"}, + {file = "osqp-0.6.7.post3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e605e3ec1547a23be16ea52ade3157d4e2e7935472dd9c0c089a9c6b3463be"}, + {file = "osqp-0.6.7.post3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:82f14aaf099be0888b47e50699006c16107b30f53a7bc27070075d56d23c822c"}, + {file = "osqp-0.6.7.post3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7938f6e4fe2b8b9737b4b7b0dda48bf0f11c14104b79c07ce0b1fe475f4e1308"}, + {file = "osqp-0.6.7.post3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:298617772814480fce4610ea1f3abac3deac3ffdc978b0df4916f1021d128c66"}, + {file = "osqp-0.6.7.post3-cp39-cp39-win_amd64.whl", hash = "sha256:894e65b8e4c81f0ef069af6b2ec398881aafe4dd265869b1647ee18a2a9393b1"}, + {file = "osqp-0.6.7.post3.tar.gz", hash = "sha256:b0c5e0a721f21c9724097a4fd50108304d296468d124e16f34ac67046f7020e1"}, ] [package.dependencies] @@ -900,236 +832,250 @@ numpy = ">=1.7" qdldl = "*" scipy = ">=0.13.2" +[package.extras] +dev = ["scipy (!=1.12.0)"] + [[package]] name = "packaging" -version = "23.2" +version = "24.2" description = "Core utilities for Python packages" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] [[package]] name = "pillow" -version = "10.2.0" +version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, - {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, - {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, - {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, - {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, - {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, - {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, - {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, - {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, - {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, - {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, - {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, - {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, - {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, - {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, - {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, - {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, - {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, - {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, - {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, - {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, - {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, - {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, - {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, - {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, - {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, - {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, - {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, - {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, - {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, - {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, - {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, - {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, - {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, + {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, + {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, + {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, + {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, + {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, + {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, + {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, + {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, + {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, + {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, + {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, + {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, + {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, + {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, + {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, + {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, + {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, + {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, + {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, + {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, + {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, + {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, + {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, + {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, + {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] typing = ["typing-extensions"] xmp = ["defusedxml"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "pybind11" -version = "2.11.1" -description = "Seamless operability between C++11 and Python" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pybind11-2.11.1-py3-none-any.whl", hash = "sha256:33cdd02a6453380dd71cc70357ce388ad1ee8d32bd0e38fc22b273d050aa29b3"}, - {file = "pybind11-2.11.1.tar.gz", hash = "sha256:00cd59116a6e8155aecd9174f37ba299d1d397ed4a6b86ac1dfe01b3e40f2cc4"}, -] - -[package.extras] -global = ["pybind11-global (==2.11.1)"] - [[package]] name = "pydantic" -version = "2.7.0" +version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.7.0-py3-none-any.whl", hash = "sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352"}, - {file = "pydantic-2.7.0.tar.gz", hash = "sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"}, + {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, + {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, ] [package.dependencies] -annotated-types = ">=0.4.0" -pydantic-core = "2.18.1" -typing-extensions = ">=4.6.1" +annotated-types = ">=0.6.0" +pydantic-core = "2.27.2" +typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata"] [[package]] name = "pydantic-core" -version = "2.18.1" +version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226"}, - {file = "pydantic_core-2.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a"}, - {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17"}, - {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7"}, - {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6"}, - {file = "pydantic_core-2.18.1-cp310-none-win32.whl", hash = "sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649"}, - {file = "pydantic_core-2.18.1-cp310-none-win_amd64.whl", hash = "sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0"}, - {file = "pydantic_core-2.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80"}, - {file = "pydantic_core-2.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc"}, - {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d"}, - {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519"}, - {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9"}, - {file = "pydantic_core-2.18.1-cp311-none-win32.whl", hash = "sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb"}, - {file = "pydantic_core-2.18.1-cp311-none-win_amd64.whl", hash = "sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9"}, - {file = "pydantic_core-2.18.1-cp311-none-win_arm64.whl", hash = "sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0"}, - {file = "pydantic_core-2.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8"}, - {file = "pydantic_core-2.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06"}, - {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90"}, - {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a"}, - {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b"}, - {file = "pydantic_core-2.18.1-cp312-none-win32.whl", hash = "sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411"}, - {file = "pydantic_core-2.18.1-cp312-none-win_amd64.whl", hash = "sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6"}, - {file = "pydantic_core-2.18.1-cp312-none-win_arm64.whl", hash = "sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048"}, - {file = "pydantic_core-2.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09"}, - {file = "pydantic_core-2.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e"}, - {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb"}, - {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9"}, - {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622"}, - {file = "pydantic_core-2.18.1-cp38-none-win32.whl", hash = "sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad"}, - {file = "pydantic_core-2.18.1-cp38-none-win_amd64.whl", hash = "sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278"}, - {file = "pydantic_core-2.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de"}, - {file = "pydantic_core-2.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570"}, - {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2"}, - {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db"}, - {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6"}, - {file = "pydantic_core-2.18.1-cp39-none-win32.whl", hash = "sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b"}, - {file = "pydantic_core-2.18.1-cp39-none-win_amd64.whl", hash = "sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539"}, - {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59"}, - {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6"}, - {file = "pydantic_core-2.18.1.tar.gz", hash = "sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, + {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, + {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, + {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, + {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, + {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, + {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, + {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, + {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, + {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, + {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, + {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, + {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, + {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, + {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506"}, + {file = "pydantic_core-2.27.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5"}, + {file = "pydantic_core-2.27.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_armv7l.whl", hash = "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9"}, + {file = "pydantic_core-2.27.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win32.whl", hash = "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b"}, + {file = "pydantic_core-2.27.2-cp38-cp38-win_amd64.whl", hash = "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, + {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, + {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, + {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, + {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, + {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, + {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, + {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, ] [package.dependencies] @@ -1137,13 +1083,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "pyparsing" -version = "3.1.1" +version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.9" files = [ - {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, - {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, ] [package.extras] @@ -1209,13 +1155,13 @@ testing = ["filelock"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -1223,30 +1169,50 @@ six = ">=1.5" [[package]] name = "qdldl" -version = "0.1.7.post0" +version = "0.1.7.post5" description = "QDLDL, a free LDL factorization routine." optional = false python-versions = "*" files = [ - {file = "qdldl-0.1.7.post0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ab02e8b9ff86bd644a1935718387c82fbe04c31e3309cf9f7a121d02b1deda8"}, - {file = "qdldl-0.1.7.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e5d6753310377451ed4dc09b1ef28faf40108b713e7f55c8a8ae94d679a672"}, - {file = "qdldl-0.1.7.post0-cp310-cp310-win_amd64.whl", hash = "sha256:718d8e141832e96ba71ca1807a74813836c6403110faaa3d33a67de1af3b29c4"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e3f06e8a49ddd834b24fc3d7afbba4fec0923101045aa2666e18d2a9980e329"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a81c46522dd6b3042e2348fa98128bb5c0e466f42bce214e80cfb766ff40930"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-win_amd64.whl", hash = "sha256:4a86155f3de66c5db0e21544b7a2421c671028fa20da407686d2a8d0e9b57e51"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:717cb1892b033c01a0aae84ededcfa1f05bcb97013095d779c497e6c32f90dac"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc35432913085d94b2327242cf51388467ef7a37ac0d71eb31b594b575dd498"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:fd5cfd8c50f33ddacb830594a63b8c1093a24aea45312b9d2ed826cea5ece08a"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:981ca8672e9506976c663552c1eb6f6daf9726d62650b3bf5900260946156166"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ec670d97cf756f9159dc0a11de5cf054e88aefe84bea1c7282f00334642843"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:aa208703b44337a7e77f6f2663f7a452144becb4421970d534ff8297b92e1e10"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b42649484f7c0d8ee659224ecaac0a3e97f12531018207f4d7323e4071320eb1"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26aa3d6f0da7779265d72e8f418094003e75fa53c515a53bc03fd8b9bcfbf7de"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-win_amd64.whl", hash = "sha256:e55bcd6962178029faf543addd49db145302dd51e19855fefa71b5fd55840eea"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1dd0e570e65aaf35e10b7fb345f7ac763fd05a2227b9c06ce65e07993fc4984"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae161342529852b6248ace4642bc4ee371a7c1e0707b7bc43a43ef7e73c06ca3"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-win_amd64.whl", hash = "sha256:092f6606690a2b9bd3c939f3147887e02de13bb068fbed5ffdc7459034def623"}, - {file = "qdldl-0.1.7.post0.tar.gz", hash = "sha256:f346a114c8342ee6d4dbd6471eef314199fb268d3bf7b95885ca351fde2b023f"}, + {file = "qdldl-0.1.7.post5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:882658853edd24a7d16912af29e77320e061b150b4ed7cf94fd01907f2e925b4"}, + {file = "qdldl-0.1.7.post5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e30a80d71ab5889a1e169304b12bc3ab69210775f6428153873584ff8dfb50e5"}, + {file = "qdldl-0.1.7.post5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3640594ea643e4b2c2b40a6f21ad7a6c5bdfaaf5f13a5256538b631d474d7b77"}, + {file = "qdldl-0.1.7.post5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba00c93f547eff8aa13af300c7b7573b27caf30209b25ec8f16f2ff810b9653f"}, + {file = "qdldl-0.1.7.post5-cp310-cp310-win_amd64.whl", hash = "sha256:66c5e0e9175dd0c2a511b4dc9e0ee106ababc5e4e05ef8107598f14e346c5632"}, + {file = "qdldl-0.1.7.post5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa22df45e625c763d129b2893b284b7bde16a535a7e900288d588be9dc24fe9f"}, + {file = "qdldl-0.1.7.post5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e196871dafe4febb86c2886713c8a2226d19455226e56e3b9480aa78eb59b5e"}, + {file = "qdldl-0.1.7.post5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ba5ff31a66d1f92b41d0b97d27288d28a8c849dd6db2221a579b1a5a5a6df0f"}, + {file = "qdldl-0.1.7.post5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c34872867c2bcac60279034594eac8dee042b9dedd4c45948e55884b8c5c9cd0"}, + {file = "qdldl-0.1.7.post5-cp311-cp311-win_amd64.whl", hash = "sha256:b1280e886f734e3d0d67f643e3d76c55d2e23d0e7b06d89b987681dc165892c5"}, + {file = "qdldl-0.1.7.post5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d67a95d0ba73147a05cf98dc9284103f64150c9e2c214cd35ee0258f06922c5e"}, + {file = "qdldl-0.1.7.post5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e23d684427ce49f5d657e353322363555d1a31605fe72cbe4b965a4e260742c"}, + {file = "qdldl-0.1.7.post5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c4953d4fe61951fb515a6439009248b5a7b73627d74ee929d02b19bea41b19d"}, + {file = "qdldl-0.1.7.post5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520dbe4006a333c773ff474d2dc1e0af928c0dc7d9ca36db5637ba738ee608ba"}, + {file = "qdldl-0.1.7.post5-cp312-cp312-win_amd64.whl", hash = "sha256:13dfc0b225a5c180512488fa51f1771e8fa3c06d7fce9fd3c1d018bc03ba0eec"}, + {file = "qdldl-0.1.7.post5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7600985d2321cb15f71f8bb3a92ef2a85284b4fd740d8bbd4960b8c2f7ee6d33"}, + {file = "qdldl-0.1.7.post5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:314153f574641c846a85ff9b4a5c0e0d23e32d0de11d8381866bb27577088bef"}, + {file = "qdldl-0.1.7.post5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42b1ee3840d7d8ef4f1e3ffce0620116a71abd72c52ba46e0c194d4b294a0ad2"}, + {file = "qdldl-0.1.7.post5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cba6df1eedbaea844485e1c7a6ae9013bbdc86f07c4ebb13c89249b003de4ef4"}, + {file = "qdldl-0.1.7.post5-cp313-cp313-win_amd64.whl", hash = "sha256:cc9be378e7bec67d4c62b7fa27cafb4f77d3e5e059d753c3dce0a5ae1ef5fea0"}, + {file = "qdldl-0.1.7.post5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f25708dde1978aaec11fc161040230c007d81d4a7528c279f6045bd692bd7ea7"}, + {file = "qdldl-0.1.7.post5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08c191fc6b595b5b31c5ee3b30277e77dd0e4cfc7cd452d76acb564b8342d8f5"}, + {file = "qdldl-0.1.7.post5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3373b02e31965a6032a6a96992737ce1986911758d96338633ebc72bdd01a216"}, + {file = "qdldl-0.1.7.post5-cp36-cp36m-win_amd64.whl", hash = "sha256:c7db6c8426cd5bbe6dc88d6a8e4f76de01309315aa3d9f57ed03549bb8671c48"}, + {file = "qdldl-0.1.7.post5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:20ba0aa2e4f15c3708125493610377920132ab4542d0a6e02b190a7134ccbf3b"}, + {file = "qdldl-0.1.7.post5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6da81b4799dfe95ed4b17aab05777e2385417e60dfe684930b7c3c1a89502934"}, + {file = "qdldl-0.1.7.post5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c78bcb478ff9a791e8125685a6e0ebe666e3d75e33e84ba6ac90de182b85032e"}, + {file = "qdldl-0.1.7.post5-cp37-cp37m-win_amd64.whl", hash = "sha256:c082c39c28def441d59812f88e7a6d2c96179bcf045a5e444aa32f49a7422284"}, + {file = "qdldl-0.1.7.post5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e4d995569dd004729a9fc11b005be0051815acb60cec3f96615ac57353fcfb6"}, + {file = "qdldl-0.1.7.post5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f03dc5c21deeb111b8585dc4dfba0015ef4d1c7d21267e8f3beb7383229cd1cb"}, + {file = "qdldl-0.1.7.post5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f64b13d37a5a4254b38370c9396196918e4463c1a9578b4b11480d4f12461090"}, + {file = "qdldl-0.1.7.post5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63543e19350160d2a5f5789026678646c3290c55cd9fde0978ee7afba905b3a1"}, + {file = "qdldl-0.1.7.post5-cp38-cp38-win_amd64.whl", hash = "sha256:9719a2baea306fe53ae53a7bbf556a4f042c7d9a218240f2410368071a3fe8f7"}, + {file = "qdldl-0.1.7.post5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e89019cf035d9c3bbd03391c59be2efd9553fcde72c8326a1d6ffa8987a5c4"}, + {file = "qdldl-0.1.7.post5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6eb7368d8b82f11344e89032a29d57c2f83a4acd39e1e529a777cf1a7c15bcba"}, + {file = "qdldl-0.1.7.post5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d778ce1a96e0705a2d89c69b619abdb2dfdd156157ddb4191b3086eab8f95ab"}, + {file = "qdldl-0.1.7.post5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aea639a5a2f85cd102710c65a709270d5293f0695a75d9656f1c175750afb065"}, + {file = "qdldl-0.1.7.post5-cp39-cp39-win_amd64.whl", hash = "sha256:eac992a8f4287328078b6ed0f5022bf68e43d5fce3e9d067765b40c95ed45f51"}, + {file = "qdldl-0.1.7.post5.tar.gz", hash = "sha256:0b1399e1c49b5bed5aac8fd63ef08ab708d340c37fb426fe00128bc1f36b286e"}, ] [package.dependencies] @@ -1255,73 +1221,108 @@ scipy = ">=0.13.2" [[package]] name = "scipy" -version = "1.11.4" +version = "1.15.1" description = "Fundamental algorithms for scientific computing in Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "scipy-1.11.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc9a714581f561af0848e6b69947fda0614915f072dfd14142ed1bfe1b806710"}, - {file = "scipy-1.11.4-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cf00bd2b1b0211888d4dc75656c0412213a8b25e80d73898083f402b50f47e41"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9999c008ccf00e8fbcce1236f85ade5c569d13144f77a1946bef8863e8f6eb4"}, - {file = "scipy-1.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:933baf588daa8dc9a92c20a0be32f56d43faf3d1a60ab11b3f08c356430f6e56"}, - {file = "scipy-1.11.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8fce70f39076a5aa62e92e69a7f62349f9574d8405c0a5de6ed3ef72de07f446"}, - {file = "scipy-1.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:6550466fbeec7453d7465e74d4f4b19f905642c89a7525571ee91dd7adabb5a3"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f313b39a7e94f296025e3cffc2c567618174c0b1dde173960cf23808f9fae4be"}, - {file = "scipy-1.11.4-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:1b7c3dca977f30a739e0409fb001056484661cb2541a01aba0bb0029f7b68db8"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00150c5eae7b610c32589dda259eacc7c4f1665aedf25d921907f4d08a951b1c"}, - {file = "scipy-1.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:530f9ad26440e85766509dbf78edcfe13ffd0ab7fec2560ee5c36ff74d6269ff"}, - {file = "scipy-1.11.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5e347b14fe01003d3b78e196e84bd3f48ffe4c8a7b8a1afbcb8f5505cb710993"}, - {file = "scipy-1.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:acf8ed278cc03f5aff035e69cb511741e0418681d25fbbb86ca65429c4f4d9cd"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:028eccd22e654b3ea01ee63705681ee79933652b2d8f873e7949898dda6d11b6"}, - {file = "scipy-1.11.4-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2c6ff6ef9cc27f9b3db93a6f8b38f97387e6e0591600369a297a50a8e96e835d"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b030c6674b9230d37c5c60ab456e2cf12f6784596d15ce8da9365e70896effc4"}, - {file = "scipy-1.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad669df80528aeca5f557712102538f4f37e503f0c5b9541655016dd0932ca79"}, - {file = "scipy-1.11.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ce7fff2e23ab2cc81ff452a9444c215c28e6305f396b2ba88343a567feec9660"}, - {file = "scipy-1.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:36750b7733d960d7994888f0d148d31ea3017ac15eef664194b4ef68d36a4a97"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e619aba2df228a9b34718efb023966da781e89dd3d21637b27f2e54db0410d7"}, - {file = "scipy-1.11.4-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:f3cd9e7b3c2c1ec26364856f9fbe78695fe631150f94cd1c22228456404cf1ec"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d10e45a6c50211fe256da61a11c34927c68f277e03138777bdebedd933712fea"}, - {file = "scipy-1.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91af76a68eeae0064887a48e25c4e616fa519fa0d38602eda7e0f97d65d57937"}, - {file = "scipy-1.11.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6df1468153a31cf55ed5ed39647279beb9cfb5d3f84369453b49e4b8502394fd"}, - {file = "scipy-1.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:ee410e6de8f88fd5cf6eadd73c135020bfbbbdfcd0f6162c36a7638a1ea8cc65"}, - {file = "scipy-1.11.4.tar.gz", hash = "sha256:90a2b78e7f5733b9de748f589f09225013685f9b218275257f8a8168ededaeaa"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:4b17d4220df99bacb63065c76b0d1126d82bbf00167d1730019d2a30d6ae01ea"}, + {file = "scipy-1.15.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:63b9b6cd0333d0eb1a49de6f834e8aeaefe438df8f6372352084535ad095219e"}, + {file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f151e9fb60fbf8e52426132f473221a49362091ce7a5e72f8aa41f8e0da4f25"}, + {file = "scipy-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e10b1dd56ce92fba3e786007322542361984f8463c6d37f6f25935a5a6ef52"}, + {file = "scipy-1.15.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5dff14e75cdbcf07cdaa1c7707db6017d130f0af9ac41f6ce443a93318d6c6e0"}, + {file = "scipy-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:f82fcf4e5b377f819542fbc8541f7b5fbcf1c0017d0df0bc22c781bf60abc4d8"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5bd8d27d44e2c13d0c1124e6a556454f52cd3f704742985f6b09e75e163d20d2"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:be3deeb32844c27599347faa077b359584ba96664c5c79d71a354b80a0ad0ce0"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:5eb0ca35d4b08e95da99a9f9c400dc9f6c21c424298a0ba876fdc69c7afacedf"}, + {file = "scipy-1.15.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:74bb864ff7640dea310a1377d8567dc2cb7599c26a79ca852fc184cc851954ac"}, + {file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:667f950bf8b7c3a23b4199db24cb9bf7512e27e86d0e3813f015b74ec2c6e3df"}, + {file = "scipy-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395be70220d1189756068b3173853029a013d8c8dd5fd3d1361d505b2aa58fa7"}, + {file = "scipy-1.15.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce3a000cd28b4430426db2ca44d96636f701ed12e2b3ca1f2b1dd7abdd84b39a"}, + {file = "scipy-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:3fe1d95944f9cf6ba77aa28b82dd6bb2a5b52f2026beb39ecf05304b8392864b"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c09aa9d90f3500ea4c9b393ee96f96b0ccb27f2f350d09a47f533293c78ea776"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:0ac102ce99934b162914b1e4a6b94ca7da0f4058b6d6fd65b0cef330c0f3346f"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:09c52320c42d7f5c7748b69e9f0389266fd4f82cf34c38485c14ee976cb8cb04"}, + {file = "scipy-1.15.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:cdde8414154054763b42b74fe8ce89d7f3d17a7ac5dd77204f0e142cdc9239e9"}, + {file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c9d8fc81d6a3b6844235e6fd175ee1d4c060163905a2becce8e74cb0d7554ce"}, + {file = "scipy-1.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fb57b30f0017d4afa5fe5f5b150b8f807618819287c21cbe51130de7ccdaed2"}, + {file = "scipy-1.15.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491d57fe89927fa1aafbe260f4cfa5ffa20ab9f1435025045a5315006a91b8f5"}, + {file = "scipy-1.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:900f3fa3db87257510f011c292a5779eb627043dd89731b9c461cd16ef76ab3d"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c"}, + {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e"}, + {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e"}, + {file = "scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4"}, + {file = "scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0"}, + {file = "scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54"}, + {file = "scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c"}, + {file = "scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5"}, + {file = "scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6"}, ] [package.dependencies] -numpy = ">=1.21.6,<1.28.0" +numpy = ">=1.23.5,<2.5" [package.extras] -dev = ["click", "cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"] -doc = ["jupytext", "matplotlib (>2)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] -test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scs" -version = "3.2.4.post1" +version = "3.2.7.post2" description = "Splitting conic solver" optional = false python-versions = ">=3.7" files = [ - {file = "scs-3.2.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51fed30d2a4a1e6fbfc1e52b4cb3adeecbe89d7c47f3539b49afbb852415fe19"}, - {file = "scs-3.2.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0524c0b9c3ed0d65dae161475accf3efa8e170938eb93251a60e9709b156ee"}, - {file = "scs-3.2.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:534519819eea96f18902a9fce15c4ec562b99d23b38dc843a48cb137b5641613"}, - {file = "scs-3.2.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d04ee4d19ac6d0f5053663bc48fcd5c5faed534272f13b10a4e173c814eea69"}, - {file = "scs-3.2.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c23b4299ab77ff5f654573d5667dc982292a8ef2b979053b38c40663919f13"}, - {file = "scs-3.2.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ae4624938d3e3a8b7e508029275c6ad7a978fd48c158d0818f69f4ae764bf945"}, - {file = "scs-3.2.4.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40294e22bfe509bdf7fd65a6b77c38cec22dcb3567ff5a75f3c41a1faf2ef1d5"}, - {file = "scs-3.2.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2337acb0604770b6df1473254065a51c210ff9c82fc7c4490595510287a337"}, - {file = "scs-3.2.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8689e75a57e59846e65d1c4b9d57e9964b00fcbb8e67fc77f98cf6e0a0530abd"}, - {file = "scs-3.2.4.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad991b00d0a87c85db57bf2f1863c21bdc4e2f13837f6c35e809f5936bc6f165"}, - {file = "scs-3.2.4.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28af160a44268e726a59d6cf340629b82940c1a643c4c87fe777e9cbe550d75"}, - {file = "scs-3.2.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:f6283f725f3fee63d4631c2532d01a5b2ea65883b04d3da3be06084b1c60171b"}, - {file = "scs-3.2.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b3a622cf2120ae765f0f3ad5c6f4f86796d317e29132bab2ad4af3c14d9bf4d"}, - {file = "scs-3.2.4.post1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4b5259137c263304effa2b28d0125437ac23569e6e7753c115ae1206ec5033fd"}, - {file = "scs-3.2.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424710bc19b0506feee7e05e6d2b7af98acf09af5bd5353126164cbd46ac923f"}, - {file = "scs-3.2.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:e21bdc8046648846e2c204a6c5cf24eaaedd2b8f5e0a2ab41a647b0247b8d592"}, - {file = "scs-3.2.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cea0f7e9473f43f7edf1641d020ead7e39653a81c540fbdba8f3b7b8480038c9"}, - {file = "scs-3.2.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6126f1d7ed5ff368cb8c1836715b17a50074314579eefc6d511995a3ab93d70"}, - {file = "scs-3.2.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:18788befa5284bb1f49149bac7f813703de60ef5b6bf7698a9f1c3a5a49b78e4"}, - {file = "scs-3.2.4.post1.tar.gz", hash = "sha256:7015d7a56d1d5b53264fd277289ea169949309e26101677ff88cd0e5030d032f"}, + {file = "scs-3.2.7.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7271ff566ac9df929c8cf7d1b024b89c3882b541c21a7a6d9aa94480822bccb"}, + {file = "scs-3.2.7.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb2997f53ef3426934599517c6e0e77f4f05cc23c3aa2380fd176c7fd22bc0c8"}, + {file = "scs-3.2.7.post2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8307b7302f8105148478a5723a2f7d5a3cbf86ef3cc6f27567203addfa3b10"}, + {file = "scs-3.2.7.post2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:f34cc43c9eb1092423b55f01430ad99b4e5825a6595ead8e081f985032685e8c"}, + {file = "scs-3.2.7.post2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f645f3789bc4659de2a468c2e4db552f6656bcb286e81f3cb42d5a607028627b"}, + {file = "scs-3.2.7.post2-cp310-cp310-win_amd64.whl", hash = "sha256:e5f90940c383b68dd7960b734105cd1dd6c11c80275321de3a6388f563a1ff19"}, + {file = "scs-3.2.7.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d551b90d9e2c0497ee17d8c3db325d6fcefa4419057954e68709da8b9184d4f"}, + {file = "scs-3.2.7.post2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c15d035dda04a6626d3cd9b68d3bf814d2e0eb3cb372021775bd358fd8c7405"}, + {file = "scs-3.2.7.post2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6da6add18f039e7e08f0ebc13cb1f853ec4c96ae81d7a578f46e0f9f0e5bf4b5"}, + {file = "scs-3.2.7.post2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d6c965f026e56c92b59a9c96744eb90178982c270ab196f58a0260ac392785aa"}, + {file = "scs-3.2.7.post2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0427a5bf9aa43eb2a22083e1a43412db5054a88d695fdaa6018cd6fb3a9f0203"}, + {file = "scs-3.2.7.post2-cp311-cp311-win_amd64.whl", hash = "sha256:4d05ec092c891eb842630f343ebc0c46d2ef6047f325a835771b13f9804d6b3b"}, + {file = "scs-3.2.7.post2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:99e4af2968b046ee55fa0dc89dcd3bfba771f1027d9224cb6efa10008d8bfee1"}, + {file = "scs-3.2.7.post2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc46fef9743d4629337382f034fda92dfce338659e8377afae674517b7d8345f"}, + {file = "scs-3.2.7.post2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f92e925d89004276a449850926a45536f75c03cab701b5e758b1a7efa119ba08"}, + {file = "scs-3.2.7.post2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:640faf61f85b933fdfc3d33d7ce4f0049b082b245e82d2d6a8c2c54aa0b7f540"}, + {file = "scs-3.2.7.post2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a520c9bef84eee734df0da3e5e06aa9192d3be34cd5e6d4221cc01f4d09b20c0"}, + {file = "scs-3.2.7.post2-cp312-cp312-win_amd64.whl", hash = "sha256:2995d4099943c3fd754b3e39fe178a9c03dcb9c7d84b40f64ac5eb26d8d6085a"}, + {file = "scs-3.2.7.post2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aaa3753e82250913e17c792e7ca7eb0bde03ac41200923f3dfd3f6bd5ec6f308"}, + {file = "scs-3.2.7.post2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:08e9c20b482c03f292b3da7ce4cbddb2697508ffd747304564868e87da7cb4b2"}, + {file = "scs-3.2.7.post2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56af9310bd2d000c45d7829e2935b5445480ea6bcc6091c58d4e3ab2a94125be"}, + {file = "scs-3.2.7.post2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:ec6e7bdb18d4b84c7f56f94db445ec0c43deec5aa659201467aa85b2f64b8123"}, + {file = "scs-3.2.7.post2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:91316903b2ea625990abe18bb92e8ce63536e5eafb9623ecf1cb199fb05ea574"}, + {file = "scs-3.2.7.post2-cp313-cp313-win_amd64.whl", hash = "sha256:a2c48cd19e39bf87dae0b20a289fff44930458fc2ca2afa0f899058dc41e5545"}, + {file = "scs-3.2.7.post2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1efca4a10fca530b22ded7bdbca004059e047e2c97a5023d5b7d5146897a7d8a"}, + {file = "scs-3.2.7.post2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:604abfabdfd4a14389144791b43e1ee22507ad1d0bde27a52908166f64f1ab96"}, + {file = "scs-3.2.7.post2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:d17f6258d58a430acef79aa4f004e6ded323724443baed05eaa73fc4cfa40c27"}, + {file = "scs-3.2.7.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:de11c855577eb6f695ba93088d47c348858e7c34812139a3c532ebb36bd2d81d"}, + {file = "scs-3.2.7.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:900ccd6040f635ef6869779d70ba7260a73a0b8bcc9eb3e5eac55f54d6611044"}, + {file = "scs-3.2.7.post2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c4fd9b7bd328d1d432d4fbb86054982a1e5c2aa589394c8257bd5f67ae84ea51"}, + {file = "scs-3.2.7.post2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746a3ee4f9307a000c6599c6e3067a0a377f3902c36e6a7c7ea01ee040b06f54"}, + {file = "scs-3.2.7.post2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b5f974c29c40eab2bf12b273c00daa7cc8011a2628c5397e3c61ac6b32ab9485"}, + {file = "scs-3.2.7.post2-cp38-cp38-win_amd64.whl", hash = "sha256:05da761821a14b8ebe54427510cbe10722b3433db4e953acd7a067893e955781"}, + {file = "scs-3.2.7.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ed80e841680d62a3c3b4e5757852f88df19ca6ef85bd61f7abaefb64994cfd04"}, + {file = "scs-3.2.7.post2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93de54f8acf83d224e007babfa410823838b28dc4a2d2c964396b52e13b78c61"}, + {file = "scs-3.2.7.post2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3562d84b6187959f9c7bcf2ad254e82a6674593729c4d85917d2f8536f89f2b2"}, + {file = "scs-3.2.7.post2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:f9d523d91904e2fba13ae0348789badd3270bba329208126d5457869e0180da2"}, + {file = "scs-3.2.7.post2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4a30b9d9bdcdc823acfaf5b72b7689dd699e8ab80b9dfab529628e9b2c765266"}, + {file = "scs-3.2.7.post2-cp39-cp39-win_amd64.whl", hash = "sha256:82422e7bc04300f6381afc4a6df2897e577cbe072daba29cd67856b28dba9718"}, + {file = "scs-3.2.7.post2.tar.gz", hash = "sha256:4245a4f76328cc73911f20e1414df68d41ead4bcc4a187503a9cd639b644014b"}, ] [package.dependencies] @@ -1330,81 +1331,85 @@ scipy = "*" [[package]] name = "setuptools" -version = "69.0.3" +version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, + {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "setuptools-scm" -version = "8.0.4" +version = "8.1.0" description = "the blessed package to manage your versions by scm tags" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"}, - {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"}, + {file = "setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3"}, + {file = "setuptools_scm-8.1.0.tar.gz", hash = "sha256:42dea1b65771cba93b7a515d65a65d8246e560768a66b9106a592c8e7f26c8a7"}, ] [package.dependencies] packaging = ">=20" setuptools = "*" -typing-extensions = "*" [package.extras] -docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +docs = ["entangled-cli (>=2.0,<3.0)", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] rich = ["rich"] -test = ["build", "pytest", "rich", "wheel"] +test = ["build", "pytest", "rich", "typing-extensions", "wheel"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "tqdm" -version = "4.66.1" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "trx-python" -version = "0.2.9" +version = "0.3" description = "Experiments with new file format for tractography" optional = false python-versions = ">=3.8" files = [ - {file = "trx-python-0.2.9.tar.gz", hash = "sha256:16b4104d7c991879c601f60e8d587decac50ce60388aae8d0c754a92136d1caf"}, - {file = "trx_python-0.2.9-py3-none-any.whl", hash = "sha256:234438b7f103c49768ab98e5f46e7b2624327065cd23fbfce5e681c32e8b4a3f"}, + {file = "trx_python-0.3-py3-none-any.whl", hash = "sha256:b00efb1024022a7835cc8b36e024a4ea575f19ce3fae81deb50b709fc8abcb49"}, + {file = "trx_python-0.3.tar.gz", hash = "sha256:193e3282eaf03610c7e1b848aec04ddb9498fad3a7b684b30ca358e06751fbfd"}, ] [package.dependencies] @@ -1420,13 +1425,13 @@ test = ["flake8", "psutil", "pytest (>=7)", "pytest-console-scripts (>=0)"] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [metadata] diff --git a/pydesigner/fitting/dwipy.py b/pydesigner/fitting/dwipy.py index 408fc05..cee92e3 100644 --- a/pydesigner/fitting/dwipy.py +++ b/pydesigner/fitting/dwipy.py @@ -335,7 +335,7 @@ def tensorType(self) -> List[str]: if "fbi" in type and "dki" in type: type.append("fbwm") if not type: - raise ValueError("tensortype: Error in determining maximum " "BVAL") + raise ValueError("tensortype: Error in determining maximum BVAL") return type def isdti(self) -> bool: @@ -522,7 +522,7 @@ def createTensorOrder(self, order: Union[int, None] = None) -> Tuple[np.ndarray[ - 1 ) else: - raise ValueError("createTensorOrder: Please enter valid " "order values (2 or 4).") + raise ValueError("createTensorOrder: Please enter valid order values (2 or 4).") return cnt, ind def fibonacciSphere(self, samples: int = 1, randomize: bool = True) -> np.ndarray[float]: @@ -1192,7 +1192,7 @@ def optimal_lmax(self) -> int: l_max suitable for DWI. """ if not self.isfbi(): - raise Exception("Input DWI is not an " "FBI or HARDI acquisiton. Cannot compute " "l_max.") + raise Exception("Input DWI is not an FBI or HARDI acquisiton. Cannot compute l_max.") fbi_vols = np.count_nonzero(self.grad[self.idxfbi(), -1]) l_max = 0 vols = (l_max + 1) * (l_max / 2 + 1) @@ -1670,7 +1670,7 @@ def fbi_helper( "Please run DWI.fit(constraints) before running DWI.fbi()." ) if l_max % 2 != 0: - raise Exception("Please provide l_max as a postive " "and even integer") + raise Exception("Please provide l_max as a postive and even integer") if l_max > self.optimal_lmax(): print( "[WARNING]: l_max value provided ({}) is " @@ -2166,9 +2166,7 @@ def akccorrect(self, akc_out: np.ndarray[bool], window: int = 3, connectivity: s connLimit = 24 else: raise Exception( - 'Connectivity choice "{}" is invalid. Please ' 'enter either "all" or "face".'.format( - connectivity - ) + 'Connectivity choice "{}" is invalid. Please enter either "all" or "face".'.format(connectivity) ) nVoil = np.sum(patchViol) @@ -2235,13 +2233,13 @@ def irlls( # assert('option: Excludeb0 should be set to True or False') if maxiter < 1 or maxiter > 200: - assert "option: Maxiter should be set to a value between 1 " "and 200" + assert "option: Maxiter should be set to a value between 1 and 200" if convcrit < 0 or convcrit > 1: - assert "option: Maxiter should be set to a value between 1 " "and 200" + assert "option: Maxiter should be set to a value between 1 and 200" if not (mode == "DKI" or mode == "DTI"): assert "Mode should be set to DKI or DTI" if leverage < 0 or leverage > 1: - assert "option: Leverage should be set to a value between 0 " "and 1" + assert "option: Leverage should be set to a value between 0 and 1" if bounds < 1: assert "option: Bounds should be set to a value >= 1" exclude_idx = np.ones_like(self.grad[:, 3], dtype=bool) @@ -2616,7 +2614,7 @@ def tensorReorder(self, dwiType: str) -> Tuple[np.ndarray[float], np.ndarray[flo 20 14 """ if self.dt is None: - raise Exception("Please run dwi.fit() to generate a tensor " "prior to reordering tensors.") + raise Exception("Please run dwi.fit() to generate a tensor prior to reordering tensors.") if dwiType == "dti": dt = np.zeros((6, self.dt.shape[1])) diff --git a/pydesigner/main.py b/pydesigner/main.py index e80193f..ec27341 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -31,7 +31,7 @@ # Locate mrtrix3 via which-ing dwidenoise dwidenoise_location = shutil.which("dwidenoise") if dwidenoise_location is None: - raise OSError("Cannot find mrtrix3, please see " "https://github.com/m-ama/PyDesigner/wiki" " to troubleshoot.") + raise OSError("Cannot find mrtrix3, please see https://github.com/m-ama/PyDesigner/wiki to troubleshoot.") # Extract mrtrix3 path from dwidenoise_location mrtrix3path = op.dirname(dwidenoise_location) @@ -39,7 +39,7 @@ # Locate FSL via which-ing fsl fsl_location = shutil.which("fsl") if fsl_location is None: - raise OSError("Cannot find FSL, please see " "https://github.com/m-ama/PyDesigner/wiki" " to troubleshoot.") + raise OSError("Cannot find FSL, please see https://github.com/m-ama/PyDesigner/wiki to troubleshoot.") # Extract FSL path from fsl_location fslpath = op.dirname(fsl_location) @@ -112,7 +112,7 @@ def main(): parser.add_argument( "dwi", nargs="+", - help="The diffusion dataset you would like " "to process. ", + help="The diffusion dataset you would like to process. ", type=str, ) @@ -121,7 +121,7 @@ def main(): "-o", "--output", metavar="directory", - help="Output location. " "Default: same path as dwi.", + help="Output location. Default: same path as dwi.", type=str, ) parser.add_argument( @@ -144,7 +144,7 @@ def main(): "--extent", metavar="n,n,n", default="5,5,5", - help="Denoising extent formatted n,n,n (forces " " denoising. " "Default: 5,5,5.", + help="Denoising extent formatted n,n,n (forces denoising. Default: 5,5,5.", ) parser.add_argument( "-g", @@ -160,7 +160,7 @@ def main(): "--undistort", action="store_true", default=False, - help="Run FSL eddy to perform image undistortion. " "NOTE: needs a --topup to run.", + help="Run FSL eddy to perform image undistortion. NOTE: needs a --topup to run.", ) parser.add_argument( "--rpe_pairs", @@ -185,14 +185,14 @@ def main(): type=float, default=1.25, metavar="n", - help="The FWHM to use as a multiple of voxel size. " "Default 1.25", + help="The FWHM to use as a multiple of voxel size. Default 1.25", ) parser.add_argument( "-r", "--rician", action="store_true", default=False, - help="Perform Rician noise correction on the data " "(requires --denoise to generate a noisemap).", + help="Perform Rician noise correction on the data (requires --denoise to generate a noisemap).", ) parser.add_argument( "--nofit", @@ -212,7 +212,7 @@ def main(): "--nooutliers", action="store_true", default=False, - help="Do not perform outlier correction on kurtosis " "fitting metrics.", + help="Do not perform outlier correction on kurtosis fitting metrics.", ) parser.add_argument( "-m", @@ -227,7 +227,7 @@ def main(): "--maskthr", metavar="n", default=0.25, - help="FSL bet threshold used for brain masking. " "Default: 0.25", + help="FSL bet threshold used for brain masking. Default: 0.25", ) parser.add_argument( "--user_mask", @@ -240,7 +240,7 @@ def main(): "--csf_fsl", action="store_true", default=False, - help="Compute a CSF mask for CSF-excluded " "smoothing to minimize partial volume " "effects using FSL FAST.", + help="Compute a CSF mask for CSF-excluded smoothing to minimize partial volume effects using FSL FAST.", ) parser.add_argument( "-cd", @@ -266,9 +266,7 @@ def main(): "--interp", action="store_true", default="linear", - help="Set the interpolation to use when " - "reslicing. Choices are linear (default), " - "nearest, cubic, and sinc.", + help="Set the interpolation to use when reslicing. Choices are linear (default), nearest, cubic, and sinc.", ) parser.add_argument( "-te", @@ -284,14 +282,14 @@ def main(): "--fit_constraints", default="0,1,0", metavar="D>0,K>0,K < 3/(b*D)", - help="Constrain the WLLS fit. " "Default: 0,1,0.", + help="Constrain the WLLS fit. Default: 0,1,0.", ) parser.add_argument( "--l_max", default=6, type=int, metavar="n", - help="Maximum spherical harmonic degree for " "FBI spherical harmonic expansion", + help="Maximum spherical harmonic degree for FBI spherical harmonic expansion", ) parser.add_argument( "--no_rectify", @@ -314,7 +312,7 @@ def main(): "--t_fibers", type=int, default=5, - help="The maximum number ODF maxima to extract per " "voxel for tractography. Default: 5", + help="The maximum number ODF maxima to extract per voxel for tractography. Default: 5", ) parser.add_argument( "--noqc", @@ -340,17 +338,17 @@ def main(): "--nthreads", type=int, default=None, - help="Number of threads to use for computation. " "Note that using too many threads will cause a slow-" "down.", + help="Number of threads to use for computation. Note that using too many threads will cause a slow-down.", ) parser.add_argument( "--resume", action="store_true", - help="Continue from an aborted or partial previous " "run of pydesigner.", + help="Continue from an aborted or partial previous run of pydesigner.", ) parser.add_argument( "--force", action="store_true", - help="Force overwrites of existing files. Otherwise, " "there will be an error at runtime.", + help="Force overwrites of existing files. Otherwise, there will be an error at runtime.", ) parser.add_argument( "--verbose", @@ -467,7 +465,7 @@ def main(): # Cannot run --user_mask and --mask at the same time if args.user_mask and args.mask: errmsg += "Cannot run with both --mask and --user_mask; " - errmsg += "--mask if you do not have a custom brain mask and " "--user_mask if you want to supply a mask." + errmsg += "--mask if you do not have a custom brain mask and --user_mask if you want to supply a mask." # Cannot run --csf_fsl and --csf_adc at the same time if args.csf_fsl and args.csf_adc: @@ -887,7 +885,7 @@ def main(): cmd = ["mrcalc", "-force", brainmask_out, csfmask_out, "-mult", csfmask_out] completion = subprocess.run(cmd) if completion.returncode != 0: - raise Exception("Unable to multiply CSF mask with brain " "mask. See above for errors.") + raise Exception("Unable to multiply CSF mask with brain mask. See above for errors.") # ----------------------------------------------------------------- # Smooth # ----------------------------------------------------------------- @@ -922,7 +920,7 @@ def main(): os.rename(mif_smoothing, working_path) # update command history cmdtable["smooth"] = [ - "designer.preprocessing.mrpreproc.smooth(input={}, " "output={}, " "fwhm={}".format( + "designer.preprocessing.mrpreproc.smooth(input={}, output={}, fwhm={}".format( working_path, mif_smoothing, args.fwhm ) ] @@ -963,7 +961,7 @@ def main(): os.rename(mif_rician, working_path) # update command history cmdtable["rician"] = [ - "designer.preprocessing.mrpreproc." "riciancorrect(input={}, " "output={}, " "noise={})".format( + "designer.preprocessing.mrpreproc.riciancorrect(input={}, output={}, noise={})".format( working_path, mif_rician, filetable["noisemap"].getFull() ) ] @@ -1061,7 +1059,7 @@ def main(): ) snr.makeplot(path=qcpath, smooth=True, smoothfactor=3) except: # noqa: E722 - print("[WARNING] SNR plotting failed, see above. " "Proceeding with processing.") + print("[WARNING] SNR plotting failed, see above. Proceeding with processing.") # ----------------------------------------------------------------- # Write logs diff --git a/pydesigner/plotting/motionplot.py b/pydesigner/plotting/motionplot.py index 405ed9c..1d7d7a1 100644 --- a/pydesigner/plotting/motionplot.py +++ b/pydesigner/plotting/motionplot.py @@ -31,11 +31,9 @@ def plot(input: str, output: str, voxel: Union[Tuple[float], None] = None) -> No if not op.exists(input): raise OSError("Input file {} does not exist".format(input)) if op.isdir(output): - raise OSError( - "Output {} cannot be a directory. Please " "define the output to be an image file.".format(output) - ) + raise OSError("Output {} cannot be a directory. Please define the output to be an image file.".format(output)) if op.splitext(output)[-1] != ".png": - raise OSError("Output path {} does not indicate a PNG file" " ".format(input)) + raise OSError("Output path {} does not indicate a PNG file ".format(input)) # Load file dat = np.loadtxt(input) if dat.shape[-1] != 2: @@ -73,9 +71,9 @@ def plot(input: str, output: str, voxel: Union[Tuple[float], None] = None) -> No plt.text( 0, -2, - "$\dag$ average voxel dimension is used in " - "converting voxel displacement to head displacement " - "$V_{avg} = (V_x + V_y + V_z) / 3$", + r"$\dag$ average voxel dimension is used in " + r"converting voxel displacement to head displacement " + r"$V_{avg} = (V_x + V_y + V_z) / 3$", ha="left", size=6, ) diff --git a/pydesigner/plotting/outlierplot.py b/pydesigner/plotting/outlierplot.py index 21fa5e6..94ad950 100644 --- a/pydesigner/plotting/outlierplot.py +++ b/pydesigner/plotting/outlierplot.py @@ -42,11 +42,9 @@ def plot( if op.splitext(input)[-1] != ".nii": raise OSError("Input file {} is not nifti type".format(input)) if op.isdir(output): - raise OSError( - "Output {} cannot be a directory. Please " "define the output to be an image file.".format(output) - ) + raise OSError("Output {} cannot be a directory. Please define the output to be an image file.".format(output)) if op.splitext(output)[-1] != ".png": - raise OSError("Output path {} does not indicate a PNG file" "".format(input)) + raise OSError("Output path {} does not indicate a PNG file".format(input)) hdr = nib.load(input) img = np.array(hdr.dataobj) truncateIdx = np.isnan(img) @@ -55,11 +53,11 @@ def plot( dims[0] * dims[1] * dims[2] # no. of voxels vols = dims[-1] # number of volumes if np.ndim(img) != 4: - raise Exception("Only 4D nifti files can be read. " "User-supplied file is not a 4D nifti.") + raise Exception("Only 4D nifti files can be read. User-supplied file is not a 4D nifti.") if mask is not None: if op.exists(mask): if op.splitext(mask)[-1] != ".nii": - raise OSError("Input maks {} is not nifti type " "".format(mask)) + raise OSError("Input maks {} is not nifti type ".format(mask)) hdr_mask = nib.load(mask) bw = np.array(hdr_mask.dataobj) else: diff --git a/pydesigner/plotting/snrplot.py b/pydesigner/plotting/snrplot.py index f22e2c5..fe018a4 100644 --- a/pydesigner/plotting/snrplot.py +++ b/pydesigner/plotting/snrplot.py @@ -54,14 +54,14 @@ def __init__( Path to nifti brain mask (Default: None). """ if noisepath is None: - raise Exception("Please provide the path to noise map from " '"dwidenoise"') + raise Exception('Please provide the path to noise map from "dwidenoise"') self.nDWI = len(dwilist) # Number of input DWIs self.DWInames = [op.split(i)[-1] for i in dwilist] # Open the first image in list self.hdr = nib.load(dwilist[0]) if self.hdr.ndim != 4: - raise IOError("Input DWIs need are not 4D. Please ensure you " "use 4D NifTi files only.") + raise IOError("Input DWIs need are not 4D. Please ensure you use 4D NifTi files only.") # Load image into 2D array self.img = np.array(self.hdr.dataobj) # Load noise into a vector @@ -90,13 +90,13 @@ def __init__( tmp = vectorize(np.array(nib.load(dwilist[i]).dataobj), self.mask) self.img = np.dstack((self.img, tmp)) except: # noqa: E722 - raise ValueError("all input DWIs must have the same " "shape.") + raise ValueError("all input DWIs must have the same shape.") try: fName = op.splitext(dwilist[i])[0] bvalPath = op.join(fName + ".bval") self.bval = np.stack((self.bval, np.rint(np.loadtxt(bvalPath) / 1000))) except: # noqa: E722 - raise IOError("Unable to locate BVAL file for image: {" "}".format(dwilist[i])) + raise IOError("Unable to locate BVAL file for image: {}".format(dwilist[i])) truncateIdx = np.logical_or(np.isnan(self.img), (self.img < minZero)) self.img[truncateIdx] = minZero @@ -185,7 +185,7 @@ def histcount(self, nbins: int = 100) -> Tuple[np.ndarray[int], np.ndarray[float Array containing all unique B-values detected. """ if not isinstance(nbins, int): - raise ValueError("Number of bins (nbins) entered is not an " "integer. Please specify and integer.") + raise ValueError("Number of bins (nbins) entered is not an integer. Please specify and integer.") bval_list = self.getuniquebval() snr = self.computesnr() # Get min and max values of SNR @@ -203,9 +203,7 @@ def histcount(self, nbins: int = 100) -> Tuple[np.ndarray[int], np.ndarray[float (count[:, i, j], edges[:, i, j]) = np.histogram(vals, bins=nbins, range=(minVal, maxVal), density=True) edges = np.unique(edges) if edges.size != nbins + 1: - raise Exception( - "Number of binning edges across B-values and " "DWIs is not consistent. Aborting SNR " "binning." - ) + raise Exception("Number of binning edges across B-values and DWIs is not consistent. Aborting SNR binning.") binval = np.zeros((nbins)) for i in range(binval.size): binval[i] = np.median([edges[i], edges[i + 1]]) @@ -228,7 +226,7 @@ def makeplot(self, path: str, smooth: bool = True, smoothfactor: int = 5) -> Non None: Writes out image into directory as SNR.png """ if not isinstance(smoothfactor, int): - raise ValueError("Please specify an integer for smooth " "factor.") + raise ValueError("Please specify an integer for smooth factor.") if not op.isdir(path): raise IOError("Output path defined does not exist.") outpath = op.join(path, "SNR.png") diff --git a/pydesigner/postprocessing/filters.py b/pydesigner/postprocessing/filters.py index 7b7ed2f..145851b 100644 --- a/pydesigner/postprocessing/filters.py +++ b/pydesigner/postprocessing/filters.py @@ -77,7 +77,7 @@ def median(input: str, output: str, mask: Union[str, None] = None) -> None: hdr, img = readnii(input) if mask is not None: if not op.exists(mask): - raise IOError("Input mask {} does not " "exist.".format(input)) + raise IOError("Input mask {} does not exist.".format(input)) maskhdr, mask = readnii(mask) else: mask = np.ones((img.shape[0], img.shape[1], img.shape[2]), order="F") @@ -89,5 +89,5 @@ def median(input: str, output: str, mask: Union[str, None] = None) -> None: elif np.ndim(img) == 3: img = median_filter(img, footprint=conn, mode="constant", cval=float("nan")) * mask else: - raise Exception("Input nifti image needs to be either 3D or " "4D. Please check the file provided.") + raise Exception("Input nifti image needs to be either 3D or 4D. Please check the file provided.") writenii(hdr, img, output) diff --git a/pydesigner/preprocessing/mrinfoutil.py b/pydesigner/preprocessing/mrinfoutil.py index 4cd0618..435a883 100644 --- a/pydesigner/preprocessing/mrinfoutil.py +++ b/pydesigner/preprocessing/mrinfoutil.py @@ -29,7 +29,7 @@ def getconsole(path: int, flag: str) -> str: MRtrix3's mrinfo console output. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not isinstance(flag, str): raise TypeError("Input flag is not a string") arg = ["mrinfo", flag] @@ -198,12 +198,12 @@ def transform(path: str) -> Tuple[float]: Image transformation matrix. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") arg = ["mrinfo", "-transform"] arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) console = str(completion.stdout).split("\\n") num = [re.findall(r"[-+]?\d*\.\d+|\d+", s) for s in console] num = [s for s in num if s != []] @@ -225,7 +225,7 @@ def commandhistory(path: str) -> List[str]: command history of input file """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -237,7 +237,7 @@ def commandhistory(path: str) -> List[str]: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) # Remove new line delimiter console = str(completion.stdout).split("\\n") # Remove 'b' @@ -269,7 +269,7 @@ def dwscheme(path: str) -> List[float]: diffusion weighing scheme. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -281,7 +281,7 @@ def dwscheme(path: str) -> List[float]: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) # Remove new line delimiter console = str(completion.stdout).split("\\n") # Remove 'b' @@ -317,7 +317,7 @@ def pescheme(path: str) -> List[float]: Phase encoding scheme. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -329,7 +329,7 @@ def pescheme(path: str) -> List[float]: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) # Remove new line delimiter console = str(completion.stdout).split("\\n") # Remove 'b' @@ -364,7 +364,7 @@ def shells(path: str) -> int: Number of shells. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -376,7 +376,7 @@ def shells(path: str) -> int: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) # Remove new line delimiter console = str(completion.stdout).split("\\n") # Remove 'b' @@ -409,7 +409,7 @@ def num_shells(path: str) -> int: Number of shells. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -435,7 +435,7 @@ def max_shell(path: str) -> int: Max b-value """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -447,7 +447,7 @@ def max_shell(path: str) -> int: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) # Remove new line delimiter console = str(completion.stdout).split("\\n") # Remove 'b' @@ -482,7 +482,7 @@ def is_fullsphere(path: str) -> bool: False if half-spherical sampling. """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -493,7 +493,7 @@ def is_fullsphere(path: str) -> bool: arg = ["dirstat", path, "-output", "ASYM"] completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) # Remove new line delimiter console = str(completion.stdout).split("\\n") # Remove 'b' @@ -541,7 +541,7 @@ def echotime(path: str) -> Union[int, str]: 'variable' """ if not op.exists(path): - raise OSError("Input path does not exist. Please ensure that the " "folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") ftype = format(path) if ftype != "MRtrix": raise IOError( @@ -553,7 +553,7 @@ def echotime(path: str) -> Union[int, str]: arg.append(path) completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise IOError("Input {} is not currently supported by " "PyDesigner.".format(path)) + raise IOError("Input {} is not currently supported by PyDesigner.".format(path)) console = str(completion.stdout).split("\\n")[0] console = console.split("b")[-1] console = console.replace("'", "") diff --git a/pydesigner/preprocessing/mrpreproc.py b/pydesigner/preprocessing/mrpreproc.py index e8fc17b..1115f97 100644 --- a/pydesigner/preprocessing/mrpreproc.py +++ b/pydesigner/preprocessing/mrpreproc.py @@ -15,7 +15,13 @@ from ..system.models import input_path_validator, modelmrtrix, output_path_validator -def miftonii(input: str, output: str, nthreads: int = None, force: bool = True, verbose: bool = False) -> None: +def miftonii( + input: str, + output: str, + nthreads: int = None, + force: bool = True, + verbose: bool = False, +) -> None: """Converts input `.mif` images to output `.nii` images Parameters @@ -74,7 +80,13 @@ def miftonii(input: str, output: str, nthreads: int = None, force: bool = True, raise MRTrixError(msg) -def niitomif(input: str, output: str, nthreads: int = None, force: bool = True, verbose: bool = False) -> None: +def niitomif( + input: str, + output: str, + nthreads: int = None, + force: bool = True, + verbose: bool = False, +) -> None: """Converts input `.nii` images to output `.mif` images provided that all BVEC, BVAL and JSON files are provided and named same as input .nii @@ -132,7 +144,12 @@ def niitomif(input: str, output: str, nthreads: int = None, force: bool = True, def stride_match( - target: str, moving: str, output: str, nthreads: int = None, force: bool = True, verbose: bool = False + target: str, + moving: str, + output: str, + nthreads: int = None, + force: bool = True, + verbose: bool = False, ) -> None: """Matches strides on inputs target and moving by converting strides on moving image to those of target image. @@ -245,7 +262,13 @@ def denoise( raise MRTrixError(msg) -def degibbs(input: str, output: str, nthreads: int = None, force: bool = False, verbose: bool = False) -> None: +def degibbs( + input: str, + output: str, + nthreads: int = None, + force: bool = False, + verbose: bool = False, +) -> None: """Runs MRtrix3's `mrdegibbs` command with optimal parameters for PyDesigner. @@ -404,7 +427,7 @@ def undistort( ) arg.extend(["-se_epi", epi_path]) except: # noqa: E722 - print("[WARNING] Unable to apply TOPUPBOOST because DWI " "consists of single PE direction.") + print("[WARNING] Unable to apply TOPUPBOOST because DWI consists of single PE direction.") # Remove the B0_ALL.mif file that is created when epiboost # function fails try: @@ -429,7 +452,7 @@ def undistort( try: os.remove(epi_path) except: # noqa: E722 - print("[Warning] unable to remove {} because it does not " "exist".format(epi_path)) + print("[Warning] unable to remove {} because it does not exist".format(epi_path)) def brainmask(input, output, thresh=0.25, nthreads=None, force=False, verbose=False): @@ -473,14 +496,20 @@ def brainmask(input, output, thresh=0.25, nthreads=None, force=False, verbose=Fa mask = op.join(outdir, "brain") tmp_brain = op.join(outdir, "brain.nii") # Extract averaged B0 from DWI - extractmeanbzero(input=opts.input, output=B0_nan, nthreads=opts.nthreads, force=opts.force, verbose=opts.verbose) + extractmeanbzero( + input=opts.input, + output=B0_nan, + nthreads=opts.nthreads, + force=opts.force, + verbose=opts.verbose, + ) # Compute brain mask arg_mask = ["bet", B0_nan, mask, "-m", "-f", str(thresh)] completion = subprocess.run(arg_mask) if completion.returncode != 0: - msg = f"Unable to compute brain mask from B0. Return code: {completion.returncode}" - msg += f"\nCommand: {' '.join(arg_mask)}" - msg += f"\FSL error: {completion.stderr}" + msg = rf"Unable to compute brain mask from B0. Return code: {completion.returncode}" + msg += rf"\nCommand: {' '.join(arg_mask)}" + msg += rf"\FSL error: {completion.stderr}" raise MRTrixError(msg) # Remove intermediary file os.remove(B0_nan) @@ -529,7 +558,7 @@ def csfmask( None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -537,14 +566,14 @@ def csfmask( "directory.".format(op.dirname(output)) ) if (op.splitext(output))[-1] != ".nii": - raise IOError("Output filename {} must be specified as a " "NifTi (.nii) file.") + raise IOError("Output filename {} must be specified as a NifTi (.nii) file.") if (thresh < 0) or (thresh > 1): raise ValueError("BET Threshold needs to be within 0 to 1 range.") if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") outdir = op.dirname(output) @@ -570,14 +599,14 @@ def csfmask( arg_mask = ["bet", B0_nan, path_brain, "-m", "-f", str(thresh)] completion = subprocess.run(arg_mask) if completion.returncode != 0: - raise Exception("Unable to compute brain mask from B0. See above " "for errors") + raise Exception("Unable to compute brain mask from B0. See above for errors") arg = ["fast"] if verbose: arg.append("-v") arg.extend(["-n", "4", "-t", "2", "-o", path_tissue, path_brain + f_suffix]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("FSL FAST segmentation of brain tissue failed. " "See above for errors.") + raise Exception("FSL FAST segmentation of brain tissue failed. See above for errors.") csfclass = [] for i in range(4): arg = [ @@ -590,7 +619,7 @@ def csfmask( ] completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("FSLMATHS tissue thresholding failed. " "See above for errors.") + raise Exception("FSLMATHS tissue thresholding failed. See above for errors.") arg = [ "fslstats", path_brain + ".nii", @@ -601,7 +630,7 @@ def csfmask( ] completion = subprocess.run(arg, stdout=subprocess.PIPE) if completion.returncode != 0: - raise Exception("FSLSTATS tissue thresholding failed. " "See above for errors.") + raise Exception("FSLSTATS tissue thresholding failed. See above for errors.") console = str(completion.stdout).split("\\n")[0] console = console.split("b")[-1] console = console.replace("'", "") @@ -621,7 +650,7 @@ def csfmask( ] completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Unable to create CSF mask. " "See above for errors.") + raise Exception("Unable to create CSF mask. See above for errors.") # Remove intermediate files os.remove(B0_nan) os.remove(op.join(outdir, path_brain + f_suffix)) @@ -675,7 +704,7 @@ def csfmask( ) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Unable to compute pseudo ADC. " "See above for errors.") + raise Exception("Unable to compute pseudo ADC. See above for errors.") os.remove(path_b0) os.remove(path_shell) @@ -700,7 +729,7 @@ def smooth(input, output, csfname=None, fwhm=1.25, size=5): None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -709,11 +738,11 @@ def smooth(input, output, csfname=None, fwhm=1.25, size=5): ) if csfname is not None: if not op.exists(csfname): - raise OSError("Path to CSF mask does not exist. Please " "ensure that the file specified exists.") + raise OSError("Path to CSF mask does not exist. Please ensure that the file specified exists.") if fwhm < 0: raise Exception("FWHM cannot be less than zero.") if size < 0: - raise Exception("Size cannot be less than zero. Please " "specify size as a positive integer.") + raise Exception("Size cannot be less than zero. Please specify size as a positive integer.") # Convert input .mif to .nii outdir = op.dirname(output) nii_path = op.join(outdir, "dwism.nii") @@ -746,7 +775,7 @@ def riciancorrect(input, output, noise=None): None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -759,7 +788,7 @@ def riciancorrect(input, output, noise=None): if op.splitext(noise)[-1] != ".nii": raise OSError("Noisemap needs to be in NifTi format.") else: - raise Exception("Rician correction cannot be performed without a " "noisemap.") + raise Exception("Rician correction cannot be performed without a noisemap.") # Convert input .mif to .nii outdir = op.dirname(output) nii_path = op.join(outdir, "dwirc.nii") @@ -798,7 +827,7 @@ def extractbzero(input, output, nthreads=None, force=False, verbose=False): None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -807,9 +836,9 @@ def extractbzero(input, output, nthreads=None, force=False, verbose=False): ) if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") arg = ["dwiextract"] @@ -822,7 +851,7 @@ def extractbzero(input, output, nthreads=None, force=False, verbose=False): arg.extend(["-bzero", input, output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Unable to extract B0s from DWI for computation " "of brain mask. See above for errors.") + raise Exception("Unable to extract B0s from DWI for computation of brain mask. See above for errors.") def extractmeanbzero(input, output, nthreads=None, force=False, verbose=False): @@ -848,7 +877,7 @@ def extractmeanbzero(input, output, nthreads=None, force=False, verbose=False): None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -857,9 +886,9 @@ def extractmeanbzero(input, output, nthreads=None, force=False, verbose=False): ) if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") outdir = op.dirname(output) @@ -870,11 +899,11 @@ def extractmeanbzero(input, output, nthreads=None, force=False, verbose=False): arg_mean = ["mrmath", "-axis", "3", fname_bzero, "mean", fname_mean] completion = subprocess.run(arg_mean) if completion.returncode != 0: - raise Exception("Unable to compute mean of B0s. See above for" "errors.") + raise Exception("Unable to compute mean of B0s. See above forerrors.") arg_nan = ["mrcalc", fname_mean, "-finite", fname_mean, "0", "-if", output] completion = subprocess.run(arg_nan) if completion.returncode != 0: - raise Exception("Unable to remove NaNs from averaged B0. See " "above for errors.") + raise Exception("Unable to remove NaNs from averaged B0. See above for errors.") # Remove non-essential files os.remove(fname_bzero) os.remove(fname_mean) @@ -903,7 +932,7 @@ def extractnonbzero(input, output, nthreads=None, force=False, verbose=False): None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -912,9 +941,9 @@ def extractnonbzero(input, output, nthreads=None, force=False, verbose=False): ) if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") arg = ["dwiextract"] @@ -927,7 +956,7 @@ def extractnonbzero(input, output, nthreads=None, force=False, verbose=False): arg.extend(["-no_bzero", input, output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Unable to extract B0s from DWI for computation " "of brain mask. See above for errors.") + raise Exception("Unable to extract B0s from DWI for computation of brain mask. See above for errors.") def extractshell(input, output, shell, nthreads=None, force=False, verbose=False): @@ -955,7 +984,7 @@ def extractshell(input, output, shell, nthreads=None, force=False, verbose=False None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -963,14 +992,14 @@ def extractshell(input, output, shell, nthreads=None, force=False, verbose=False "directory.".format(op.dirname(output)) ) if not isinstance(shell, int): - raise Exception("Please specify the shell to extract as an " "integer.") + raise Exception("Please specify the shell to extract as an integer.") if shell < 0: - raise Exception("Please specify the shell to extract as a " "positive (more than 0) integer.") + raise Exception("Please specify the shell to extract as a positive (more than 0) integer.") if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") arg = ["dwiextract"] @@ -983,7 +1012,7 @@ def extractshell(input, output, shell, nthreads=None, force=False, verbose=False arg.extend(["-no_bzero", "-singleshell", "-shell", str(shell), input, output]) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Unable to extract specified shells from DWI. " "See above for errors.") + raise Exception("Unable to extract specified shells from DWI. See above for errors.") def extractmeanshell(input, output, shell, nthreads=None, force=False, verbose=False): @@ -1011,7 +1040,7 @@ def extractmeanshell(input, output, shell, nthreads=None, force=False, verbose=F None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -1019,14 +1048,14 @@ def extractmeanshell(input, output, shell, nthreads=None, force=False, verbose=F "directory.".format(op.dirname(output)) ) if not isinstance(shell, int): - raise Exception("Please specify the shell to extract as an " "integer.") + raise Exception("Please specify the shell to extract as an integer.") if shell < 0: - raise Exception("Please specify the shell to extract as a " "positive (more than 0) integer.") + raise Exception("Please specify the shell to extract as a positive (more than 0) integer.") if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") outdir = op.dirname(output) @@ -1038,11 +1067,11 @@ def extractmeanshell(input, output, shell, nthreads=None, force=False, verbose=F arg_mean = ["mrmath", "-axis", "3", fname_shell, "mean", fname_mean] completion = subprocess.run(arg_mean) if completion.returncode != 0: - raise Exception("Unable to compute mean of B0s. See above for" "errors.") + raise Exception("Unable to compute mean of B0s. See above forerrors.") arg_nan = ["mrcalc", fname_mean, "-finite", fname_mean, "0", "-if", output] completion = subprocess.run(arg_nan) if completion.returncode != 0: - raise Exception("Unable to remove NaNs from averaged shell " "image. See above for errors.") + raise Exception("Unable to remove NaNs from averaged shell image. See above for errors.") # Remove non-essential files os.remove(fname_shell) os.remove(fname_mean) @@ -1078,7 +1107,7 @@ def epiboost(input, output, num=1, nthreads=None, force=False, verbose=False): """ print("Applying EPIBOOST") if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if op.splitext(output)[-1] != ".mif": raise OSError("Output should be specified as a .mif file.") if not op.exists(op.dirname(output)): @@ -1088,14 +1117,14 @@ def epiboost(input, output, num=1, nthreads=None, force=False, verbose=False): "directory.".format(op.dirname(output)) ) if not isinstance(num, int): - raise Exception("Number of B0s to use needs to be specified " "as an integer.") + raise Exception("Number of B0s to use needs to be specified as an integer.") if not num > 0: - raise Exception("Number of B0s to use needs to be a positive " "integer greater than 0.") + raise Exception("Number of B0s to use needs to be a positive integer greater than 0.") if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") outdir = op.dirname(output) @@ -1118,7 +1147,7 @@ def epiboost(input, output, num=1, nthreads=None, force=False, verbose=False): uPE, indPE, iPE = np.unique(pe_scheme, axis=0, return_index=True, return_inverse=True) nPE = len(uPE) if nPE < 2: - raise Exception("DWI consists of just one PE direction. " "Unable to extract B0s.") + raise Exception("DWI consists of just one PE direction. Unable to extract B0s.") # Index unique PE directions bval = [] bind = [] @@ -1152,7 +1181,7 @@ def epiboost(input, output, num=1, nthreads=None, force=False, verbose=False): arg_epi.extend([fname_bzero, output]) completion = subprocess.run(arg_epi) if completion.returncode != 0: - raise Exception("EPIBOOST: failed to extract specified " "TOPUP B0 indices. See above for errors.") + raise Exception("EPIBOOST: failed to extract specified TOPUP B0 indices. See above for errors.") # Remove temp files os.remove(fname_bzero) @@ -1197,7 +1226,7 @@ def reslice(input, output, size, interp="linear", nthreads=None, force=False, ve """ dim_str = "-voxel" if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -1205,7 +1234,7 @@ def reslice(input, output, size, interp="linear", nthreads=None, force=False, ve "directory.".format(op.dirname(output)) ) if not isinstance(size, str): - raise Exception("Voxel size needs to be defined as a string " " of three values") + raise Exception("Voxel size needs to be defined as a string of three values") if len(size.split(",")) != 3: raise Exception( "Please specify voxel size for each axis or " @@ -1216,14 +1245,14 @@ def reslice(input, output, size, interp="linear", nthreads=None, force=False, ve if max([float(x) for x in size.split(",")]) > 9: dim_str = "-size" if not isinstance(interp, str): - raise Exception("Interpolation method needs to be specified " "as a string") + raise Exception("Interpolation method needs to be specified as a string") if interp not in ("linear", "nearest", "cubic", "sinc"): - raise Exception("User specified interpoaltion method {} is " "not a valid option".format(interp)) + raise Exception("User specified interpoaltion method {} is not a valid option".format(interp)) if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") if dim_str == "-voxel": @@ -1283,16 +1312,16 @@ def dwiextract(input, output, start, end, nthreads=None, force=False, verbose=Fa None; writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not isinstance(start, int): raise Exception("Starting index is needs to be an integer.") if not isinstance(end, int): raise Exception("Ending index is needs to be an integer.") if nthreads is not None: if not isinstance(nthreads, int): - raise Exception("Please specify the number of threads as an " "integer.") + raise Exception("Please specify the number of threads as an integer.") if not isinstance(force, bool): - raise Exception("Please specify whether forced overwrite is True " "or False.") + raise Exception("Please specify whether forced overwrite is True or False.") if not isinstance(verbose, bool): raise Exception("Please specify whether verbose is True or False.") fname, ext = op.splitext(output) @@ -1319,4 +1348,4 @@ def dwiextract(input, output, start, end, nthreads=None, force=False, verbose=Fa ) completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Failed to extract indexed DWI volumes. See " "above for errors.") + raise Exception("Failed to extract indexed DWI volumes. See above for errors.") diff --git a/pydesigner/preprocessing/preparation.py b/pydesigner/preprocessing/preparation.py index 6f24ee9..99e27bc 100644 --- a/pydesigner/preprocessing/preparation.py +++ b/pydesigner/preprocessing/preparation.py @@ -187,7 +187,7 @@ def make_se_epi(filetable): get_rpe_info_args = ["mrinfo", "-size", tmp_tp] completion = subprocess.run(get_rpe_info_args, capture_output=True) if completion.returncode != 0: - raise Exception("Extracted topup information failed, " "please see above") + raise Exception("Extracted topup information failed, please see above") ndrpexstr = completion.stdout.decode("utf-8").rstrip().split(" ")[-1] ndrpex = int(ndrpexstr.rstrip('"')) diff --git a/pydesigner/preprocessing/util.py b/pydesigner/preprocessing/util.py index a782e38..f360f29 100644 --- a/pydesigner/preprocessing/util.py +++ b/pydesigner/preprocessing/util.py @@ -438,7 +438,7 @@ def cat(self, path, ext=".nii", verbose=False, force=False, resume=False): try: json2fslgrad(i) except: # noqa: E722 - raise IOError("Please supply a valid JSON file " "accompanying {}".format(i)) + raise IOError("Please supply a valid JSON file accompanying {}".format(i)) convert_args = ["mrconvert"] if verbose is False: convert_args.append("-quiet") @@ -474,9 +474,7 @@ def cat(self, path, ext=".nii", verbose=False, force=False, resume=False): completion = subprocess.run(cmd, shell=True) if completion.returncode != 0: raise Exception( - 'Please use the "--force" flag to ' - "overwrite existing outputs, or clear " - "the output directory" + 'Please use the "--force" flag to overwrite existing outputs, or clear the output directory' ) # The following command concatenates all DWI(i) into a single # .mif file if nDWI > 1 @@ -492,7 +490,7 @@ def cat(self, path, ext=".nii", verbose=False, force=False, resume=False): cmd = " ".join(str(e) for e in cat_arg) completion = subprocess.run(cmd, shell=True) if completion.returncode != 0: - raise Exception("Failed to concatenate multiple " "series.") + raise Exception("Failed to concatenate multiple series.") else: cat_arg = ["mrconvert"] if verbose is False: diff --git a/pydesigner/tractography/dsistudio.py b/pydesigner/tractography/dsistudio.py index dda9167..a805acf 100644 --- a/pydesigner/tractography/dsistudio.py +++ b/pydesigner/tractography/dsistudio.py @@ -20,7 +20,8 @@ import numpy as np from dipy.core.geometry import cart2sphere from dipy.core.sphere import HemiSphere -from dipy.direction import gfa, peak_directions +from dipy.direction import peak_directions +from dipy.reconst.odf import gfa from scipy.io.matlab import loadmat, savemat from tqdm import tqdm @@ -68,7 +69,7 @@ def convertLPS(input, output) -> None: None, writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -76,13 +77,13 @@ def convertLPS(input, output) -> None: "directory.".format(op.dirname(output)) ) if op.splitext(input)[-1] != ".nii": - raise IOError("Input file needs to specified as a NifTI " "(.nii)") + raise IOError("Input file needs to specified as a NifTI (.nii)") if op.splitext(output)[-1] != ".nii": - raise IOError("Output file needs to specified as a NifTI " "(.nii)") + raise IOError("Output file needs to specified as a NifTI (.nii)") arg = ["mrconvert", "-quiet", "-force", input, "-strides", "-1,-2,3,4", output] completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Conversion of NifTI file to LPS failed. " "Check above for errors.") + raise Exception("Conversion of NifTI file to LPS failed. Check above for errors.") def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps=None) -> None: @@ -124,7 +125,7 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= None, writes out file """ if not op.exists(input): - raise OSError("Input path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input path does not exist. Please ensure that the folder or file specified exists.") if not op.exists(op.dirname(output)): raise OSError( "Specifed directory for output file {} does not " @@ -132,22 +133,22 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= "directory.".format(op.dirname(output)) ) if op.splitext(input)[-1] != ".nii": - raise IOError("Input file needs to specified as a NifTI " "(.nii)") + raise IOError("Input file needs to specified as a NifTI (.nii)") if op.splitext(output)[-1] != ".fib": raise IOError("Output file needs to specified as a .fib file") if map is not None: if not op.exists(map): - raise OSError("Path to map image does not exist. Please " "ensure that the folder specified exists.") + raise OSError("Path to map image does not exist. Please ensure that the folder specified exists.") if mask is not None: if not op.exists(mask): - raise OSError("Path to brain mask does not exist. Please " "ensure that the folder specified exists.") + raise OSError("Path to brain mask does not exist. Please ensure that the folder specified exists.") if isinstance(other_maps, list) or other_maps is None: if isinstance(other_maps, list): if any([not op.exists(x) for x in other_maps]): - raise OSError("One of the paths defined in other maps does not " "exist Please ensure all files exist.") + raise OSError("One of the paths defined in other maps does not exist Please ensure all files exist.") else: raise TypeError( - "Path to other maps needs to be entered as a list of " "strings defining paths to other metric files." + "Path to other maps needs to be entered as a list of strings defining paths to other metric files." ) outdir = op.dirname(output) # Convert to LPS @@ -188,7 +189,7 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= ] completion = subprocess.run(arg) if completion.returncode != 0: - raise Exception("Failed to determine amplitude of SH " "coefficients. Check above for errors.") + raise Exception("Failed to determine amplitude of SH coefficients. Check above for errors.") # Load images amplitudes_data = nib.load(odf_amplitudes_nii) amplitudes_img = amplitudes_data.get_fdata() @@ -196,11 +197,14 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= mask_data = nib.load(mask_) mask_img = mask_data.get_fdata() if not np.allclose(mask_data.affine, amplitudes_data.affine): - raise ValueError("Differing orientation between mask and " "amplitudes.") + raise ValueError("Differing orientation between mask and amplitudes.") if not mask_img.shape == amplitudes_img.shape[:3]: - raise ValueError("Differing grid between mask and " "amplitudes") + raise ValueError("Differing grid between mask and amplitudes") else: - mask_img = np.ones((amplitudes_img.shape[0], amplitudes_img.shape[1], amplitudes_img.shape[2]), order="F") + mask_img = np.ones( + (amplitudes_img.shape[0], amplitudes_img.shape[1], amplitudes_img.shape[2]), + order="F", + ) # Make flat mask flat_mask = mask_img.flatten(order="F") > 0 odf_array = amplitudes_img.reshape(-1, amplitudes_img.shape[3], order="F") @@ -210,9 +214,9 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= map_data = nib.load(map_) map_img = map_data.get_fdata() if not np.allclose(map_data.affine, amplitudes_data.affine): - raise ValueError("Differing orientation between map image and " "amplitudes.") + raise ValueError("Differing orientation between map image and amplitudes.") if not map_img.shape == amplitudes_img.shape[:3]: - raise ValueError("Differing grid between map image and " "amplitudes") + raise ValueError("Differing grid between map image and amplitudes") map_img = map_img.flatten(order="F") map_img[map_img < 0] = 0 masked_map = map_img[flat_mask] @@ -302,7 +306,7 @@ def makefib(input, output, map=None, mask=None, n_fibers=5, scale=1, other_maps= other_data = nib.load(map_lps) other_img = other_data.get_fdata() if not other_img.shape == amplitudes_img.shape[:3]: - raise ValueError("Differing grid between other map image: {} " "and amplitudes".format(path_map)) + raise ValueError("Differing grid between other map image: {} and amplitudes".format(path_map)) gmap = other_img.flatten(order="F") dsi_mat[map_name] = gmap.astype(np.float32) os.remove(map_lps) diff --git a/pydesigner/tractography/odf.py b/pydesigner/tractography/odf.py index 31dd991..955357e 100644 --- a/pydesigner/tractography/odf.py +++ b/pydesigner/tractography/odf.py @@ -65,20 +65,18 @@ def __init__( (Default: 4) """ if not op.exists(dt): - raise OSError("Input DT path does not exist. Please ensure that " "the folder or file specified exists.") + raise OSError("Input DT path does not exist. Please ensure that the folder or file specified exists.") if kt is not None: if not op.exists(kt): - raise OSError( - "Input KT path does not exist. Please ensure that " "the folder or file specified exists." - ) + raise OSError("Input KT path does not exist. Please ensure that the folder or file specified exists.") if mask is not None: if not op.exists(mask): - raise OSError("Path to brain mask does not exist. Please " "ensure that the file specified exists.") + raise OSError("Path to brain mask does not exist. Please ensure that the file specified exists.") if scale is not None: if not op.exists(scale): - raise OSError("Path to scale image does not exist. Please " "ensure that the file specified exists.") + raise OSError("Path to scale image does not exist. Please ensure that the file specified exists.") if not isinstance(res, str): - raise Exception("Please specify resolution as a string. Possible " 'choices are "low", "med", or "high"') + raise Exception('Please specify resolution as a string. Possible choices are "low", "med", or "high"') # Load images self.hdr = nib.load(dt) self.DT = self.hdr.get_fdata() @@ -95,10 +93,10 @@ def __init__( else: self.scale_img = np.ones(self.DT.shape[0:3]) if l_max % 2 != 0: - raise Exception("Please provide l_max as a postive " "and even integer") + raise Exception("Please provide l_max as a postive and even integer") self.l_max = l_max if radial_weight is None: - warnings.warn("Radial weight for dODF computation not specified. " "Using default value of 4.") + warnings.warn("Radial weight for dODF computation not specified. Using default value of 4.") self.radial_weight = 4 else: self.radial_weight = radial_weight @@ -473,7 +471,7 @@ def dkiodf(self, form="spherical", fa_t=0.90) -> np.ndarray[float]: raise Exception("Please select a valid form of ODF to receive") if self.KT is None: raise AttributeError( - "WOAH! Cannot compute DKI ODFs without " "kurtosis tensor (KT). Try using dtiodf(), Jumbo." + "WOAH! Cannot compute DKI ODFs without kurtosis tensor (KT). Try using dtiodf(), Jumbo." ) # Vectorize images DT = vectorize(self.DT, self.mask_img) @@ -546,7 +544,7 @@ def dtiodf(self, form="spherical") -> np.ndarray[float]: DTI ODF in defined form """ if self.DT is None: - raise AttributeError("WOAH! Cannot compute DTI ODFs without " "diffusion tensor (DT), Jumbo.") + raise AttributeError("WOAH! Cannot compute DTI ODFs without diffusion tensor (DT), Jumbo.") # Vectorize images DT = vectorize(self.DT, self.mask_img) nvox = DT.shape[-1] @@ -914,7 +912,7 @@ def shbasis(deg, phi, theta, method="scipy") -> np.ndarray[complex]: try: deg = [int(x) for x in deg] except: # noqa: E722 - raise TypeError("Please supply degree of " "shperical harmonic as an integer") + raise TypeError("Please supply degree of shperical harmonic as an integer") if not isinstance(method, str): raise TypeError("Please enter method as a string") if method not in ["scipy", "tournier", "descoteaux"]: diff --git a/pydesigner/tractography/sphericalsampling.py b/pydesigner/tractography/sphericalsampling.py index fec7435..5658e82 100644 --- a/pydesigner/tractography/sphericalsampling.py +++ b/pydesigner/tractography/sphericalsampling.py @@ -61895,9 +61895,9 @@ def odfgrid(res="med") -> np.ndarray[float]: Average separation angle between each peak and its nearest neighbors. """ if not isinstance(res, str): - raise Exception("Please specify resolution as a string. Possible " 'choices are "low", "med", or "high"') + raise Exception('Please specify resolution as a string. Possible choices are "low", "med", or "high"') if res not in ["low", "med", "high"]: - raise Exception(". Invalid ODF resolution. Possible resolution choices " 'are "low", "med", or "high"') + raise Exception('. Invalid ODF resolution. Possible resolution choices are "low", "med", or "high"') if res == "low": S = np.array( [ diff --git a/pyproject.toml b/pyproject.toml index aa2921b..c8f994c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,24 +39,23 @@ cvxpy = ">=1.3.0, <2.0.0" matplotlib = ">=3.7.0, <4.0.0" pydantic = "^2.7.0" -[tool.poetry.scripts] -pydesigner = "pydesigner.main:main" - [tool.poetry.group.dev.dependencies] pytest = ">=7.4.0, <8.0.0" pytest-cov = "^5.0.0" pytest-xdist = "^3.6.1" +[tool.poetry.scripts] +pydesigner = "pydesigner.main:main" + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.ruff] -# Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default. -# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or -# McCabe complexity (`C901`) by default. -select = ["E", "F", "I"] -ignore = [] +line-length = 120 + +# Assume Python 3.12 +target-version = "py312" # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] @@ -90,15 +89,30 @@ exclude = [ "setup.py", ] -line-length = 120 - # Allow unused variables when underscore-prefixed. dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" -# Assume Python 3.11 -target-version = "py311" +[tool.ruff.lint] +# Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default. +# Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or +# McCabe complexity (`C901`) by default. +select = ["E", "F", "I"] +ignore = ["F841"] + +[tool.ruff.format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "pydesigner/fitting/__init__.py" = ["F401"] "pydesigner/plotting/__init__.py" = ["F401"] "pydesigner/postprocessing/__init__.py" = ["F401"] diff --git a/requirements-dev.txt b/requirements-dev.txt index cab9f33..8a09163 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,9 +1,9 @@ colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" -coverage[toml]==7.6.1 ; python_version >= "3.11" and python_version < "4.0" +coverage[toml]==7.6.10 ; python_version >= "3.11" and python_version < "4.0" execnet==2.1.1 ; python_version >= "3.11" and python_version < "4.0" iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" -pluggy==1.3.0 ; python_version >= "3.11" and python_version < "4.0" +packaging==24.2 ; python_version >= "3.11" and python_version < "4.0" +pluggy==1.5.0 ; python_version >= "3.11" and python_version < "4.0" pytest-cov==5.0.0 ; python_version >= "3.11" and python_version < "4.0" pytest-xdist==3.6.1 ; python_version >= "3.11" and python_version < "4.0" pytest==7.4.4 ; python_version >= "3.11" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index f26dc53..7f81221 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,37 +1,35 @@ -annotated-types==0.6.0 ; python_version >= "3.11" and python_version < "4.0" -clarabel==0.6.0 ; python_version >= "3.11" and python_version < "4.0" +annotated-types==0.7.0 ; python_version >= "3.11" and python_version < "4.0" +clarabel==0.9.0 ; python_version >= "3.11" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" -contourpy==1.2.0 ; python_version >= "3.11" and python_version < "4.0" -cvxpy==1.4.1 ; python_version >= "3.11" and python_version < "4.0" +contourpy==1.3.1 ; python_version >= "3.11" and python_version < "4.0" +cvxpy==1.6.0 ; python_version >= "3.11" and python_version < "4.0" cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" -cython==3.0.8 ; python_version >= "3.11" and python_version < "4.0" -deepdiff==6.7.1 ; python_version >= "3.11" and python_version < "4.0" -dill==0.3.7 ; python_version >= "3.11" and python_version < "4.0" -dipy==1.8.0 ; python_version >= "3.11" and python_version < "4.0" -ecos==2.0.12 ; python_version >= "3.11" and python_version < "4.0" -fonttools==4.47.2 ; python_version >= "3.11" and python_version < "4.0" -h5py==3.10.0 ; python_version >= "3.11" and python_version < "4.0" -joblib==1.3.2 ; python_version >= "3.11" and python_version < "4.0" -kiwisolver==1.4.5 ; python_version >= "3.11" and python_version < "4.0" -matplotlib==3.8.2 ; python_version >= "3.11" and python_version < "4.0" -multiprocess==0.70.15 ; python_version >= "3.11" and python_version < "4.0" -nibabel==5.2.0 ; python_version >= "3.11" and python_version < "4.0" -numpy==1.26.3 ; python_version >= "3.11" and python_version < "4.0" -ordered-set==4.1.0 ; python_version >= "3.11" and python_version < "4.0" -osqp==0.6.3 ; python_version >= "3.11" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.11" and python_version < "4.0" -pillow==10.2.0 ; python_version >= "3.11" and python_version < "4.0" -pybind11==2.11.1 ; python_version >= "3.11" and python_version < "4.0" -pydantic-core==2.18.1 ; python_version >= "3.11" and python_version < "4.0" -pydantic==2.7.0 ; python_version >= "3.11" and python_version < "4.0" -pyparsing==3.1.1 ; python_version >= "3.11" and python_version < "4.0" -python-dateutil==2.8.2 ; python_version >= "3.11" and python_version < "4.0" -qdldl==0.1.7.post0 ; python_version >= "3.11" and python_version < "4.0" -scipy==1.11.4 ; python_version >= "3.11" and python_version < "4.0" -scs==3.2.4.post1 ; python_version >= "3.11" and python_version < "4.0" -setuptools-scm==8.0.4 ; python_version >= "3.11" and python_version < "4.0" -setuptools==69.0.3 ; python_version >= "3.11" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.11" and python_version < "4.0" -tqdm==4.66.1 ; python_version >= "3.11" and python_version < "4.0" -trx-python==0.2.9 ; python_version >= "3.11" and python_version < "4.0" -typing-extensions==4.9.0 ; python_version >= "3.11" and python_version < "4.0" +deepdiff==8.1.1 ; python_version >= "3.11" and python_version < "4.0" +dill==0.3.9 ; python_version >= "3.11" and python_version < "4.0" +dipy==1.10.0 ; python_version >= "3.11" and python_version < "4.0" +fonttools==4.55.6 ; python_version >= "3.11" and python_version < "4.0" +h5py==3.12.1 ; python_version >= "3.11" and python_version < "4.0" +importlib-resources==6.5.2 ; python_version >= "3.11" and python_version < "3.12" +joblib==1.4.2 ; python_version >= "3.11" and python_version < "4.0" +kiwisolver==1.4.8 ; python_version >= "3.11" and python_version < "4.0" +matplotlib==3.10.0 ; python_version >= "3.11" and python_version < "4.0" +multiprocess==0.70.17 ; python_version >= "3.11" and python_version < "4.0" +nibabel==5.3.2 ; python_version >= "3.11" and python_version < "4.0" +numpy==1.26.4 ; python_version >= "3.11" and python_version < "4.0" +orderly-set==5.2.3 ; python_version >= "3.11" and python_version < "4.0" +osqp==0.6.7.post3 ; python_version >= "3.11" and python_version < "4.0" +packaging==24.2 ; python_version >= "3.11" and python_version < "4.0" +pillow==11.1.0 ; python_version >= "3.11" and python_version < "4.0" +pydantic-core==2.27.2 ; python_version >= "3.11" and python_version < "4.0" +pydantic==2.10.6 ; python_version >= "3.11" and python_version < "4.0" +pyparsing==3.2.1 ; python_version >= "3.11" and python_version < "4.0" +python-dateutil==2.9.0.post0 ; python_version >= "3.11" and python_version < "4.0" +qdldl==0.1.7.post5 ; python_version >= "3.11" and python_version < "4.0" +scipy==1.15.1 ; python_version >= "3.11" and python_version < "4.0" +scs==3.2.7.post2 ; python_version >= "3.11" and python_version < "4.0" +setuptools-scm==8.1.0 ; python_version >= "3.11" and python_version < "4.0" +setuptools==75.8.0 ; python_version >= "3.11" and python_version < "4.0" +six==1.17.0 ; python_version >= "3.11" and python_version < "4.0" +tqdm==4.67.1 ; python_version >= "3.11" and python_version < "4.0" +trx-python==0.3 ; python_version >= "3.11" and python_version < "4.0" +typing-extensions==4.12.2 ; python_version >= "3.11" and python_version < "4.0" diff --git a/tests/conftest.py b/tests/conftest.py index c8f5009..c14719b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,6 +27,6 @@ def load_data(type: str = "hifi") -> dict: "no_json": os.path.join(data_path, "hifi_splenium_4vox_no_json.nii"), "no_bval": os.path.join(data_path, "hifi_splenium_4vox_no_bval.nii"), "no_bvec": os.path.join(data_path, "hifi_splenium_4vox_no_bvec.nii"), - "no_sidecar": os.path.join(data_path, "hifi_splenium_4vox_no_sidecar.nii") + "no_sidecar": os.path.join(data_path, "hifi_splenium_4vox_no_sidecar.nii"), } return data diff --git a/tests/test_fitting_dwipy.py b/tests/test_fitting_dwipy.py index 18dbba5..0db2cbb 100644 --- a/tests/test_fitting_dwipy.py +++ b/tests/test_fitting_dwipy.py @@ -1,5 +1,4 @@ import os.path as op -import nibabel as nib import pytest import numpy as np from conftest import load_data @@ -13,6 +12,7 @@ PATH_BVAL = DATA["bval"] PATH_MASK = DATA["mask"] + def is_all_none(array): """Check if all elements in an array are None""" return not np.all(np.vectorize(lambda x: x is None)(array)) @@ -153,6 +153,7 @@ def test_idx_fbi(): assert len(idx) == 337 assert sum(idx) == 256 + def test_dwi_n_dirs(): """Tests whether function returns correct number of directions""" dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) @@ -243,20 +244,22 @@ def test_dwi_radial_sampling(): def test_dwi_constraints_invalid(): dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) with pytest.raises(ValueError) as exc: - val = dwi.createConstraints([1,2,3]) + val = dwi.createConstraints([1, 2, 3]) assert "Invalid contraints" in str(exc.value) @pytest.mark.parametrize( "constraints", - ([0, 0, 0], - [1, 1, 1], - [0, 1, 0], - [1, 0, 1], - [0, 0, 1], - [1, 1, 0], - [0, 1, 1], - [1, 0, 0]) + ( + [0, 0, 0], + [1, 1, 1], + [0, 1, 0], + [1, 0, 1], + [0, 0, 1], + [1, 1, 0], + [0, 1, 1], + [1, 0, 0], + ), ) def test_dwi_constraints_success(constraints): dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) @@ -374,7 +377,20 @@ def test_dwi_fbi_without_fbwm(capsys): """Tests whether FBI fitting works normally""" dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) dwi.fit([0, 1, 0]) - zeta, faa, sph, sph_mrtrix, min_awf, Da, De_mean, De_ax, De_rad, De_fa, min_cost, min_cost_fn = dwi.fbi(fbwm=False) + ( + zeta, + faa, + sph, + sph_mrtrix, + min_awf, + Da, + De_mean, + De_ax, + De_rad, + De_fa, + min_cost, + min_cost_fn, + ) = dwi.fbi(fbwm=False) captured = capsys.readouterr() assert "Constrained Tensor Fit" in captured.err diff --git a/tests/test_models.py b/tests/test_models.py index 0f6c233..780417f 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,4 +1,8 @@ -from pydesigner.system.models import modelmrtrix, input_path_validator, output_path_validator +from pydesigner.system.models import ( + modelmrtrix, + input_path_validator, + output_path_validator, +) from pydesigner.system.errors import FileExtensionError from pydantic import ValidationError import pytest @@ -7,6 +11,7 @@ DATA = load_data(type="hifi") PATH_DWI = DATA["nifti"] + def test_modelmrtrix_input_invalid(): with pytest.raises(TypeError) as exc: model = modelmrtrix(input=50) @@ -88,7 +93,10 @@ def test_input_validator_ctype_invalid(): def test_input_validator_ctype_check_fail(): with pytest.raises(FileExtensionError) as exc: path = input_path_validator(path=PATH_DWI, ctype=".tar") - assert f"Input file ({PATH_DWI}) does not posses the required .tar extension" in str(exc.value) + assert ( + f"Input file ({PATH_DWI}) does not posses the required .tar extension" + in str(exc.value) + ) def test_input_validator_success(): @@ -105,7 +113,10 @@ def test_output_validator_ctype_invalid(): def test_output_validator_ctype_check_fail(): with pytest.raises(FileExtensionError) as exc: path = output_path_validator(path=PATH_DWI, ctype=".tar") - assert f"Output file ({PATH_DWI}) does not posses the required .tar extension" in str(exc.value) + assert ( + f"Output file ({PATH_DWI}) does not posses the required .tar extension" + in str(exc.value) + ) def test_output_validator_success(tmp_path): diff --git a/tests/test_preprocessing_mrinfoutil.py b/tests/test_preprocessing_mrinfoutil.py index 01762a4..6368ff5 100644 --- a/tests/test_preprocessing_mrinfoutil.py +++ b/tests/test_preprocessing_mrinfoutil.py @@ -127,9 +127,25 @@ def test_multiplier_dtype(): def test_transform(): """Test whether function returns correct transform""" result = ( - ["0.994345310289832", "2.73896740248844", "08", "-0.106195121171422", "-7.16012287139893"], - ["-0.0163522207646128", "0.988073569252652", "-0.153111814252808", "-15.8305568695068"], - ["0.104928588957842", "0.153982537140822", "0.982486319790561", "-10.7536220550537"], + [ + "0.994345310289832", + "2.73896740248844", + "08", + "-0.106195121171422", + "-7.16012287139893", + ], + [ + "-0.0163522207646128", + "0.988073569252652", + "-0.153111814252808", + "-15.8305568695068", + ], + [ + "0.104928588957842", + "0.153982537140822", + "0.982486319790561", + "-10.7536220550537", + ], ["0", "0", "0", "1"], ) assert mrinfoutil.transform(PATH_DWI) == result @@ -149,14 +165,14 @@ def test_commandhistory_invalid(): def test_commandhistory_valid(): """Test normal function of commandhistory""" result = [ - 'variable', - 'mrcat -axis 3 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi0.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi1.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi2.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif', - 'dwidenoise -noise /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/noisemap.nii -extent 5,5,5 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/1_dwi_denoised.mif', - 'mrdegibbs /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/2_dwi_degibbs.mif', - '/usr/local/mrtrix3/bin/dwifslpreproc -se_epi /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/B0_EPI.mif -eddy_options --repol --data_is_shelled -rpe_header -eddyqc_all /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/metrics_qc/eddy /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/3_dwi_undistorted.mif', - 'mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/4_dwi_smoothed.mif', - 'mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif', - 'mrconvert -json_import /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.json -fslgrad /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.bvec /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.bval /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.nii /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.mif', + "variable", + "mrcat -axis 3 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi0.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi1.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwi2.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif", + "dwidenoise -noise /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/noisemap.nii -extent 5,5,5 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/1_dwi_denoised.mif", + "mrdegibbs /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/2_dwi_degibbs.mif", + "/usr/local/mrtrix3/bin/dwifslpreproc -se_epi /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/B0_EPI.mif -eddy_options --repol --data_is_shelled -rpe_header -eddyqc_all /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/metrics_qc/eddy /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/working.mif /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/3_dwi_undistorted.mif", + "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwism.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/4_dwi_smoothed.mif", + "mrconvert -force -quiet -fslgrad /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bvec /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.bval -json_import /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.json -strides 1,2,3,4 /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/dwirc.nii /media/sid/Secondary/Datasets/IAM_HiFI/out/pydesigner/5_dwi_rician.mif", + "mrconvert -json_import /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.json -fslgrad /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.bvec /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.bval /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.nii /Users/siddhiman/Repos/PyDesigner/tests/data/hifi_splenium_4vox.mif", ] assert mrinfoutil.commandhistory(PATH_MIF) == result diff --git a/tests/test_preprocessing_mrpreproc.py b/tests/test_preprocessing_mrpreproc.py index b2ae83e..895be3d 100644 --- a/tests/test_preprocessing_mrpreproc.py +++ b/tests/test_preprocessing_mrpreproc.py @@ -6,7 +6,7 @@ from conftest import load_data from pydesigner.preprocessing import mrpreproc, mrinfoutil -from pydesigner.system.errors import FileExtensionError, MRTrixError +from pydesigner.system.errors import MRTrixError DATA = load_data(type="hifi") PATH_DWI = DATA["nifti"] @@ -18,18 +18,17 @@ PATH_JSON = DATA["json"] PATH_MIF = DATA["mif"] + def test_miftonii_output_failure(tmp_path): """Test whether function `miftonii` fails when return code is non-zero""" output_nii = str(tmp_path / "output.nii") output_bval = str(tmp_path / "output.bval") output_bvec = str(tmp_path / "output.bvec") with patch("subprocess.run") as mock_subprocess: - mock_subprocess.return_value = MagicMock( - returncode=1, stderr="stderr" - ) + mock_subprocess.return_value = MagicMock(returncode=1, stderr="stderr") with pytest.raises(MRTrixError) as exc: mrpreproc.miftonii(PATH_MIF, output_nii) - assert f"Conversion from .mif to .nii failed" in str(exc.value) + assert "Conversion from .mif to .nii failed" in str(exc.value) assert "stderr" in str(exc.value) @@ -42,14 +41,16 @@ def test_miftonii_output_failure(tmp_path): (None, False, None), (None, None, True), (None, None, False), - ] + ], ) def test_miftonii_output_success(tmp_path, nthreads, force, verbose): """Test whether function `miftonii` generates a valid NIfTI file""" output_nii = str(tmp_path / "output.nii") output_bval = str(tmp_path / "output.bval") output_bvec = str(tmp_path / "output.bvec") - mrpreproc.miftonii(PATH_MIF, output_nii, nthreads=nthreads, force=force, verbose=verbose) + mrpreproc.miftonii( + PATH_MIF, output_nii, nthreads=nthreads, force=force, verbose=verbose + ) assert os.path.exists(output_nii) assert os.path.exists(output_bval) assert os.path.exists(output_bvec) @@ -63,36 +64,43 @@ def test_niitomif_failure_bval(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" output_mif = str(tmp_path / "output.mif") with pytest.raises(OSError) as exc: - mrpreproc.niitomif(PATH_DWI_NO_BVAL, output_mif) - assert f"Input file path ({os.path.splitext(PATH_DWI_NO_BVAL)[0]}.bval) does not exist" in str(exc.value) + mrpreproc.niitomif(PATH_DWI_NO_BVAL, output_mif) + assert ( + f"Input file path ({os.path.splitext(PATH_DWI_NO_BVAL)[0]}.bval) does not exist" + in str(exc.value) + ) def test_niitomif_failure_bvec(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" output_mif = str(tmp_path / "output.mif") with pytest.raises(OSError) as exc: - mrpreproc.niitomif(PATH_DWI_NO_BVEC, output_mif) - assert f"Input file path ({os.path.splitext(PATH_DWI_NO_BVEC)[0]}.bvec) does not exist" in str(exc.value) + mrpreproc.niitomif(PATH_DWI_NO_BVEC, output_mif) + assert ( + f"Input file path ({os.path.splitext(PATH_DWI_NO_BVEC)[0]}.bvec) does not exist" + in str(exc.value) + ) def test_niitomif_failure_json(tmp_path): """Test whether function `niitomif` fails when there is no sidecar file""" output_mif = str(tmp_path / "output.mif") with pytest.raises(OSError) as exc: - mrpreproc.niitomif(PATH_DWI_NO_JSON, output_mif) - assert f"Input file path ({os.path.splitext(PATH_DWI_NO_JSON)[0]}.json) does not exist" in str(exc.value) + mrpreproc.niitomif(PATH_DWI_NO_JSON, output_mif) + assert ( + f"Input file path ({os.path.splitext(PATH_DWI_NO_JSON)[0]}.json) does not exist" + in str(exc.value) + ) def test_niitomif_output_failure(tmp_path): """Test whether function `niitomif` fails when return code is non-zero""" output_mif = str(tmp_path / "output.mif") with patch("subprocess.run") as mock_subprocess: - mock_subprocess.return_value = MagicMock( - returncode=1, stderr="stderr" - ) + mock_subprocess.return_value = MagicMock(returncode=1, stderr="stderr") with pytest.raises(MRTrixError) as exc: mrpreproc.niitomif(PATH_DWI, output_mif) - assert f"Conversion from .nii to .mif failed" in str(exc.value) + assert "Conversion from .nii to .mif failed" in str(exc.value) assert "stderr" in str(exc.value) @@ -105,12 +113,14 @@ def test_niitomif_output_failure(tmp_path): (None, False, None), (None, None, True), (None, None, False), - ] + ], ) def test_niitomif_success(tmp_path, nthreads, force, verbose): """Test whether function `niitomif` successfully converts a valid NifTI file to MIF""" output_mif = str(tmp_path / "output.mif") - mrpreproc.niitomif(PATH_DWI, output_mif, nthreads=nthreads, force=force, verbose=verbose) + mrpreproc.niitomif( + PATH_DWI, output_mif, nthreads=nthreads, force=force, verbose=verbose + ) assert os.path.exists(output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) @@ -121,12 +131,10 @@ def test_stride_match_output_failure(tmp_path): """Test whether function `stride_match` fails when return code is non-zero""" output_nii = str(tmp_path / "output.nii") with patch("subprocess.run") as mock_subprocess: - mock_subprocess.return_value = MagicMock( - returncode=1, stderr="stderr" - ) + mock_subprocess.return_value = MagicMock(returncode=1, stderr="stderr") with pytest.raises(MRTrixError) as exc: mrpreproc.stride_match(PATH_DWI, PATH_DWI_NO_BVAL, output_nii) - assert f"Stride matching failed" in str(exc.value) + assert "Stride matching failed" in str(exc.value) assert "stderr" in str(exc.value) @@ -139,12 +147,19 @@ def test_stride_match_output_failure(tmp_path): (None, False, None), (None, None, True), (None, None, False), - ] + ], ) def test_stride_match_output_success(tmp_path, nthreads, force, verbose): """Test whether function `stride_match` fails when return code is non-zero""" output_mif = str(tmp_path / "output.mif") - mrpreproc.stride_match(PATH_DWI, PATH_DWI_NO_BVAL, output_mif, nthreads=nthreads, force=force, verbose=verbose) + mrpreproc.stride_match( + PATH_DWI, + PATH_DWI_NO_BVAL, + output_mif, + nthreads=nthreads, + force=force, + verbose=verbose, + ) assert os.path.exists(output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) @@ -157,19 +172,19 @@ def test_denoise_noisemap_invalid(tmp_path): output_mif = str(tmp_path / "output.mif") with pytest.raises(TypeError) as exc: mrpreproc.denoise(PATH_MIF, output_mif, noisemap="invalid") - assert "Please specify whether noisemap generation is True or False" in str(exc.value) + assert "Please specify whether noisemap generation is True or False" in str( + exc.value + ) def test_denoise_output_failure(tmp_path): """Test whether function `stride_match` fails when return code is non-zero""" output_mif = str(tmp_path / "output.mif") with patch("subprocess.run") as mock_subprocess: - mock_subprocess.return_value = MagicMock( - returncode=1, stderr="stderr" - ) + mock_subprocess.return_value = MagicMock(returncode=1, stderr="stderr") with pytest.raises(MRTrixError) as exc: mrpreproc.denoise(PATH_MIF, output_mif, noisemap=True, extent="1,1,1") - assert f"Dwidenoise failed" in str(exc.value) + assert "Dwidenoise failed" in str(exc.value) assert "stderr" in str(exc.value) @@ -182,13 +197,21 @@ def test_denoise_output_failure(tmp_path): (None, False, None), (None, None, True), (None, None, False), - ] + ], ) def test_denoise_output_success(tmp_path, nthreads, force, verbose): """Test whether function `denoise` successfully denoises a DWI dataset""" output_mif = str(tmp_path / "output.mif") noisemap_nii = str(tmp_path / "noisemap.nii") - mrpreproc.denoise(PATH_MIF, output_mif, noisemap=True, extent="1,1,1", nthreads=nthreads, force=force, verbose=verbose) + mrpreproc.denoise( + PATH_MIF, + output_mif, + noisemap=True, + extent="1,1,1", + nthreads=nthreads, + force=force, + verbose=verbose, + ) assert os.path.exists(output_mif) assert os.path.exists(noisemap_nii) assert mrinfoutil.format(output_mif) == "MRtrix" @@ -200,14 +223,13 @@ def test_degibbs_output_failure(tmp_path): """Test whether function `degibbs` fails when return code is non-zero""" output_mif = str(tmp_path / "output.mif") with patch("subprocess.run") as mock_subprocess: - mock_subprocess.return_value = MagicMock( - returncode=1, stderr="stderr" - ) + mock_subprocess.return_value = MagicMock(returncode=1, stderr="stderr") with pytest.raises(MRTrixError) as exc: mrpreproc.degibbs(PATH_MIF, output_mif) - assert f"Mrdegibbs failed" in str(exc.value) + assert "Mrdegibbs failed" in str(exc.value) assert "stderr" in str(exc.value) + @pytest.mark.parametrize( "nthreads, force, verbose", [ @@ -217,12 +239,14 @@ def test_degibbs_output_failure(tmp_path): (None, False, None), (None, None, True), (None, None, False), - ] + ], ) def test_degibbs_output_success(tmp_path, nthreads, force, verbose): """Test whether function `degibbs` fails when return code is non-zero""" output_mif = str(tmp_path / "output.mif") - mrpreproc.degibbs(PATH_MIF, output_mif, nthreads=nthreads, force=force, verbose=verbose) + mrpreproc.degibbs( + PATH_MIF, output_mif, nthreads=nthreads, force=force, verbose=verbose + ) assert os.path.exists(output_mif) assert mrinfoutil.format(output_mif) == "MRtrix" mrinfoutil.size(output_mif) == (2, 2, 2, 337) @@ -234,12 +258,10 @@ def test_undistort_output_failure_conversion(tmp_path): """Test whether function `undistort` fails at gradient conversion when return code is non-zero""" output_mif = str(tmp_path / "output.mif") with patch("subprocess.run") as mock_subprocess: - mock_subprocess.return_value = MagicMock( - returncode=1, stderr="stderr" - ) + mock_subprocess.return_value = MagicMock(returncode=1, stderr="stderr") with pytest.raises(MRTrixError) as exc: mrpreproc.undistort(PATH_MIF, output_mif) - assert f"Extraction of FSL BVEC and BVAL gradients failed" in str(exc.value) + assert "Extraction of FSL BVEC and BVAL gradients failed" in str(exc.value) assert "stderr" in str(exc.value) @@ -248,6 +270,7 @@ def test_undistort_output_failure_all(tmp_path): output_mif = str(tmp_path / "output.mif") call_count = 0 original_run = subprocess.run + def subprocess_side_effect(*args, **kwargs): nonlocal call_count call_count += 1 @@ -256,12 +279,14 @@ def subprocess_side_effect(*args, **kwargs): else: with patch("subprocess.run", original_run): return original_run(*args, **kwargs) + with patch("subprocess.run", side_effect=subprocess_side_effect) as mock_subprocess: with pytest.raises(MRTrixError) as exc: mrpreproc.undistort(PATH_MIF, output_mif, epib0=0) - assert f"Dwifslpreproc failed" in str(exc.value) + assert "Dwifslpreproc failed" in str(exc.value) assert "stderr" in str(exc.value) + # def test_undistort_output_success(tmp_path): # """Test whether function `undistort` successfully undistorts a DWI dataset""" # output_mif = str(tmp_path / "output.mif") @@ -273,7 +298,6 @@ def subprocess_side_effect(*args, **kwargs): # assert "dwifslpreproc" in mrinfoutil.commandhistory(output_mif)[-1] - # def test_brainmask_output_failure(tmp_path): # """Test whether function `undistort` fails when return code is non-zero""" # output_nii = str(tmp_path / "output.nii") From 399aefef5847be3227a3a3f87b9001edb5d1ba36 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 12 Apr 2025 02:33:24 -0400 Subject: [PATCH 65/78] Change max b-vals to float for #303 --- pydesigner/fitting/dwipy.py | 16 ++++++++-------- tests/test_fitting_dwipy.py | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pydesigner/fitting/dwipy.py b/pydesigner/fitting/dwipy.py index cee92e3..21c6b7b 100644 --- a/pydesigner/fitting/dwipy.py +++ b/pydesigner/fitting/dwipy.py @@ -173,7 +173,7 @@ def getBvecs(self) -> np.ndarray: """ return self.grad[:, 0:3] - def maxBval(self) -> int: + def maxBval(self) -> float: """Returns the maximum b-value in a dataset to determine between DTI and DKI, requires no input parameters. @@ -187,9 +187,9 @@ def maxBval(self) -> int: a = dwi.maxBval(), where dwi is the DWI class object. """ - return int(max(np.unique(self.grad[:, 3]))) + return max(np.unique(self.grad[:, 3])) - def maxDTIBval(self) -> int: + def maxDTIBval(self) -> float: """Returns the maximum DTI b-value in a dataset. Returns @@ -203,9 +203,9 @@ def maxDTIBval(self) -> int: """ exclude_idx = self.grad[:, 3] <= th.__maxdtibval__ - return int(max(np.unique(self.grad[exclude_idx, 3]))) + return max(np.unique(self.grad[exclude_idx, 3])) - def maxDKIBval(self) -> int: + def maxDKIBval(self) -> float: """Returns the maximum DKI b-value in a dataset. Returns @@ -219,9 +219,9 @@ def maxDKIBval(self) -> int: """ exclude_idx = self.grad[:, 3] <= th.__maxdkibval__ - return int(max(np.unique(self.grad[exclude_idx, 3]))) + return max(np.unique(self.grad[exclude_idx, 3])) - def maxFBIBval(self) -> int: + def maxFBIBval(self) -> float: """Returns the maximum FBI b-value in a dataset. Returns @@ -235,7 +235,7 @@ def maxFBIBval(self) -> int: """ exclude_idx = self.grad[:, 3] <= th.__maxfbibval__ - return int(max(np.unique(self.grad[exclude_idx, 3]))) + return max(np.unique(self.grad[exclude_idx, 3])) def idxb0(self) -> np.ndarray[bool]: """Returns the index of all B-zeros according to bvals diff --git a/tests/test_fitting_dwipy.py b/tests/test_fitting_dwipy.py index 0db2cbb..c1b1d29 100644 --- a/tests/test_fitting_dwipy.py +++ b/tests/test_fitting_dwipy.py @@ -90,7 +90,7 @@ def test_dwi_max_bval(): """Tests whether function returns correct max bval""" dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) val = dwi.maxBval() - assert isinstance(val, int) + assert isinstance(val, float) assert val == 8 @@ -98,7 +98,7 @@ def test_dwi_max_dti_bval(): """Tests whether function returns correct max DTI bval""" dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) val = dwi.maxDTIBval() - assert isinstance(val, int) + assert isinstance(val, float) assert val == 1 @@ -106,7 +106,7 @@ def test_dwi_max_dki_bval(): """Tests whether function returns correct max DKI bval""" dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) val = dwi.maxDKIBval() - assert isinstance(val, int) + assert isinstance(val, float) assert val == 2 @@ -114,7 +114,7 @@ def test_max_fbi_bval(): """Tests whether function returns correct max FBI bval""" dwi = DWI(PATH_DWI, PATH_BVEC, PATH_BVAL, PATH_MASK) val = dwi.maxFBIBval() - assert isinstance(val, int) + assert isinstance(val, float) assert val == 8 From 2bc32ab3c79b473b88214f4eb6afd606f9f127fe Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 12 Apr 2025 02:35:00 -0400 Subject: [PATCH 66/78] Bump minimum Python requirement to 3.12 and update deps --- poetry.lock | 102 ++++++++++++++++++++++++++++++------------------- pyproject.toml | 2 +- 2 files changed, 63 insertions(+), 41 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8914bd7..e336bc7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,6 +6,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -17,6 +18,7 @@ version = "0.9.0" description = "Clarabel Conic Interior Point Solver for Rust / Python" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "clarabel-0.9.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:702cc4666c0ccf893c936f9f1f55cbb3233ae2d5fa05f67b370ac3e7ec50f222"}, {file = "clarabel-0.9.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8ea616757b460153ead375b3dd3ce763d46fc3717248077bbfa7b2c844b1775f"}, @@ -38,10 +40,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} [[package]] name = "contourpy" @@ -49,6 +53,7 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -122,6 +127,7 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -188,7 +194,7 @@ files = [ ] [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cvxpy" @@ -196,6 +202,7 @@ version = "1.6.0" description = "A domain-specific language for modeling convex optimization problems in Python." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "cvxpy-1.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa557789ff5d9ecdf88dee15c47dbd2f79fa47aa4d71e939126ad654e43484"}, {file = "cvxpy-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aaff709f5a12a5984b33303a0db5c129aeeba39c98001b630e6943d0cd5a53ed"}, @@ -261,6 +268,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -276,6 +284,7 @@ version = "8.1.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "deepdiff-8.1.1-py3-none-any.whl", hash = "sha256:b0231fa3afb0f7184e82535f2b4a36636442ed21e94a0cf3aaa7982157e7ebca"}, {file = "deepdiff-8.1.1.tar.gz", hash = "sha256:dd7bc7d5c8b51b5b90f01b0e2fe23c801fd8b4c6a7ee7e31c5a3c3663fcc7ceb"}, @@ -294,6 +303,7 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -309,6 +319,7 @@ version = "1.10.0" description = "Diffusion MRI Imaging in Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "dipy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4c9ba9204f85fcd75277cbdca3dab3d7ed299d5e4c9a5b4d1eda0f76395c426"}, {file = "dipy-1.10.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:85abe515c0baf6f1feb8d6452e4fe28915bc5d909dfb8625b3669fc0b494d816"}, @@ -345,7 +356,7 @@ trx-python = ">=0.2.9" [package.extras] all = ["dipy[dev,doc,extra,ml,style,test,viz]"] dev = ["Cython (>=0.29.35)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.22.4)", "packaging (>=21)", "setuptools (>=69.5,<70.0)", "spin (>=0.5)", "wheel"] -doc = ["Jinja2", "grg-sphinx-theme (>=0.4.0)", "numpydoc", "sphinx (>=7.2.6)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli", "tomli (>=2.0.1)"] +doc = ["Jinja2", "grg-sphinx-theme (>=0.4.0)", "numpydoc", "sphinx (>=7.2.6)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli (>=2.0.1)", "tomli ; python_version < \"3.11\""] extra = ["boto3", "cvxpy", "dipy[ml,viz]", "scikit-image"] ml = ["pandas", "scikit_learn", "statsmodels (>=0.14.0)", "tables", "tensorflow", "torch"] style = ["pre-commit", "ruff"] @@ -358,6 +369,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -372,6 +384,7 @@ version = "4.55.6" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:57d55fc965e5dd20c8a60d880e0f43bafb506be87af0b650bdc42591e41e0d0d"}, {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:127999618afe3a2490fad54bab0650c5fbeab1f8109bdc0205f6ad34306deb8b"}, @@ -426,18 +439,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "pycairo", "scipy"] +interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr"] +type1 = ["xattr ; sys_platform == \"darwin\""] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0)"] -woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] name = "h5py" @@ -445,6 +458,7 @@ version = "3.12.1" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "h5py-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda"}, {file = "h5py-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3"}, @@ -477,31 +491,13 @@ files = [ [package.dependencies] numpy = ">=1.19.3" -[[package]] -name = "importlib-resources" -version = "6.5.2" -description = "Read resources from Python packages" -optional = false -python-versions = ">=3.9" -files = [ - {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, - {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, -] - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] -type = ["pytest-mypy"] - [[package]] name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -513,6 +509,7 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -524,6 +521,7 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -613,6 +611,7 @@ version = "3.10.0" description = "Python plotting package" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, @@ -670,6 +669,7 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -698,13 +698,13 @@ version = "5.3.2" description = "Access a multitude of neuroimaging data formats" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "nibabel-5.3.2-py3-none-any.whl", hash = "sha256:52970a5a8a53b1b55249cba4d9bcfaa8cc57e3e5af35a29d7352237e8680a6f8"}, {file = "nibabel-5.3.2.tar.gz", hash = "sha256:0bdca6503b1c784b446c745a4542367de7756cfba0d72143b91f9ffb78be569b"}, ] [package.dependencies] -importlib-resources = {version = ">=5.12", markers = "python_version < \"3.12\""} numpy = ">=1.22" packaging = ">=20" typing-extensions = {version = ">=4.6", markers = "python_version < \"3.13\""} @@ -714,7 +714,7 @@ all = ["h5py", "pillow", "pydicom (>=2.3)", "pyzstd (>=0.14.3)", "scipy"] dev = ["tox"] dicom = ["pydicom (>=2.3)"] dicomfs = ["pillow", "pydicom (>=2.3)"] -doc = ["matplotlib (>=3.5)", "numpydoc", "sphinx", "texext", "tomli"] +doc = ["matplotlib (>=3.5)", "numpydoc", "sphinx", "texext", "tomli ; python_version < \"3.11\""] doctest = ["tox"] minc2 = ["h5py"] spm = ["scipy"] @@ -729,6 +729,7 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -774,6 +775,7 @@ version = "5.2.3" description = "Orderly set" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "orderly_set-5.2.3-py3-none-any.whl", hash = "sha256:d357cedcf67f4ebff0d4cbd5b0997e98eeb65dd24fdf5c990a501ae9e82c7d34"}, {file = "orderly_set-5.2.3.tar.gz", hash = "sha256:571ed97c5a5fca7ddeb6b2d26c19aca896b0ed91f334d9c109edd2f265fb3017"}, @@ -785,6 +787,7 @@ version = "0.6.7.post3" description = "OSQP: The Operator Splitting QP Solver" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "osqp-0.6.7.post3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f751ca1332b480753cfe3c08bf14ca66259bf69679b572e1f8095ad3e26b201d"}, {file = "osqp-0.6.7.post3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1b30df65f2d938452e3bd2ca11388b5b16ec7406daedfc4b9dce3747c282e44"}, @@ -841,6 +844,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -852,6 +856,7 @@ version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, @@ -931,7 +936,7 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -940,6 +945,7 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -955,6 +961,7 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -967,7 +974,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] [[package]] name = "pydantic-core" @@ -975,6 +982,7 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -1087,6 +1095,7 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -1101,6 +1110,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -1121,6 +1131,7 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -1139,6 +1150,7 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -1159,6 +1171,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1173,6 +1186,7 @@ version = "0.1.7.post5" description = "QDLDL, a free LDL factorization routine." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "qdldl-0.1.7.post5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:882658853edd24a7d16912af29e77320e061b150b4ed7cf94fd01907f2e925b4"}, {file = "qdldl-0.1.7.post5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e30a80d71ab5889a1e169304b12bc3ab69210775f6428153873584ff8dfb50e5"}, @@ -1225,6 +1239,7 @@ version = "1.15.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, @@ -1274,7 +1289,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scs" @@ -1282,6 +1297,7 @@ version = "3.2.7.post2" description = "Splitting conic solver" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "scs-3.2.7.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7271ff566ac9df929c8cf7d1b024b89c3882b541c21a7a6d9aa94480822bccb"}, {file = "scs-3.2.7.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb2997f53ef3426934599517c6e0e77f4f05cc23c3aa2380fd176c7fd22bc0c8"}, @@ -1335,19 +1351,20 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] +core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "setuptools-scm" @@ -1355,6 +1372,7 @@ version = "8.1.0" description = "the blessed package to manage your versions by scm tags" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3"}, {file = "setuptools_scm-8.1.0.tar.gz", hash = "sha256:42dea1b65771cba93b7a515d65a65d8246e560768a66b9106a592c8e7f26c8a7"}, @@ -1367,7 +1385,7 @@ setuptools = "*" [package.extras] docs = ["entangled-cli (>=2.0,<3.0)", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] rich = ["rich"] -test = ["build", "pytest", "rich", "typing-extensions", "wheel"] +test = ["build", "pytest", "rich", "typing-extensions ; python_version < \"3.11\"", "wheel"] [[package]] name = "six" @@ -1375,6 +1393,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -1386,6 +1405,7 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -1407,6 +1427,7 @@ version = "0.3" description = "Experiments with new file format for tractography" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "trx_python-0.3-py3-none-any.whl", hash = "sha256:b00efb1024022a7835cc8b36e024a4ea575f19ce3fae81deb50b709fc8abcb49"}, {file = "trx_python-0.3.tar.gz", hash = "sha256:193e3282eaf03610c7e1b848aec04ddb9498fad3a7b684b30ca358e06751fbfd"}, @@ -1429,12 +1450,13 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [metadata] -lock-version = "2.0" -python-versions = ">=3.11, <4.0" -content-hash = "0bb79f207fd85920ddda3bf857e0c17fb5f12a7fbd3ec29020f960d693cf4a35" +lock-version = "2.1" +python-versions = ">=3.12, <4.0" +content-hash = "5ab05dad4d959bc77cd144636991501995ee9f7e6ef1a46a8b55c81633a509e7" diff --git a/pyproject.toml b/pyproject.toml index c8f994c..c153e4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,7 @@ classifiers = [ ] [tool.poetry.dependencies] -python = ">=3.11, <4.0" +python = ">=3.12, <4.0" numpy = ">=1.20.0, <1.30.0" scipy = ">=1.5.0, <2.0.0" joblib = ">=1.2.0, <2.0.0" From f2dc6d98ca93be4851a59e03f93832b13bf1faca Mon Sep 17 00:00:00 2001 From: TheJaeger <13654344+TheJaeger@users.noreply.github.com> Date: Sat, 12 Apr 2025 06:35:34 +0000 Subject: [PATCH 67/78] Pre-commit autofix --- poetry.lock | 78 ++++++++++---------------------------------- requirements-dev.txt | 18 +++++----- requirements.txt | 69 +++++++++++++++++++-------------------- 3 files changed, 61 insertions(+), 104 deletions(-) diff --git a/poetry.lock b/poetry.lock index e336bc7..c016a46 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.0 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,7 +6,6 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -18,7 +17,6 @@ version = "0.9.0" description = "Clarabel Conic Interior Point Solver for Rust / Python" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "clarabel-0.9.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:702cc4666c0ccf893c936f9f1f55cbb3233ae2d5fa05f67b370ac3e7ec50f222"}, {file = "clarabel-0.9.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:8ea616757b460153ead375b3dd3ce763d46fc3717248077bbfa7b2c844b1775f"}, @@ -40,12 +38,10 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "platform_system == \"Windows\"", dev = "sys_platform == \"win32\""} [[package]] name = "contourpy" @@ -53,7 +49,6 @@ version = "1.3.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab"}, {file = "contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124"}, @@ -127,7 +122,6 @@ version = "7.6.10" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78"}, {file = "coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c"}, @@ -194,7 +188,7 @@ files = [ ] [package.extras] -toml = ["tomli ; python_full_version <= \"3.11.0a6\""] +toml = ["tomli"] [[package]] name = "cvxpy" @@ -202,7 +196,6 @@ version = "1.6.0" description = "A domain-specific language for modeling convex optimization problems in Python." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "cvxpy-1.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:45fa557789ff5d9ecdf88dee15c47dbd2f79fa47aa4d71e939126ad654e43484"}, {file = "cvxpy-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:aaff709f5a12a5984b33303a0db5c129aeeba39c98001b630e6943d0cd5a53ed"}, @@ -268,7 +261,6 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -284,7 +276,6 @@ version = "8.1.1" description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "deepdiff-8.1.1-py3-none-any.whl", hash = "sha256:b0231fa3afb0f7184e82535f2b4a36636442ed21e94a0cf3aaa7982157e7ebca"}, {file = "deepdiff-8.1.1.tar.gz", hash = "sha256:dd7bc7d5c8b51b5b90f01b0e2fe23c801fd8b4c6a7ee7e31c5a3c3663fcc7ceb"}, @@ -303,7 +294,6 @@ version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, @@ -319,7 +309,6 @@ version = "1.10.0" description = "Diffusion MRI Imaging in Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "dipy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4c9ba9204f85fcd75277cbdca3dab3d7ed299d5e4c9a5b4d1eda0f76395c426"}, {file = "dipy-1.10.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:85abe515c0baf6f1feb8d6452e4fe28915bc5d909dfb8625b3669fc0b494d816"}, @@ -356,7 +345,7 @@ trx-python = ">=0.2.9" [package.extras] all = ["dipy[dev,doc,extra,ml,style,test,viz]"] dev = ["Cython (>=0.29.35)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.22.4)", "packaging (>=21)", "setuptools (>=69.5,<70.0)", "spin (>=0.5)", "wheel"] -doc = ["Jinja2", "grg-sphinx-theme (>=0.4.0)", "numpydoc", "sphinx (>=7.2.6)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli (>=2.0.1)", "tomli ; python_version < \"3.11\""] +doc = ["Jinja2", "grg-sphinx-theme (>=0.4.0)", "numpydoc", "sphinx (>=7.2.6)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli", "tomli (>=2.0.1)"] extra = ["boto3", "cvxpy", "dipy[ml,viz]", "scikit-image"] ml = ["pandas", "scikit_learn", "statsmodels (>=0.14.0)", "tables", "tensorflow", "torch"] style = ["pre-commit", "ruff"] @@ -369,7 +358,6 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -384,7 +372,6 @@ version = "4.55.6" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:57d55fc965e5dd20c8a60d880e0f43bafb506be87af0b650bdc42591e41e0d0d"}, {file = "fonttools-4.55.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:127999618afe3a2490fad54bab0650c5fbeab1f8109bdc0205f6ad34306deb8b"}, @@ -439,18 +426,18 @@ files = [ ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] +interpolatable = ["munkres", "pycairo", "scipy"] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] -type1 = ["xattr ; sys_platform == \"darwin\""] +type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] -woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "h5py" @@ -458,7 +445,6 @@ version = "3.12.1" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "h5py-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f0f1a382cbf494679c07b4371f90c70391dedb027d517ac94fa2c05299dacda"}, {file = "h5py-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb65f619dfbdd15e662423e8d257780f9a66677eae5b4b3fc9dca70b5fd2d2a3"}, @@ -497,7 +483,6 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -509,7 +494,6 @@ version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, @@ -521,7 +505,6 @@ version = "1.4.8" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, @@ -611,7 +594,6 @@ version = "3.10.0" description = "Python plotting package" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "matplotlib-3.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6"}, {file = "matplotlib-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e"}, @@ -669,7 +651,6 @@ version = "0.70.17" description = "better multiprocessing and multithreading in Python" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ddb24e5bcdb64e90ec5543a1f05a39463068b6d3b804aa3f2a4e16ec28562d6"}, {file = "multiprocess-0.70.17-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d729f55198a3579f6879766a6d9b72b42d4b320c0dcb7844afb774d75b573c62"}, @@ -698,7 +679,6 @@ version = "5.3.2" description = "Access a multitude of neuroimaging data formats" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "nibabel-5.3.2-py3-none-any.whl", hash = "sha256:52970a5a8a53b1b55249cba4d9bcfaa8cc57e3e5af35a29d7352237e8680a6f8"}, {file = "nibabel-5.3.2.tar.gz", hash = "sha256:0bdca6503b1c784b446c745a4542367de7756cfba0d72143b91f9ffb78be569b"}, @@ -714,7 +694,7 @@ all = ["h5py", "pillow", "pydicom (>=2.3)", "pyzstd (>=0.14.3)", "scipy"] dev = ["tox"] dicom = ["pydicom (>=2.3)"] dicomfs = ["pillow", "pydicom (>=2.3)"] -doc = ["matplotlib (>=3.5)", "numpydoc", "sphinx", "texext", "tomli ; python_version < \"3.11\""] +doc = ["matplotlib (>=3.5)", "numpydoc", "sphinx", "texext", "tomli"] doctest = ["tox"] minc2 = ["h5py"] spm = ["scipy"] @@ -729,7 +709,6 @@ version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, @@ -775,7 +754,6 @@ version = "5.2.3" description = "Orderly set" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "orderly_set-5.2.3-py3-none-any.whl", hash = "sha256:d357cedcf67f4ebff0d4cbd5b0997e98eeb65dd24fdf5c990a501ae9e82c7d34"}, {file = "orderly_set-5.2.3.tar.gz", hash = "sha256:571ed97c5a5fca7ddeb6b2d26c19aca896b0ed91f334d9c109edd2f265fb3017"}, @@ -787,7 +765,6 @@ version = "0.6.7.post3" description = "OSQP: The Operator Splitting QP Solver" optional = false python-versions = "*" -groups = ["main"] files = [ {file = "osqp-0.6.7.post3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f751ca1332b480753cfe3c08bf14ca66259bf69679b572e1f8095ad3e26b201d"}, {file = "osqp-0.6.7.post3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1b30df65f2d938452e3bd2ca11388b5b16ec7406daedfc4b9dce3747c282e44"}, @@ -844,7 +821,6 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -856,7 +832,6 @@ version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, @@ -936,7 +911,7 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions ; python_version < \"3.10\""] +typing = ["typing-extensions"] xmp = ["defusedxml"] [[package]] @@ -945,7 +920,6 @@ version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -961,7 +935,6 @@ version = "2.10.6" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, @@ -974,7 +947,7 @@ typing-extensions = ">=4.12.2" [package.extras] email = ["email-validator (>=2.0.0)"] -timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] +timezone = ["tzdata"] [[package]] name = "pydantic-core" @@ -982,7 +955,6 @@ version = "2.27.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, @@ -1095,7 +1067,6 @@ version = "3.2.1" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, @@ -1110,7 +1081,6 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" -groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -1131,7 +1101,6 @@ version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, @@ -1150,7 +1119,6 @@ version = "3.6.1" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, @@ -1171,7 +1139,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -1186,7 +1153,6 @@ version = "0.1.7.post5" description = "QDLDL, a free LDL factorization routine." optional = false python-versions = "*" -groups = ["main"] files = [ {file = "qdldl-0.1.7.post5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:882658853edd24a7d16912af29e77320e061b150b4ed7cf94fd01907f2e925b4"}, {file = "qdldl-0.1.7.post5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e30a80d71ab5889a1e169304b12bc3ab69210775f6428153873584ff8dfb50e5"}, @@ -1239,7 +1205,6 @@ version = "1.15.1" description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "scipy-1.15.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:c64ded12dcab08afff9e805a67ff4480f5e69993310e093434b10e85dc9d43e1"}, {file = "scipy-1.15.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5b190b935e7db569960b48840e5bef71dc513314cc4e79a1b7d14664f57fd4ff"}, @@ -1289,7 +1254,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.16.5)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scs" @@ -1297,7 +1262,6 @@ version = "3.2.7.post2" description = "Splitting conic solver" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "scs-3.2.7.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7271ff566ac9df929c8cf7d1b024b89c3882b541c21a7a6d9aa94480822bccb"}, {file = "scs-3.2.7.post2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb2997f53ef3426934599517c6e0e77f4f05cc23c3aa2380fd176c7fd22bc0c8"}, @@ -1351,20 +1315,19 @@ version = "75.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""] -core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.8.0)"] +core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.14.*)", "pytest-mypy"] [[package]] name = "setuptools-scm" @@ -1372,7 +1335,6 @@ version = "8.1.0" description = "the blessed package to manage your versions by scm tags" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3"}, {file = "setuptools_scm-8.1.0.tar.gz", hash = "sha256:42dea1b65771cba93b7a515d65a65d8246e560768a66b9106a592c8e7f26c8a7"}, @@ -1385,7 +1347,7 @@ setuptools = "*" [package.extras] docs = ["entangled-cli (>=2.0,<3.0)", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] rich = ["rich"] -test = ["build", "pytest", "rich", "typing-extensions ; python_version < \"3.11\"", "wheel"] +test = ["build", "pytest", "rich", "typing-extensions", "wheel"] [[package]] name = "six" @@ -1393,7 +1355,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -1405,7 +1366,6 @@ version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, @@ -1427,7 +1387,6 @@ version = "0.3" description = "Experiments with new file format for tractography" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "trx_python-0.3-py3-none-any.whl", hash = "sha256:b00efb1024022a7835cc8b36e024a4ea575f19ce3fae81deb50b709fc8abcb49"}, {file = "trx_python-0.3.tar.gz", hash = "sha256:193e3282eaf03610c7e1b848aec04ddb9498fad3a7b684b30ca358e06751fbfd"}, @@ -1450,13 +1409,12 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.12, <4.0" content-hash = "5ab05dad4d959bc77cd144636991501995ee9f7e6ef1a46a8b55c81633a509e7" diff --git a/requirements-dev.txt b/requirements-dev.txt index 8a09163..add6854 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,9 +1,9 @@ -colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and sys_platform == "win32" -coverage[toml]==7.6.10 ; python_version >= "3.11" and python_version < "4.0" -execnet==2.1.1 ; python_version >= "3.11" and python_version < "4.0" -iniconfig==2.0.0 ; python_version >= "3.11" and python_version < "4.0" -packaging==24.2 ; python_version >= "3.11" and python_version < "4.0" -pluggy==1.5.0 ; python_version >= "3.11" and python_version < "4.0" -pytest-cov==5.0.0 ; python_version >= "3.11" and python_version < "4.0" -pytest-xdist==3.6.1 ; python_version >= "3.11" and python_version < "4.0" -pytest==7.4.4 ; python_version >= "3.11" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.12" and python_version < "4.0" and sys_platform == "win32" +coverage[toml]==7.6.10 ; python_version >= "3.12" and python_version < "4.0" +execnet==2.1.1 ; python_version >= "3.12" and python_version < "4.0" +iniconfig==2.0.0 ; python_version >= "3.12" and python_version < "4.0" +packaging==24.2 ; python_version >= "3.12" and python_version < "4.0" +pluggy==1.5.0 ; python_version >= "3.12" and python_version < "4.0" +pytest-cov==5.0.0 ; python_version >= "3.12" and python_version < "4.0" +pytest-xdist==3.6.1 ; python_version >= "3.12" and python_version < "4.0" +pytest==7.4.4 ; python_version >= "3.12" and python_version < "4.0" diff --git a/requirements.txt b/requirements.txt index 7f81221..cbb9024 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,35 +1,34 @@ -annotated-types==0.7.0 ; python_version >= "3.11" and python_version < "4.0" -clarabel==0.9.0 ; python_version >= "3.11" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.11" and python_version < "4.0" and platform_system == "Windows" -contourpy==1.3.1 ; python_version >= "3.11" and python_version < "4.0" -cvxpy==1.6.0 ; python_version >= "3.11" and python_version < "4.0" -cycler==0.12.1 ; python_version >= "3.11" and python_version < "4.0" -deepdiff==8.1.1 ; python_version >= "3.11" and python_version < "4.0" -dill==0.3.9 ; python_version >= "3.11" and python_version < "4.0" -dipy==1.10.0 ; python_version >= "3.11" and python_version < "4.0" -fonttools==4.55.6 ; python_version >= "3.11" and python_version < "4.0" -h5py==3.12.1 ; python_version >= "3.11" and python_version < "4.0" -importlib-resources==6.5.2 ; python_version >= "3.11" and python_version < "3.12" -joblib==1.4.2 ; python_version >= "3.11" and python_version < "4.0" -kiwisolver==1.4.8 ; python_version >= "3.11" and python_version < "4.0" -matplotlib==3.10.0 ; python_version >= "3.11" and python_version < "4.0" -multiprocess==0.70.17 ; python_version >= "3.11" and python_version < "4.0" -nibabel==5.3.2 ; python_version >= "3.11" and python_version < "4.0" -numpy==1.26.4 ; python_version >= "3.11" and python_version < "4.0" -orderly-set==5.2.3 ; python_version >= "3.11" and python_version < "4.0" -osqp==0.6.7.post3 ; python_version >= "3.11" and python_version < "4.0" -packaging==24.2 ; python_version >= "3.11" and python_version < "4.0" -pillow==11.1.0 ; python_version >= "3.11" and python_version < "4.0" -pydantic-core==2.27.2 ; python_version >= "3.11" and python_version < "4.0" -pydantic==2.10.6 ; python_version >= "3.11" and python_version < "4.0" -pyparsing==3.2.1 ; python_version >= "3.11" and python_version < "4.0" -python-dateutil==2.9.0.post0 ; python_version >= "3.11" and python_version < "4.0" -qdldl==0.1.7.post5 ; python_version >= "3.11" and python_version < "4.0" -scipy==1.15.1 ; python_version >= "3.11" and python_version < "4.0" -scs==3.2.7.post2 ; python_version >= "3.11" and python_version < "4.0" -setuptools-scm==8.1.0 ; python_version >= "3.11" and python_version < "4.0" -setuptools==75.8.0 ; python_version >= "3.11" and python_version < "4.0" -six==1.17.0 ; python_version >= "3.11" and python_version < "4.0" -tqdm==4.67.1 ; python_version >= "3.11" and python_version < "4.0" -trx-python==0.3 ; python_version >= "3.11" and python_version < "4.0" -typing-extensions==4.12.2 ; python_version >= "3.11" and python_version < "4.0" +annotated-types==0.7.0 ; python_version >= "3.12" and python_version < "4.0" +clarabel==0.9.0 ; python_version >= "3.12" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Windows" +contourpy==1.3.1 ; python_version >= "3.12" and python_version < "4.0" +cvxpy==1.6.0 ; python_version >= "3.12" and python_version < "4.0" +cycler==0.12.1 ; python_version >= "3.12" and python_version < "4.0" +deepdiff==8.1.1 ; python_version >= "3.12" and python_version < "4.0" +dill==0.3.9 ; python_version >= "3.12" and python_version < "4.0" +dipy==1.10.0 ; python_version >= "3.12" and python_version < "4.0" +fonttools==4.55.6 ; python_version >= "3.12" and python_version < "4.0" +h5py==3.12.1 ; python_version >= "3.12" and python_version < "4.0" +joblib==1.4.2 ; python_version >= "3.12" and python_version < "4.0" +kiwisolver==1.4.8 ; python_version >= "3.12" and python_version < "4.0" +matplotlib==3.10.0 ; python_version >= "3.12" and python_version < "4.0" +multiprocess==0.70.17 ; python_version >= "3.12" and python_version < "4.0" +nibabel==5.3.2 ; python_version >= "3.12" and python_version < "4.0" +numpy==1.26.4 ; python_version >= "3.12" and python_version < "4.0" +orderly-set==5.2.3 ; python_version >= "3.12" and python_version < "4.0" +osqp==0.6.7.post3 ; python_version >= "3.12" and python_version < "4.0" +packaging==24.2 ; python_version >= "3.12" and python_version < "4.0" +pillow==11.1.0 ; python_version >= "3.12" and python_version < "4.0" +pydantic-core==2.27.2 ; python_version >= "3.12" and python_version < "4.0" +pydantic==2.10.6 ; python_version >= "3.12" and python_version < "4.0" +pyparsing==3.2.1 ; python_version >= "3.12" and python_version < "4.0" +python-dateutil==2.9.0.post0 ; python_version >= "3.12" and python_version < "4.0" +qdldl==0.1.7.post5 ; python_version >= "3.12" and python_version < "4.0" +scipy==1.15.1 ; python_version >= "3.12" and python_version < "4.0" +scs==3.2.7.post2 ; python_version >= "3.12" and python_version < "4.0" +setuptools-scm==8.1.0 ; python_version >= "3.12" and python_version < "4.0" +setuptools==75.8.0 ; python_version >= "3.12" and python_version < "4.0" +six==1.17.0 ; python_version >= "3.12" and python_version < "4.0" +tqdm==4.67.1 ; python_version >= "3.12" and python_version < "4.0" +trx-python==0.3 ; python_version >= "3.12" and python_version < "4.0" +typing-extensions==4.12.2 ; python_version >= "3.12" and python_version < "4.0" From 5a250516a2939261e527c004a2883cd60e0c6447 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Sat, 12 Apr 2025 03:19:16 -0400 Subject: [PATCH 68/78] Bump Dockerfiles to Python 3.12 --- Dockerfile | 2 +- tests/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d619a63..14ad78c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,7 @@ # ============================================================================== # Load base Ubuntu image -FROM dmri/ci-cd-py3.11:9b5fdb22 AS base +FROM dmri/ci-cd-py3.12:6f2600ca AS base SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] # Labels diff --git a/tests/Dockerfile b/tests/Dockerfile index 7fec59a..40a6fb4 100644 --- a/tests/Dockerfile +++ b/tests/Dockerfile @@ -1,4 +1,4 @@ -FROM dmri/ci-cd-py3.11:9b5fdb22 +FROM dmri/ci-cd-py3.12:6f2600ca SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] WORKDIR /src COPY . /src From 36044cf14c61b0a6dde60ccc4987685902f19e17 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 29 Apr 2025 23:36:01 -0400 Subject: [PATCH 69/78] Add argument groups --- pydesigner/main.py | 119 +++++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 48 deletions(-) diff --git a/pydesigner/main.py b/pydesigner/main.py index ec27341..15fddd3 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -107,7 +107,6 @@ def main(): ) # Specify arguments below - # Mandatory parser.add_argument( "dwi", @@ -116,15 +115,37 @@ def main(): type=str, ) + preprocessing_control = parser.add_argument_group( + title="Preprocessing controls", + description="Fine-tune DWI preprocessing", + ) + estimation_control = parser.add_argument_group( + title="DTI/DKI/WMTI/FBI/FBWM controls", + description="Control estimation of diffusion estimation", + ) + qc_control = parser.add_argument_group( + title="QC controls", + description="Controls for QC metrics", + ) + tractography_control = parser.add_argument_group( + title="Tractography controls", + description="Fine-tune tractography" + ) + program_control = parser.add_argument_group( + title="PyDesigner CLI controls", + description="Change PyDesigner app behavior" + ) + + # Optional - parser.add_argument( + preprocessing_control.add_argument( "-o", "--output", metavar="directory", help="Output location. Default: same path as dwi.", type=str, ) - parser.add_argument( + preprocessing_control.add_argument( "-s", "--standard", action="store_true", @@ -133,20 +154,20 @@ def main(): "options. See Appendix:Standard pipeline steps " "for more information. ", ) - parser.add_argument( + preprocessing_control.add_argument( "-n", "--denoise", action="store_true", default=False, help="Run thermal denoising with dwidenoise.", ) - parser.add_argument( + preprocessing_control.add_argument( "--extent", metavar="n,n,n", default="5,5,5", help="Denoising extent formatted n,n,n (forces denoising. Default: 5,5,5.", ) - parser.add_argument( + preprocessing_control.add_argument( "-g", "--degibbs", action="store_true", @@ -155,14 +176,14 @@ def main(): "have full Fourier encoding. The program will check " "for you if you have a .json sidecar.", ) - parser.add_argument( + preprocessing_control.add_argument( "-u", "--undistort", action="store_true", default=False, help="Run FSL eddy to perform image undistortion. NOTE: needs a --topup to run.", ) - parser.add_argument( + preprocessing_control.add_argument( "--rpe_pairs", default=0, type=int, @@ -173,34 +194,34 @@ def main(): "Specfying 0 results in using all B0 pairs." "We recommend using just one pair. Default: 0", ) - parser.add_argument( + preprocessing_control.add_argument( "-z", "--smooth", action="store_true", default=False, help="Perform smoothing on the DWI data.", ) - parser.add_argument( + preprocessing_control.add_argument( "--fwhm", type=float, default=1.25, metavar="n", help="The FWHM to use as a multiple of voxel size. Default 1.25", ) - parser.add_argument( + preprocessing_control.add_argument( "-r", "--rician", action="store_true", default=False, help="Perform Rician noise correction on the data (requires --denoise to generate a noisemap).", ) - parser.add_argument( + preprocessing_control.add_argument( "--nofit", action="store_true", default=False, help="Do not fit DTI or DKI tensors.", ) - parser.add_argument( + preprocessing_control.add_argument( "--akc", action="store_true", default=False, @@ -208,13 +229,13 @@ def main(): "a median filter to tensor voxels that exhibit AKC " "values of less than 2 and more than 10.", ) - parser.add_argument( + preprocessing_control.add_argument( "--nooutliers", action="store_true", default=False, help="Do not perform outlier correction on kurtosis fitting metrics.", ) - parser.add_argument( + preprocessing_control.add_argument( "-m", "--mask", action="store_true", @@ -223,26 +244,26 @@ def main(): "to strip skull and improve efficiency. Optionally, " "use --maskthr to specify a threshold manually.", ) - parser.add_argument( + preprocessing_control.add_argument( "--maskthr", metavar="n", default=0.25, help="FSL bet threshold used for brain masking. Default: 0.25", ) - parser.add_argument( + preprocessing_control.add_argument( "--user_mask", metavar="path", help="Path to user-supplied brain mask.", type=str, ) - parser.add_argument( + preprocessing_control.add_argument( "-cf", "--csf_fsl", action="store_true", default=False, help="Compute a CSF mask for CSF-excluded smoothing to minimize partial volume effects using FSL FAST.", ) - parser.add_argument( + preprocessing_control.add_argument( "-cd", "--csf_adc", metavar="n", @@ -252,7 +273,7 @@ def main(): "effects using thresholding a pseudo-ADC map " "computed as ln(S0/S1000)/b1000. Default: 2", ) - parser.add_argument( + preprocessing_control.add_argument( "--reslice", metavar="x,y,z", help="Relices DWI to voxel resolution " @@ -262,13 +283,27 @@ def main(): "greater than 9 will switch from mm voxel " "reslicing to output image reslicing.", ) - parser.add_argument( + preprocessing_control.add_argument( "--interp", action="store_true", default="linear", help="Set the interpolation to use when reslicing. Choices are linear (default), nearest, cubic, and sinc.", ) - parser.add_argument( + preprocessing_control.add_argument( + "--median", + action="store_true", + default=False, + help="Performs postprocessing median filtering of " + "final maps. WARNING: Use on a case-by-case " + "basis for bad data only. When applied, the " + "filter alters the values of most voxels, so " + "it should be used with caution and avoided " + "when data quality is otherwise adequate. " + "While maps appear visually soother with " + "this flag on, they may nonetheless be less " + "accurate.", + ) + preprocessing_control.add_argument( "-te", "--multite", action="store_true", @@ -278,20 +313,20 @@ def main(): "TEs together, then extract metric values of " "each TE separately.", ) - parser.add_argument( + estimation_control.add_argument( "--fit_constraints", default="0,1,0", metavar="D>0,K>0,K < 3/(b*D)", help="Constrain the WLLS fit. Default: 0,1,0.", ) - parser.add_argument( + estimation_control.add_argument( "--l_max", default=6, type=int, metavar="n", help="Maximum spherical harmonic degree for FBI spherical harmonic expansion", ) - parser.add_argument( + estimation_control.add_argument( "--no_rectify", action="store_true", default=False, @@ -300,7 +335,7 @@ def main(): "acquisitions results in degradation of FBI " "or FBWM metric maps", ) - parser.add_argument( + tractography_control.add_argument( "--t_res", type=str, default="med", @@ -308,56 +343,43 @@ def main(): "Higher resolution implies slower computation. Choose " 'between "low", "med", or "high". Default: "med"', ) - parser.add_argument( + tractography_control.add_argument( "--t_fibers", type=int, default=5, help="The maximum number ODF maxima to extract per voxel for tractography. Default: 5", ) - parser.add_argument( + qc_control.add_argument( "--noqc", action="store_true", default=False, help="Disable QC saving of QC metrics", ) - parser.add_argument( - "--median", - action="store_true", - default=False, - help="Performs postprocessing median filtering of " - "final maps. WARNING: Use on a case-by-case " - "basis for bad data only. When applied, the " - "filter alters the values of most voxels, so " - "it should be used with caution and avoided " - "when data quality is otherwise adequate. " - "While maps appear visually soother with " - "this flag on, they may nonetheless be less " - "accurate.", - ) - parser.add_argument( + + program_control.add_argument( "--nthreads", type=int, default=None, help="Number of threads to use for computation. Note that using too many threads will cause a slow-down.", ) - parser.add_argument( + program_control.add_argument( "--resume", action="store_true", help="Continue from an aborted or partial previous run of pydesigner.", ) - parser.add_argument( + program_control.add_argument( "--force", action="store_true", help="Force overwrites of existing files. Otherwise, there will be an error at runtime.", ) - parser.add_argument( + program_control.add_argument( "--verbose", action="store_true", help="Print out all output. This is a very messy " "option. We recommend piping output to a text file " "if you use this option.", ) - parser.add_argument( + program_control.add_argument( "--adv", action="store_true", help="Disables safety checks for advanced users who " @@ -367,10 +389,11 @@ def main(): "RUNNING WITH THIS FLAG COULD POTENTIALLY " "RESULT IN IMPRECISE AND INACCURATE RESULTS.", ) - parser.add_argument("-v", "--version", action="version", version=__version__) + program_control.add_argument("-v", "--version", action="version", version=__version__) # Use argument specification to actually get args args = parser.parse_args() + print(args) # ----------------------------------------------------------------- # Parse Input Image From 6e5d4fed7e9d83aa1aac9eb09dc344ed21176441 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Tue, 29 Apr 2025 23:39:05 -0400 Subject: [PATCH 70/78] Update pre-commit hooks --- .pre-commit-config.yaml | 6 +++--- pydesigner/main.py | 31 ++++++++++++++----------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dd341e1..c72c86c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,13 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: 'v4.6.0' + rev: 'v5.0.0' hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema - rev: '0.31.0' + rev: '0.33.0' hooks: - id: check-readthedocs @@ -19,7 +19,7 @@ repos: language_version: python3 - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.9.3' + rev: 'v0.11.7' hooks: - id: ruff args: [--config, pyproject.toml, --fix, --exit-non-zero-on-fix] diff --git a/pydesigner/main.py b/pydesigner/main.py index 15fddd3..1363300 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -128,15 +128,12 @@ def main(): description="Controls for QC metrics", ) tractography_control = parser.add_argument_group( - title="Tractography controls", - description="Fine-tune tractography" + title="Tractography controls", description="Fine-tune tractography" ) program_control = parser.add_argument_group( - title="PyDesigner CLI controls", - description="Change PyDesigner app behavior" + title="PyDesigner CLI controls", description="Change PyDesigner app behavior" ) - # Optional preprocessing_control.add_argument( "-o", @@ -290,18 +287,18 @@ def main(): help="Set the interpolation to use when reslicing. Choices are linear (default), nearest, cubic, and sinc.", ) preprocessing_control.add_argument( - "--median", - action="store_true", - default=False, - help="Performs postprocessing median filtering of " - "final maps. WARNING: Use on a case-by-case " - "basis for bad data only. When applied, the " - "filter alters the values of most voxels, so " - "it should be used with caution and avoided " - "when data quality is otherwise adequate. " - "While maps appear visually soother with " - "this flag on, they may nonetheless be less " - "accurate.", + "--median", + action="store_true", + default=False, + help="Performs postprocessing median filtering of " + "final maps. WARNING: Use on a case-by-case " + "basis for bad data only. When applied, the " + "filter alters the values of most voxels, so " + "it should be used with caution and avoided " + "when data quality is otherwise adequate. " + "While maps appear visually soother with " + "this flag on, they may nonetheless be less " + "accurate.", ) preprocessing_control.add_argument( "-te", From 65ac37d1a85c07e9eda725b7d1a07908ee7aca76 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 00:41:00 -0400 Subject: [PATCH 71/78] Add window flag --- pydesigner/fitting/dwipy.py | 46 +++++++++++++++++--------------- pydesigner/fitting/thresholds.py | 26 ++++++++++++++++++ pydesigner/main.py | 9 +++++++ pydesigner/system/utils.py | 13 ++++++--- 4 files changed, 69 insertions(+), 25 deletions(-) diff --git a/pydesigner/fitting/dwipy.py b/pydesigner/fitting/dwipy.py index 21c6b7b..4fc120a 100644 --- a/pydesigner/fitting/dwipy.py +++ b/pydesigner/fitting/dwipy.py @@ -2698,6 +2698,7 @@ def fit_regime( res: str = "med", n_fibers: int = 5, mask: Union[str, None] = None, + window: bool = False, nthreads: Union[int, None] = None, ) -> None: """Performs the entire tensor fitting regime and writes out maps. @@ -2741,6 +2742,9 @@ def fit_regime( mask : str Path to brain mask (Default: None) + window : bool + Window metric map within biological limits + (Default: False) nthreads : int Number of workers to use in processing. Default value uses all available workers. @@ -2831,10 +2835,10 @@ def fit_regime( # DTI Parameters if img.isdti(): md, rd, ad, fa, fe, trace = img.extractDTI() - writeNii(md, img.hdr, op.join(output, fname_dti["md"])) - writeNii(rd, img.hdr, op.join(output, fname_dti["rd"])) - writeNii(ad, img.hdr, op.join(output, fname_dti["ad"])) - writeNii(fa, img.hdr, op.join(output, fname_dti["fa"])) + writeNii(md, img.hdr, op.join(output, fname_dti["md"]), range=th.__md__, clip=window) + writeNii(rd, img.hdr, op.join(output, fname_dti["rd"]), range=th.__rd__, clip=window) + writeNii(ad, img.hdr, op.join(output, fname_dti["ad"]), range=th.__ad__, clip=window) + writeNii(fa, img.hdr, op.join(output, fname_dti["fa"]), range=th.__fa__, clip=window) writeNii(fe, img.hdr, op.join(output, fname_dti["fe"])) writeNii(trace, img.hdr, op.join(output, fname_dti["trace"])) dtimodel = odf.odfmodel(dt=op.join(output, fname_tensor["DT"]), mask=mask, l_max=2, res=res) @@ -2857,19 +2861,19 @@ def fit_regime( if img.isdki(): # DKI Parameters mk, rk, ak, kfa, mkt, trace = img.extractDKI() - writeNii(mk, img.hdr, op.join(output, fname_dki["mk"])) - writeNii(rk, img.hdr, op.join(output, fname_dki["rk"])) - writeNii(ak, img.hdr, op.join(output, fname_dki["ak"])) - writeNii(kfa, img.hdr, op.join(output, fname_dki["kfa"])) + writeNii(mk, img.hdr, op.join(output, fname_dki["mk"]), range=th.__mk__, clip=window) + writeNii(rk, img.hdr, op.join(output, fname_dki["rk"]), range=th.__rk__, clip=window) + writeNii(ak, img.hdr, op.join(output, fname_dki["ak"]), range=th.__ak__, clip=window) + writeNii(kfa, img.hdr, op.join(output, fname_dki["kfa"]), range=th.__kfa__, clip=window) writeNii(mkt, img.hdr, op.join(output, fname_dki["mkt"])) writeNii(trace, img.hdr, op.join(output, fname_dki["trace"])) # WMTI Parameters awf, eas_ad, eas_rd, eas_tort, ias_da = img.extractWMTI() - writeNii(awf, img.hdr, op.join(output, fname_wmti["awf"])) - writeNii(eas_ad, img.hdr, op.join(output, fname_wmti["eas_ad"])) - writeNii(eas_rd, img.hdr, op.join(output, fname_wmti["eas_rd"])) - writeNii(eas_tort, img.hdr, op.join(output, fname_wmti["eas_tort"])) - writeNii(ias_da, img.hdr, op.join(output, fname_wmti["ias_da"])) + writeNii(awf, img.hdr, op.join(output, fname_wmti["awf"]), range=th.__wawf__, clip=window) + writeNii(eas_ad, img.hdr, op.join(output, fname_wmti["eas_ad"]), range=th.__eas_ad__, clip=window) + writeNii(eas_rd, img.hdr, op.join(output, fname_wmti["eas_rd"]), range=th.__eas_rd__, clip=window) + writeNii(eas_tort, img.hdr, op.join(output, fname_wmti["eas_tort"]), range=th.__tort__, clip=window) + writeNii(ias_da, img.hdr, op.join(output, fname_wmti["ias_da"]), range=th.__ias_da__, clip=window) dkimodel = odf.odfmodel( dt=op.join(output, fname_tensor["DT"]), kt=op.join(output, fname_tensor["KT"]), @@ -2918,16 +2922,16 @@ def fit_regime( min_cost, min_cost_fn, ) = img.fbi(l_max=l_max, fbwm=True, rectify=rectify) - writeNii(zeta, img.hdr, op.join(output, fname_fbi["zeta"])) - writeNii(faa, img.hdr, op.join(output, fname_fbi["faa"])) + writeNii(zeta, img.hdr, op.join(output, fname_fbi["zeta"]), range=th.__zeta__, clip=window) + writeNii(faa, img.hdr, op.join(output, fname_fbi["faa"]), range=th.__faa__, clip=window) writeNii(np.real(sph), img.hdr, op.join(output, fname_fbi["odf"])) writeNii(np.real(sph_mrtrix), img.hdr, op.join(output, fname_fbi["odf_mrtrix"])) - writeNii(min_awf, img.hdr, op.join(output, fname_fbi["awf"])) - writeNii(Da, img.hdr, op.join(output, fname_fbi["Da"])) - writeNii(De_mean, img.hdr, op.join(output, fname_fbi["De_mean"])) - writeNii(De_ax, img.hdr, op.join(output, fname_fbi["De_ax"])) - writeNii(De_rad, img.hdr, op.join(output, fname_fbi["De_rad"])) - writeNii(De_fa, img.hdr, op.join(output, fname_fbi["fae"])) + writeNii(min_awf, img.hdr, op.join(output, fname_fbi["awf"]), range=th.__fawf__, clip=window) + writeNii(Da, img.hdr, op.join(output, fname_fbi["Da"]), range=th.__da__, clip=window) + writeNii(De_mean, img.hdr, op.join(output, fname_fbi["De_mean"]), range=th.__de_mean__, clip=window) + writeNii(De_ax, img.hdr, op.join(output, fname_fbi["De_ax"]), range=th.__de__ax__, clip=window) + writeNii(De_rad, img.hdr, op.join(output, fname_fbi["De_rad"]), range=th.__de_rad__, clip=window) + writeNii(De_fa, img.hdr, op.join(output, fname_fbi["fae"]), range=th.__de_fa__, clip=window) writeNii(min_cost, img.hdr, op.join(output, fname_fbi["min_cost"])) writeNii(min_cost_fn, img.hdr, op.join(output, fname_fbi["min_cost_fn"])) dsistudio.makefib( diff --git a/pydesigner/fitting/thresholds.py b/pydesigner/fitting/thresholds.py index e6c2fb1..c115aee 100644 --- a/pydesigner/fitting/thresholds.py +++ b/pydesigner/fitting/thresholds.py @@ -9,3 +9,29 @@ __pkT__ = 0.4 # peak thresholding for white matter fiber tracking __minZero__ = 10e-8 # threshold under which all numbers are zero __dirs__ = 256 # Define number of directions to resample after computing all tensors +# DTI windows +__fa__ = [0, 1] +__md__ = [0, 5] +__rd__ = [0, 5] +__ad__ = [0, 5] +# DKI windows +__kfa__ = [0, 1] +__mk__ = [0, 10] +__rk__ = [0, 10] +__ak__ = [0, 10] +# WMTI windows +__wawf__ = [0, 1] +__eas_rd__ = [0, 5] +__eas_ad__ = [0, 5] +__tort__ = [0, 100] +__ias_da__ = [0, 5] + #FBI windows +__zeta__ = [0, 10] +__faa__ = [0, 1] +# FBWM windows +__fawf__ = [0, 1] +__da__ = [0, 5] +__de_mean__ = [0, 5] +__de_rad__ = [0, 5] +__de__ax__ = [0, 5] +__de_fa__ = [0, 1] diff --git a/pydesigner/main.py b/pydesigner/main.py index 1363300..cb5014e 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -310,6 +310,13 @@ def main(): "TEs together, then extract metric values of " "each TE separately.", ) + preprocessing_control.add_argument( + "-w", + "--window", + action="store_true", + default=False, + help="Window final metric maps within biological ranges" + ) estimation_control.add_argument( "--fit_constraints", default="0,1,0", @@ -1137,6 +1144,7 @@ def main(): qcpath=fitqcpath, fit_constraints=fit_constraints, mask=fit_mask, + window=args.window, nthreads=args.nthreads, ) else: @@ -1155,6 +1163,7 @@ def main(): qcpath=fitqcpath, fit_constraints=fit_constraints, mask=fit_mask, + window=args.window, nthreads=args.nthreads, ) diff --git a/pydesigner/system/utils.py b/pydesigner/system/utils.py index 108020c..edd623d 100644 --- a/pydesigner/system/utils.py +++ b/pydesigner/system/utils.py @@ -51,7 +51,7 @@ def vectorize(img, mask) -> np.ndarray[float]: return np.squeeze(s) -def writeNii(map, hdr, outDir, range=None) -> None: +def writeNii(map, hdr, outDir, range=None, clip=False) -> None: """Write clipped NifTi images Parameters @@ -65,6 +65,9 @@ def writeNii(map, hdr, outDir, range=None) -> None: range : array_like [1 x 2] vector specifying range to clip, inclusive of value in range, e.g. range = [0, 1] for FA map + clip: bool + Clip and apply values specified in range + (Default: False) Returns ------- @@ -72,13 +75,15 @@ def writeNii(map, hdr, outDir, range=None) -> None: Examples -------- - writeNii(matrix, header, output_directory, [0, 2]) + writeNii(matrix, header, output_directory, [0, 2], clip=True) See Also -------- clipImage(img, range) : this function is wrapped around """ - if range is None: + if clip and not range: + raise Exception("Range is required in order to clip an image.") + if not clip: clipped_img = nib.Nifti1Image(map, hdr.affine, hdr.header) else: clipped_img = clipImage(map, range) @@ -104,7 +109,7 @@ def clipImage(img, range) -> np.ndarray[float]: Examples -------- - clippedImage = clipImage(image, [0 3]) + clippedImage = clipImage(image, [0, 3]) Clips input matrix in the range 0 to 3 """ img[img > range[1]] = range[1] From c526f3fa9fb8a2fb39a81ab8242d497252405707 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 00:42:32 -0400 Subject: [PATCH 72/78] Apply linting --- pydesigner/fitting/thresholds.py | 2 +- pydesigner/main.py | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/pydesigner/fitting/thresholds.py b/pydesigner/fitting/thresholds.py index c115aee..ce08569 100644 --- a/pydesigner/fitting/thresholds.py +++ b/pydesigner/fitting/thresholds.py @@ -25,7 +25,7 @@ __eas_ad__ = [0, 5] __tort__ = [0, 100] __ias_da__ = [0, 5] - #FBI windows +# FBI windows __zeta__ = [0, 10] __faa__ = [0, 1] # FBWM windows diff --git a/pydesigner/main.py b/pydesigner/main.py index cb5014e..4d5d08e 100644 --- a/pydesigner/main.py +++ b/pydesigner/main.py @@ -311,11 +311,7 @@ def main(): "each TE separately.", ) preprocessing_control.add_argument( - "-w", - "--window", - action="store_true", - default=False, - help="Window final metric maps within biological ranges" + "-w", "--window", action="store_true", default=False, help="Window final metric maps within biological ranges" ) estimation_control.add_argument( "--fit_constraints", From b053f55d8aa8761f43a5f1aa7899c7eb188e7521 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 00:46:54 -0400 Subject: [PATCH 73/78] Update pyproject.toml --- pyproject.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c153e4b..b7bf98d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,10 +57,6 @@ line-length = 120 # Assume Python 3.12 target-version = "py312" -# Allow fix for all enabled rules (when `--fix`) is provided. -fixable = ["ALL"] -unfixable = [] - # Exclude a variety of commonly ignored directories. exclude = [ ".bzr", @@ -89,9 +85,6 @@ exclude = [ "setup.py", ] -# Allow unused variables when underscore-prefixed. -dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" - [tool.ruff.lint] # Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or @@ -99,6 +92,13 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" select = ["E", "F", "I"] ignore = ["F841"] +# Allow fix for all enabled rules (when `--fix`) is provided. +fixable = ["ALL"] +unfixable = [] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + [tool.ruff.format] # Like Black, use double quotes for strings. quote-style = "double" From f610f5feed0236a4fb0be6aa36edaf47395d30fc Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 01:02:25 -0400 Subject: [PATCH 74/78] Remove old Dockerfiles --- docker/Dockerfile_develop | 97 ----------------------------- docker/Dockerfile_release | 100 ------------------------------ docker/install_pydesigner_release | 5 -- 3 files changed, 202 deletions(-) delete mode 100644 docker/Dockerfile_develop delete mode 100644 docker/Dockerfile_release delete mode 100644 docker/install_pydesigner_release diff --git a/docker/Dockerfile_develop b/docker/Dockerfile_develop deleted file mode 100644 index 79c1b35..0000000 --- a/docker/Dockerfile_develop +++ /dev/null @@ -1,97 +0,0 @@ -# ============================================================================== -# NeuroDock -# A docker container that contains all PyDesigner dependencies such as MRTRIX3, -# FSL, and Python to preprocess diffusion MRI images. -# -# Maintainer: Siddhartha Dhiman -# ------------------------------------------------------------------------------ -# Current Dependencies -# 1.) FSL -# 2.) MRTRIX3 -# 3.) Python 2.7 -# 4.) Python 3.6 -# 6.) PyDesigner -# ============================================================================== - -# Load base Ubuntu image -FROM debian:buster-slim - -# Add LABEL Information -ARG BUILD_DATE -ARG VCS_REF - -# Labels. -LABEL maintainer="Siddhartha Dhiman (dhiman@musc.edu)" -LABEL org.label-schema.schema-version="1.0.0-rc1" -LABEL org.label-schema.build-date=$BUILD_DATE -LABEL org.label-schema.name="dmri/pydesigner" -LABEL org.label-schema.description="A state-of-the-art difusion and kurtosis MRI processing pipeline" -LABEL org.label-schema.url="https://github.com/m-ama/" -LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" -LABEL org.label-schema.vcs-ref=$VCS_REF -LABEL org.label-schema.vendor="MAMA" - -ARG DEBIAN_FRONTEND=noninteractive - -# Initial update -RUN apt-get update && \ - apt-get install -y \ - apt-utils \ - wget \ - curl \ - nano \ - software-properties-common \ - python2.7 python-pip \ - python3-pip \ - libblas-dev \ - liblapack-dev \ - libatlas-base-dev \ - gfortran - -# Install MRTRIX3 dependencies -RUN apt-get install -y --no-install-recommends \ - clang \ - git \ - python-numpy \ - libeigen3-dev \ - zlib1g-dev \ - libqt4-opengl-dev \ - libgl1-mesa-dev \ - libfftw3-dev \ - libtiff5-dev \ - libomp-dev \ - libhdf5-serial-dev - -RUN rm /bin/sh && ln -s /bin/bash /bin/sh - -# Clone PyDesigner -RUN mkdir -p /tmp/PyDesigner -RUN pip3 install cmake -RUN git clone -b develop --single-branch https://github.com/m-ama/PyDesigner.git /tmp/PyDesigner -RUN pip3 install /tmp/PyDesigner -RUN echo "alias python=python3" >> ~/.bashrc && source ~/.bashrc -RUN echo "alias pip=pip3" >> ~/.bashrc && source ~/.bashrc - -# Install FSL -RUN curl https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py -o /tmp/fslinstaller.py -RUN python /tmp/fslinstaller.py -V 6.0.6 -d /usr/local/fsl - -# Configure FSL Environment -ENV FSLDIR=/usr/local/fsl -ENV FSLOUTPUTTYPE=NIFTI_GZ -ENV PATH=$PATH:$FSLDIR/bin -ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FSLDIR - -# Build and Configure MRTRIX3 -RUN git clone https://github.com/MRtrix3/mrtrix3.git /usr/local/mrtrix3 -ENV CXX=/usr/bin/clang++ -ENV ARCH=native -RUN cd /usr/local/mrtrix3 && \ - ./configure -nogui -openmp && \ - ./build && \ - ./set_path -ENV PATH=$PATH:/usr/local/mrtrix3/bin - -# Remove unwanted packages -RUN apt-get autoremove && apt-get clean -RUN rm /tmp/fslinstaller.py && rm -r /tmp/PyDesigner diff --git a/docker/Dockerfile_release b/docker/Dockerfile_release deleted file mode 100644 index 6241c60..0000000 --- a/docker/Dockerfile_release +++ /dev/null @@ -1,100 +0,0 @@ -# ============================================================================== -# NeuroDock -# A docker container that contains all PyDesigner dependencies such as MRTRIX3, -# FSL, and Python to preprocess diffusion MRI images. -# -# Maintainer: Siddhartha Dhiman -# ------------------------------------------------------------------------------ -# Current Dependencies -# 1.) FSL -# 2.) MRTRIX3 -# 3.) Python 2.7 -# 4.) Python 3.6 -# 6.) PyDesigner -# ============================================================================== - -# Load base Ubuntu image -FROM debian:buster-slim - -# Add LABEL Information -# ARG BUILD_DATE -# ARG VCS_REF - -# Labels. -LABEL maintainer="Siddhartha Dhiman (dhiman@musc.edu)" -LABEL org.label-schema.schema-version="1.0.0-rc1" -LABEL org.label-schema.build-date=$BUILD_DATE -LABEL org.label-schema.name="dmri/pydesigner" -LABEL org.label-schema.description="A state-of-the-art difusion and kurtosis MRI processing pipeline" -LABEL org.label-schema.url="https://github.com/m-ama/" -LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" -LABEL org.label-schema.vcs-ref=$VCS_REF -LABEL org.label-schema.vendor="MAMA" - -ARG DEBIAN_FRONTEND=noninteractive - -# Initial update -RUN apt-get update && \ - apt-get install -y \ - apt-utils \ - wget \ - curl \ - nano \ - software-properties-common \ - python2.7 python-pip \ - python3-pip \ - libblas-dev \ - liblapack-dev \ - libatlas-base-dev \ - gfortran - -# Install MRTRIX3 dependencies -RUN apt-get install -y --no-install-recommends \ - clang \ - git \ - # python-numpy \ - libeigen3-dev \ - zlib1g-dev \ - libqt4-opengl-dev \ - libgl1-mesa-dev \ - libfftw3-dev \ - libtiff5-dev \ - libomp-dev \ - libhdf5-serial-dev - -RUN rm /bin/sh && ln -s /bin/bash /bin/sh - -# Clone PyDesigner -ADD install_pydesigner_release /tmp/install_pydesigner_release -RUN sed -i 's/\r//g' /tmp/install_pydesigner_release -RUN pip3 install cmake==3.22.0 -RUN chmod +x /tmp/install_pydesigner_release && bash /tmp/install_pydesigner_release -RUN cd /tmp/PyDesigner && pip3 install . -RUN echo "alias python=python3" >> ~/.bashrc && source ~/.bashrc -RUN echo "alias pip=pip3" >> ~/.bashrc && source ~/.bashrc - -# Install FSL -RUN curl https://fsl.fmrib.ox.ac.uk/fsldownloads/fslinstaller.py -o /tmp/fslinstaller.py -RUN python /tmp/fslinstaller.py -V 6.0.6 -d /usr/local/fsl - -# Configure FSL Environment -ENV FSLDIR=/usr/local/fsl -ENV FSLOUTPUTTYPE=NIFTI_GZ -ENV PATH=$PATH:$FSLDIR/bin -ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$FSLDIR - -# Build and Configure MRTRIX3 -RUN git clone https://github.com/MRtrix3/mrtrix3.git /usr/local/mrtrix3 -ENV CXX=/usr/bin/clang++ -ENV ARCH=native -RUN cd /usr/local/mrtrix3 && \ - ./configure -nogui -openmp && \ - ./build && \ - ./set_path -ENV PATH=$PATH:/usr/local/mrtrix3/bin - -# Remove unwanted packages -RUN apt-get autoremove && apt-get clean -RUN rm /tmp/fslinstaller.py && \ - rm /tmp/install_pydesigner_release && \ - rm -r /tmp/PyDesigner diff --git a/docker/install_pydesigner_release b/docker/install_pydesigner_release deleted file mode 100644 index f902e4f..0000000 --- a/docker/install_pydesigner_release +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -# Downloads and extractslatest release PyDesigner into /tmp/PyDesigner -mkdir -p /tmp/PyDesigner -export URL=$(curl -s https://api.github.com/repos/m-ama/PyDesigner/releases/latest | grep "tarball" | cut -d '"' -f 4) -wget -q -O - $URL | tar -xzvf - -C /tmp/PyDesigner --strip 1 From 42910437c26bb22b7018f7a3dcd3975fe2b5a58c Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 01:15:32 -0400 Subject: [PATCH 75/78] Fix Dockerfile --- Dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 14ad78c..82914a1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,7 @@ # Load base Ubuntu image FROM dmri/ci-cd-py3.12:6f2600ca AS base SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] +WORKDIR /src # Labels LABEL maintainer="Siddhartha Dhiman (siddhartha.dhiman@gmail.com)" @@ -19,23 +20,22 @@ LABEL org.label-schema.vcs-url="https://github.com/m-ama/NeuroDock.git" LABEL org.label-schema.vendor="MUSC BRIDGE" # Copy and install PyDesigner -FROM base as dependencies -WORKDIR /src +FROM base AS dependencies COPY requirements.txt ./ RUN uv pip install -r requirements.txt -FROM dependencies as development +FROM dependencies AS development COPY requirements-dev.txt ./ RUN uv pip install -rrequirements-dev.txt COPY . . RUN uv pip install --no-deps -e. -FROM dependencies as pyc +FROM dependencies AS pyc COPY . . RUN python -m compileall -bqj0 . RUN find . -name "*.py" -not -name "__init__.py" -delete -FROM pyc as production +FROM pyc AS production COPY --from=pyc /src . RUN uv pip install --no-deps -e. From f038d29515c3a9573d7d1633f2e654a4050dd881 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 01:45:07 -0400 Subject: [PATCH 76/78] Update publish workflow --- .github/workflows/neurodock.yml | 58 ------------------------- .github/workflows/publish.yml | 77 +++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 58 deletions(-) delete mode 100644 .github/workflows/neurodock.yml create mode 100644 .github/workflows/publish.yml diff --git a/.github/workflows/neurodock.yml b/.github/workflows/neurodock.yml deleted file mode 100644 index a1741bf..0000000 --- a/.github/workflows/neurodock.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: Docker Build and Publish - -on: - push: - branches: - - master - tags: - - "**" - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Checkout - id: checkout - uses: actions/checkout@v3 - with: - token: ${{ secrets.GH_BRIDGE_PAT }} - - - name: Fetch version - id: version - uses: SebRollen/toml-action@v1.0.2 - with: - file: 'pyproject.toml' - field: 'tool.poetry.version' - - - name: Setup QEMU - id: qemu - uses: docker/setup-qemu-action@v3 - - - name: Setup Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to Docker Hub - id: login - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - id: docker_build_push - uses: docker/build-push-action@v5 - with: - push: true - tags: | - dmri/neurodock:latest - dmri/neurodock:${{ steps.version.outputs.value }} - ghcr.io/muscbridge/PyDesigner:latest - ghcr.io/muscbridge/PyDesigner:${{ steps.version.outputs.value }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..9109a10 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,77 @@ +name: Build and Publish + +on: + push: + branches: + - master + tags: + - "**" + +jobs: + + python: + runs-on: ubuntu-latest + steps: + - name: Checkout code + id: checkout + uses: actions/checkout@v4 + with: + token: ${{ secrets.GH_BRIDGE_PAT }} + - name: Build and publish to PyPI + id: publish + uses: JRubics/poetry-publish@v2.1 + with: + python_version: 3.12 + pypi_token: ${{ secrets.PYPI }} + poetry_install_options: --without dev + + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + id: checkout + uses: actions/checkout@v3 + with: + token: ${{ secrets.GH_BRIDGE_PAT }} + + - name: Fetch version + id: version + uses: SebRollen/toml-action@v1.0.2 + with: + file: 'pyproject.toml' + field: 'tool.poetry.version' + + - name: Setup QEMU + id: qemu + uses: docker/setup-qemu-action@v3 + + - name: Setup Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + id: login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + id: docker_build_push + uses: docker/build-push-action@v5 + with: + push: true + tags: | + dmri/neurodock:latest + dmri/neurodock:${{ steps.version.outputs.value }} + ghcr.io/muscbridge/PyDesigner:latest + ghcr.io/muscbridge/PyDesigner:${{ steps.version.outputs.value }} + + From 076bac9dc7324d18ad7df3a2a4de7eaace0e2a90 Mon Sep 17 00:00:00 2001 From: Siddhartha Dhiman Date: Wed, 30 Apr 2025 01:47:03 -0400 Subject: [PATCH 77/78] Update docs --- docs/source/installation/pydesigner.rst | 44 ------------------------- 1 file changed, 44 deletions(-) diff --git a/docs/source/installation/pydesigner.rst b/docs/source/installation/pydesigner.rst index 3a3df59..e991811 100644 --- a/docs/source/installation/pydesigner.rst +++ b/docs/source/installation/pydesigner.rst @@ -12,48 +12,4 @@ PyDesigner can be installed using the PyPI package manager using the command $ pip install PyDesigner-DWI -**Note**: - Remember to switch to your conda environement before parsing this - command. - That's it, you're done! - -Instructions on installing PyDesigner manually from the GitHub repository -are list below. - -Download --------- -You may clone the main `PyDesigner repository`_ for the latest build, -or download the build version of your choice from the `Releases tab`_. - -.. _PyDesigner repository: https://github.com/m-ama/PyDesigner -.. _Releases tab: https://github.com/m-ama/PyDesigner/releases - -To clone the PyDesigner repository, in terminal, run: - -.. code-block:: console - - $ git clone https://github.com/m-ama/PyDesigner.git - -Install -------- -PyDesigner can be automatically installed with all dependencies by -opening a CLI and changing directory to root PyDesigner directory, -followed by - -.. code-block:: console - - $ pip install . - -**Note**: - Remember to switch to your conda environement before parsing this - command. - -This will execute the :code:`setup.py` script in root directory to -automatically configure your Python environment for PyDesigner. When -running the automated methods, PyDesigner can simply be called with -the commad :code:`pydesigner`. - -**Note:** If you need a stable, tested and versioned build, download -the most recent release from the Release tab. Click on Source code -(zip) link and decompress (unzip) to any folder you desire. From 44649c86dc512d8ec437bb0bf93a868a5a92001b Mon Sep 17 00:00:00 2001 From: TheJaeger <13654344+TheJaeger@users.noreply.github.com> Date: Wed, 30 Apr 2025 05:47:46 +0000 Subject: [PATCH 78/78] Pre-commit autofix --- .github/workflows/publish.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9109a10..87c55ee 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -8,7 +8,7 @@ on: - "**" jobs: - + python: runs-on: ubuntu-latest steps: @@ -73,5 +73,3 @@ jobs: dmri/neurodock:${{ steps.version.outputs.value }} ghcr.io/muscbridge/PyDesigner:latest ghcr.io/muscbridge/PyDesigner:${{ steps.version.outputs.value }} - -