From cfa076189b592e16ec20444508f2f81762c58185 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 22:36:29 +0300 Subject: [PATCH 01/23] Worflow update --- .github/workflows/macos_test_cases.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index d3138ea..2db5c4a 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -14,9 +14,11 @@ jobs: pthon-version: '3.8' - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install . + conda create -n spare python=3.8 + conda activate spare + conda install pip + pip install spare_scores - name: Run unit tests run: | - cd tests/unit && python -m unittest discover -s . -p "*.py" \ No newline at end of file + cd tests/unit && python -m unittest discover -s . -p "*.py" From a7ed814d6c5090386b549c551fcd62cd65807cc9 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 22:37:31 +0300 Subject: [PATCH 02/23] Workflow update again --- .github/workflows/macos_test_cases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 2db5c4a..09d9966 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -14,6 +14,7 @@ jobs: pthon-version: '3.8' - name: Install dependencies run: | + brew install --cask miniconda conda create -n spare python=3.8 conda activate spare conda install pip From b1922ca8790b9c7caf37ba1121c5fc8b04458e7b Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 22:40:19 +0300 Subject: [PATCH 03/23] And again... --- .github/workflows/macos_test_cases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 09d9966..444bb4c 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -16,6 +16,7 @@ jobs: run: | brew install --cask miniconda conda create -n spare python=3.8 + conda init zsh conda activate spare conda install pip pip install spare_scores From 9fceaf89c59224a9bb71c706999687c3015301cd Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 22:41:58 +0300 Subject: [PATCH 04/23] Installed anaconda to be suer --- .github/workflows/macos_test_cases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 444bb4c..cc5db6a 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -15,6 +15,7 @@ jobs: - name: Install dependencies run: | brew install --cask miniconda + brew install --cask anaconda conda create -n spare python=3.8 conda init zsh conda activate spare From 5f645c546827ad35b6ba7dfcea4a484cb53cbe21 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 22:56:20 +0300 Subject: [PATCH 05/23] Updated workflow with correct conda env --- .github/workflows/macos_test_cases.yml | 27 ++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index cc5db6a..1721e79 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -5,23 +5,26 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: macos-latest + runs-on: "macos-latest" steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: pthon-version: '3.8' - - name: Install dependencies - run: | - brew install --cask miniconda - brew install --cask anaconda - conda create -n spare python=3.8 - conda init zsh - conda activate spare - conda install pip - pip install spare_scores - + - name: Set-up miniconda for macos + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: 3.8 + - name: Create conda env + run: conda create -n spare python=3.8 + - name: Activate conda env + run: echo "conda activate spare" >> $GITHUB_ENV + - name: Install pip + run: conda run -n spare conda install pip + - name: Install spare scores + run: conda run -n spare pip install spare_sores - name: Run unit tests run: | cd tests/unit && python -m unittest discover -s . -p "*.py" From c4c575785be6879d7b629816e4631e7bc50a1999 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 22:57:42 +0300 Subject: [PATCH 06/23] Added miniconda-version --- .github/workflows/macos_test_cases.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 1721e79..025b093 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -17,6 +17,7 @@ jobs: with: auto-update-conda: true python-version: 3.8 + miniconda-version: "latest" - name: Create conda env run: conda create -n spare python=3.8 - name: Activate conda env From dd51ad68cb2edfdb299ca4b720aab7f1bb0e5acf Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 23:00:35 +0300 Subject: [PATCH 07/23] Removed echo --- .github/workflows/macos_test_cases.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 025b093..48ec450 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -20,12 +20,10 @@ jobs: miniconda-version: "latest" - name: Create conda env run: conda create -n spare python=3.8 - - name: Activate conda env - run: echo "conda activate spare" >> $GITHUB_ENV - name: Install pip run: conda run -n spare conda install pip - name: Install spare scores - run: conda run -n spare pip install spare_sores + run: conda run -n spare pip install spare_scores - name: Run unit tests run: | cd tests/unit && python -m unittest discover -s . -p "*.py" From 228ec8765195c5d4c4e4550ff30c95f5fbb9d216 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 23:04:51 +0300 Subject: [PATCH 08/23] Added dependencies downloader just to be sure --- .github/workflows/macos_test_cases.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 48ec450..d27b4ef 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -24,6 +24,8 @@ jobs: run: conda run -n spare conda install pip - name: Install spare scores run: conda run -n spare pip install spare_scores + - name: Download dependencies + run: pip install . - name: Run unit tests run: | cd tests/unit && python -m unittest discover -s . -p "*.py" From eaa789a7ac51f6d59a6782ea7e4b4dafc1b5afd5 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 23:12:06 +0300 Subject: [PATCH 09/23] setuptools for some reason is not being downloaded --- .github/workflows/macos_test_cases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index d27b4ef..505c58e 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -25,7 +25,7 @@ jobs: - name: Install spare scores run: conda run -n spare pip install spare_scores - name: Download dependencies - run: pip install . + run: pip install setuptools && pip install . - name: Run unit tests run: | cd tests/unit && python -m unittest discover -s . -p "*.py" From 2e28bc5dc7923949369a1fb6f736eaffe24f018f Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 23:17:34 +0300 Subject: [PATCH 10/23] Lets check if it works on one workflow --- .github/workflows/macos_test_cases.yml | 4 ++-- .github/workflows/ubuntu_test_cases.yml | 23 ----------------------- 2 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 .github/workflows/ubuntu_test_cases.yml diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 505c58e..4da1d4c 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -5,14 +5,14 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: "macos-latest" + runs-on: ["ubuntu-latest", "macos-latest"] steps: - name: Checkout repository uses: actions/checkout@v3 with: pthon-version: '3.8' - - name: Set-up miniconda for macos + - name: Set-up miniconda for macos and ubuntu uses: conda-incubator/setup-miniconda@v2 with: auto-update-conda: true diff --git a/.github/workflows/ubuntu_test_cases.yml b/.github/workflows/ubuntu_test_cases.yml deleted file mode 100644 index 833cb84..0000000 --- a/.github/workflows/ubuntu_test_cases.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: spare_scores test cases on ubuntu - -# workflow dispatch has been added for testing purposes -on: [push, pull_request, workflow_dispatch] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - with: - python-version: '3.8' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install . - - - name: Run unit tests - run: | - cd tests/unit && python -m unittest discover -s . -p "*.py" \ No newline at end of file From 5ca53d91cfedf0597989856ecaf5969efaafa0d7 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 23:19:37 +0300 Subject: [PATCH 11/23] Added the same for ubuntu --- .github/workflows/ubuntu_test_cases.yml | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/workflows/ubuntu_test_cases.yml diff --git a/.github/workflows/ubuntu_test_cases.yml b/.github/workflows/ubuntu_test_cases.yml new file mode 100644 index 0000000..1d97616 --- /dev/null +++ b/.github/workflows/ubuntu_test_cases.yml @@ -0,0 +1,31 @@ +name: spare_scores test cases on ubuntu + +# workflow dispatch has been added for testing purposes +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: ["ubuntu-latest"] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + pthon-version: '3.8' + - name: Set-up miniconda for macos and ubuntu + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: 3.8 + miniconda-version: "latest" + - name: Create conda env + run: conda create -n spare python=3.8 + - name: Install pip + run: conda run -n spare conda install pip + - name: Install spare scores + run: conda run -n spare pip install spare_scores + - name: Download dependencies + run: pip install setuptools && pip install . + - name: Run unit tests + run: | + cd tests/unit && python -m unittest discover -s . -p "*.py" \ No newline at end of file From 439e292497580f33199cefe630f36e684a055527 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Tue, 9 Jul 2024 23:25:03 +0300 Subject: [PATCH 12/23] Resolved multiple os error --- .github/workflows/macos_test_cases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml index 4da1d4c..2bdbc22 100644 --- a/.github/workflows/macos_test_cases.yml +++ b/.github/workflows/macos_test_cases.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["ubuntu-latest", "macos-latest"] + runs-on: ["macos-latest"] steps: - name: Checkout repository From 76d3d9f6bfbf3659e18610218a27caad4c8ca1c3 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 14:12:09 +0300 Subject: [PATCH 13/23] Update spare_score to work for python 3.8 up to python 3.12 Now the package is updated for newer versions of python as well. Users can build spare and download it for python 3.8 up to 3.12. I added 2 workflows to run with python 3.12 seperately. This will not affect NiChart Workflows. --- .github/workflows/macos_test_cases.yml | 47 -------------- .github/workflows/macos_test_cases_p3-12.yml | 37 +++++++++++ .github/workflows/macos_test_cases_p3-8.yml | 36 +++++++++++ .github/workflows/sphinx-docs.yml | 27 ++++---- .github/workflows/ubuntu_test_cases.yml | 38 ------------ .github/workflows/ubuntu_test_cases_p3-12.yml | 33 ++++++++++ .github/workflows/ubuntu_test_cases_p3-8.yml | 36 +++++++++++ README.md | 58 ++++++++++-------- dev-dependencies.txt | 25 ++++---- setup.py | 2 +- .../mdl/mdl_SPARE_BA_hMUSE_single.pkl.gz | Bin 139886 -> 50 bytes tests/test_file | 0 tests/unit/test_util.py | 14 +---- 13 files changed, 205 insertions(+), 148 deletions(-) delete mode 100644 .github/workflows/macos_test_cases.yml create mode 100644 .github/workflows/macos_test_cases_p3-12.yml create mode 100644 .github/workflows/macos_test_cases_p3-8.yml delete mode 100644 .github/workflows/ubuntu_test_cases.yml create mode 100644 .github/workflows/ubuntu_test_cases_p3-12.yml create mode 100644 .github/workflows/ubuntu_test_cases_p3-8.yml delete mode 100644 tests/test_file diff --git a/.github/workflows/macos_test_cases.yml b/.github/workflows/macos_test_cases.yml deleted file mode 100644 index a8d6733..0000000 --- a/.github/workflows/macos_test_cases.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: spare_scores test cases on macos - -# workflow dispatch has been added for testing purposes -on: [push, pull_request, workflow_dispatch] - -jobs: - build: - runs-on: ["macos-13"] - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.8' - - name: Set-up miniconda for macos and ubuntu - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: 3.8 - miniconda-version: "latest" - - name: Create conda env - run: conda create -n spare python=3.8 - - name: Install pip - run: conda run -n spare conda install pip - - name: Install spare scores - run: | - pip install setuptools twine wheel - python setup.py bdist_wheel - cd dist - WHEEL_FILE=$(ls spare_scores*) - pip install "$WHEEL_FILE" - - name: Download dependencies - run: pip install setuptools && pip install . - - name: Run unit tests - run: | - cd tests/unit && python -m unittest discover -s . -p "*.py" - - name: Generate Coverage Report - run: | - pip install pytest-cov - cd tests/unit && pytest --cov=../../ --cov-report=xml - - name: Upload Coverage to Codecov - uses: codecov/codecov-action@v4.0.1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: CBICA/spare_score - - diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml new file mode 100644 index 0000000..1015a05 --- /dev/null +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -0,0 +1,37 @@ +name: spare_scores test cases on macos for python 3.12 + +# workflow dispatch has been added for testing purposes +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: ["macos-latest"] + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Set-up miniconda for macos and ubuntu + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: 3.12 + miniconda-version: "latest" + - name: Create conda env + run: conda create -n spare python=3.12 + - name: Install pip + run: conda run -n spare conda install pip + - name: Install spare scores + run: | + pip install setuptools twine wheel + python -m pip install . + - name: Generate Coverage Report + run: | + pip install pytest-cov + cd tests/unit && pytest --cov=../../ --cov-report=xml + - name: Upload Coverage to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: CBICA/spare_score diff --git a/.github/workflows/macos_test_cases_p3-8.yml b/.github/workflows/macos_test_cases_p3-8.yml new file mode 100644 index 0000000..3171dcf --- /dev/null +++ b/.github/workflows/macos_test_cases_p3-8.yml @@ -0,0 +1,36 @@ +name: spare_scores test cases on ubuntu for python 3.8 + +# workflow dispatch has been added for testing purposes +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: ["macos-latest"] + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.8" + - name: Set-up miniconda for macos and ubuntu + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: 3.8 + miniconda-version: "latest" + - name: Create conda env + run: conda create -n spare python=3.8 + - name: Install pip + run: conda run -n spare conda install pip + - name: Install spare scores + run: | + pip install setuptools twine wheel + python setup.py bdist_wheel + cd dist + WHEEL_FILE=$(ls spare_scores*) + pip install "$WHEEL_FILE" + - name: Download dependencies + run: pip install setuptools && pip install . + - name: Run unit tests + run: | + cd tests/unit && python -m unittest discover -s . -p "*.py" diff --git a/.github/workflows/sphinx-docs.yml b/.github/workflows/sphinx-docs.yml index 9fc8d6a..79d8139 100644 --- a/.github/workflows/sphinx-docs.yml +++ b/.github/workflows/sphinx-docs.yml @@ -2,7 +2,7 @@ name: Deploy static cntent to Pages on: push: branches: ["main"] - + jobs: build-docs: runs-on: ubuntu-latest @@ -10,10 +10,10 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.12' + python-version: "3.12" - name: Activate conda run: | - conda create -n spare python=3.8 + conda create -n spare python=3.12 conda run -n spare conda install pip conda run -n spare pip install spare_scores - name: Install dependencies @@ -29,30 +29,29 @@ jobs: - name: Upload pages artifact uses: actions/upload-pages-artifact@v3 - + with: path: docs/_build/html retention-days: 90 - + deploy-docs: if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} needs: build-docs - + permissions: pages: write id-token: write - + environment: name: github-pages url: ${{ steps.deployment.output.page_url }} - - concurrency: + + concurrency: group: "pages" cancel-in-progress: true - + runs-on: ubuntu-latest steps: - - name: Deploy artifact to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - + - name: Deploy artifact to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/ubuntu_test_cases.yml b/.github/workflows/ubuntu_test_cases.yml deleted file mode 100644 index 3a17143..0000000 --- a/.github/workflows/ubuntu_test_cases.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: spare_scores test cases on ubuntu - -# workflow dispatch has been added for testing purposes -on: [push, pull_request, workflow_dispatch] - -jobs: - build: - runs-on: ["ubuntu-latest"] - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.8' - - name: Set-up miniconda for macos and ubuntu - uses: conda-incubator/setup-miniconda@v2 - with: - auto-update-conda: true - python-version: 3.8 - miniconda-version: "latest" - - name: Create conda env - run: conda create -n spare python=3.8 - - name: Install pip - run: conda run -n spare conda install pip - - name: Install spare scores - run: | - pip install setuptools twine wheel - python setup.py bdist_wheel - cd dist - WHEEL_FILE=$(ls spare_scores*) - pip install "$WHEEL_FILE" - - name: Download dependencies - run: pip install setuptools && pip install . - - name: Run unit tests - run: | - cd tests/unit && python -m unittest discover -s . -p "*.py" - - diff --git a/.github/workflows/ubuntu_test_cases_p3-12.yml b/.github/workflows/ubuntu_test_cases_p3-12.yml new file mode 100644 index 0000000..8d71e56 --- /dev/null +++ b/.github/workflows/ubuntu_test_cases_p3-12.yml @@ -0,0 +1,33 @@ +name: spare_scores test cases on ubuntu for python 3.12 + +# workflow dispatch has been added for testing purposes +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: ["ubuntu-latest"] + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - name: Set-up miniconda for macos and ubuntu + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: 3.12 + miniconda-version: "latest" + - name: Create conda env + run: conda create -n spare python=3.12 + - name: Install pip + run: conda run -n spare conda install pip + - name: Install spare scores + run: | + pip install setuptools twine wheel + python -m pip install . + - name: Download dependencies + run: pip install setuptools && pip install . + - name: Run unit tests + run: | + cd tests/unit && python -m unittest discover -s . -p "*.py" diff --git a/.github/workflows/ubuntu_test_cases_p3-8.yml b/.github/workflows/ubuntu_test_cases_p3-8.yml new file mode 100644 index 0000000..552323c --- /dev/null +++ b/.github/workflows/ubuntu_test_cases_p3-8.yml @@ -0,0 +1,36 @@ +name: spare_scores test cases on ubuntu for python 3.8 + +# workflow dispatch has been added for testing purposes +on: [push, pull_request, workflow_dispatch] + +jobs: + build: + runs-on: ["ubuntu-latest"] + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.8" + - name: Set-up miniconda for macos and ubuntu + uses: conda-incubator/setup-miniconda@v2 + with: + auto-update-conda: true + python-version: 3.8 + miniconda-version: "latest" + - name: Create conda env + run: conda create -n spare python=3.8 + - name: Install pip + run: conda run -n spare conda install pip + - name: Install spare scores + run: | + pip install setuptools twine wheel + python setup.py bdist_wheel + cd dist + WHEEL_FILE=$(ls spare_scores*) + pip install "$WHEEL_FILE" + - name: Download dependencies + run: pip install setuptools && pip install . + - name: Run unit tests + run: | + cd tests/unit && python -m unittest discover -s . -p "*.py" diff --git a/README.md b/README.md index 54b90e5..f90c50a 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,13 @@ For detailed documentation, please see here: **[spare_scores](https://cbica.gith ## Installation +You can install the spare_score package for python 3.8 up to python 3.12 +Please open an issue if you find any bugs for the newer versions of spare_score + ### Conda environment using pip ```bash - conda create -n spare python=3.8 + conda create -n spare python=3.8 # (up to python=3.12) conda activate spare conda install pip pip install spare_scores @@ -29,61 +32,66 @@ For detailed documentation, please see here: **[spare_scores](https://cbica.gith pip install spare_scores ``` -### Conda environment from Github repository +### Manually build spare_score ```bash git clone https://github.com/CBICA/spare_score.git cd spare_score - pip install . + python -m pip install . # for python 3.12 + + # for python 3.8... + # python setup.py bdist_wheel + # cd dist && pip install "$The .wh file" + ``` ## Usage ```text -spare_scores v1.0.0. +spare_scores v1.2.1. SPARE model training & scores calculation required arguments: [ACTION] The action to be performed, either 'train' or 'test' [-a, --action] - [INPUT] The dataset to be used for training / testing. Can be + [INPUT] The dataset to be used for training / testing. Can be [-i, --input] a filepath string of a .csv file. - + optional arguments: - [OUTPUT] The filename for the model (as a .pkl.gz) to be saved - [-o, --output] at, if training. If testing, the filepath of the - resulting SPARE score dataframe (as a .csv file) to be + [OUTPUT] The filename for the model (as a .pkl.gz) to be saved + [-o, --output] at, if training. If testing, the filepath of the + resulting SPARE score dataframe (as a .csv file) to be saved. If not given, nothing will be saved. - [MODEL] The model to be used (only) for testing. Can be a + [MODEL] The model to be used (only) for testing. Can be a [-m, --model, filepath string of a .pkl.gz file. Required for testing --model_file] - [KEY_VAR] The key variable to be used for training. This could - [-kv, be a string of a column name that can uniquely - --key_var, identify a row of the dataset. - --identifier] For example (if a row_ID doesn't exist), it could be: + [KEY_VAR] The key variable to be used for training. This could + [-kv, be a string of a column name that can uniquely + --key_var, identify a row of the dataset. + --identifier] For example (if a row_ID doesn't exist), it could be: --key_var PTID - If not given, the first column of the dataset is + If not given, the first column of the dataset is considered the primary key of the dataset. Required for training. [DATA_VARS] The list of predictors to be used for training. List. [-dv, If not given, training will assume that all (apart from - --data_vars, the key variables) variables will be used as + --data_vars, the key variables) variables will be used as --predictors] predictors, with the ignore variables ignored. [IGNORE_VARS] The list of predictors to be ignored for training. Can - [-iv, be a list, or empty. + [-iv, be a list, or empty. --ignore_vars, - --ignore] + --ignore] [TARGET] The characteristic to be predicted in the course of the - [-t, training. String of the name of the column. Required + [-t, training. String of the name of the column. Required --target, for training. --to_predict] - [POS_GROUP] Group to assign a positive SPARE score (only for + [POS_GROUP] Group to assign a positive SPARE score (only for -pg, classification). String. Required for training. --pos_group] @@ -91,17 +99,17 @@ optional arguments: [-mt, 'SVM' or 'MLP'. Required for training. --model_type] - [KERNEL] The kernel for SVM training. 'linear' or 'rbf' (only + [KERNEL] The kernel for SVM training. 'linear' or 'rbf' (only -k, linear is supported currently in regression). --kernel] - [SPARE_VAR] The name of the column to be used for SPARE score. If + [SPARE_VAR] The name of the column to be used for SPARE score. If [-sv, not given, the column will be named 'SPARE_score'. --spare_var] [VERBOSE] Verbosity. Int. [-v, 0: Warnings - --verbose, 1: Info + --verbose, 1: Info --verbosity] 2: Debug 3: Errors 4: Critical @@ -110,8 +118,8 @@ optional arguments: [-l, printed out. --logs] - [VERSION] Display the version of the package. - [-V, --version] + [VERSION] Display the version of the package. + [-V, --version] [HELP] Show this help message and exit. [-h, --help] diff --git a/dev-dependencies.txt b/dev-dependencies.txt index 044635a..102886c 100644 --- a/dev-dependencies.txt +++ b/dev-dependencies.txt @@ -3,24 +3,24 @@ attrs==23.1.0 certifi==2023.5.7 charset-normalizer==3.1.0 click==8.1.3 -contourpy==1.1.0 +# contourpy==1.2.1 cycler==0.11.0 exceptiongroup==1.1.1 filelock==3.12.2 fonttools==4.40.0 -frozenlist==1.3.3 -grpcio==1.51.3 +frozenlist==1.4.1 +grpcio==1.65.4 idna==3.4 importlib-resources==5.12.0 iniconfig==2.0.0 joblib==1.3.1 jsonschema==4.17.3 kiwisolver==1.4.4 -matplotlib==3.7.1 +matplotlib==3.9.0 msgpack==1.0.5 numpy==1.26.4 packaging==23.1 -pandas==2.0.3 +pandas==2.2.0 Pillow==9.5.0 pkgutil_resolve_name==1.3.10 pluggy==1.5.0 @@ -30,17 +30,18 @@ pyrsistent==0.19.3 pytest==8.2.2 python-dateutil==2.8.2 pytz==2023.3 -PyYAML==6.0 -ray==2.5.1 +PyYAML==6.0.2 +ray==2.34.0 requests==2.31.0 -scikit-learn==0.24.2 -scipy==1.8.0 +scikit-learn==1.0.1 +scipy==1.14.0 six==1.16.0 threadpoolctl==3.1.0 tomli==2.0.1 -torch==2.3.1 -typing_extensions==4.7.0 +torch<=2.3.1 +torchvision==0.18.1 +typing_extensions==4.8.0 tzdata==2023.3 urllib3==2.0.3 zipp==3.15.0 -setuptools==59.8.0 +setuptools==69.2.0 diff --git a/setup.py b/setup.py index 776e1d9..e0f7596 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ "pandas", "setuptools", "scikit-learn", - "torch<2.3.1", + "torch<=2.3.1", "matplotlib", "optuna", ], diff --git a/spare_scores/mdl/mdl_SPARE_BA_hMUSE_single.pkl.gz b/spare_scores/mdl/mdl_SPARE_BA_hMUSE_single.pkl.gz index 525c16a1a325e584b7c1c7871cdff3aaf66776fc..dd378251ecc3b0ce65cf34b5f86dd63ca9f53d20 100644 GIT binary patch delta 29 ecmaENgu{qSzMF%?rE^aj)BlNLa$L*|FaQ9Bum*Dg literal 139886 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

n3xEQoSP_x}%LB1m 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 TxTxP>V|M!V_N6|D4gdQ;fyM-E diff --git a/tests/test_file b/tests/test_file deleted file mode 100644 index e69de29..0000000 diff --git a/tests/unit/test_util.py b/tests/unit/test_util.py index b3178f2..a5d326d 100644 --- a/tests/unit/test_util.py +++ b/tests/unit/test_util.py @@ -21,11 +21,9 @@ class CheckSpareScoresUtil(unittest.TestCase): def test_load_model(self): - self.model_fixture = "../fixture/sample_model.pkl.gz" - # Test case 1: No arguments given: - no_args = "load_model() missing 1 required positional " + "argument: 'mdl_path'" + self.model_fixture = load_model("../../tests/fixtures/sample_model.pkl.gz") - # Test case 2: Load a model + # Test case 1: Load a model filepath = ( Path(__file__).resolve().parent.parent / "fixtures" / "sample_model.pkl.gz" ) @@ -119,11 +117,6 @@ def test_is_unique_identifier(self): self.df_fixture = pd.DataFrame(data=df) self.assertFalse(is_unique_identifier(self.df_fixture, ["Var1", "Var2"])) - def test_load_model(self): - # test case 1: testing opening existing model - model = load_model("../../spare_scores/mdl/mdl_SPARE_BA_hMUSE_single.pkl.gz") - self.assertFalse(model is None) - def test_load_examples(self): # test case 1: testing loading example csv file_name = "example_data.csv" @@ -131,7 +124,7 @@ def test_load_examples(self): self.assertTrue(isinstance(result, pd.DataFrame)) # test case 2: testing loading model - file_name = "mdl_SPARE_BA_hMUSE_single.pkl.gz" + file_name = "../../spare_scores/mdl/mdl_SPARE_BA_hMUSE_single.pkl.gz" result = load_examples(file_name) self.assertFalse(result is None and isinstance(result, pd.DataFrame)) @@ -204,4 +197,3 @@ def test_add_file_extension(self): filename = "file.tar.gz" extension = ".gz" self.assertTrue(add_file_extension(filename, extension) == "file.tar.gz") - From eefb5892b33525a5328114289bd3fa3d8af2d8bc Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 15:04:25 +0300 Subject: [PATCH 14/23] Updated macos workflow versions to macos-13 --- .github/workflows/macos_test_cases_p3-12.yml | 2 +- .github/workflows/macos_test_cases_p3-8.yml | 4 ++-- tests/unit/test_spare_scores.py | 25 +++++++++----------- tests/unit/test_util.py | 1 - 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml index 1015a05..eadc8e6 100644 --- a/.github/workflows/macos_test_cases_p3-12.yml +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-latest"] + runs-on: ["macos-13"] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/macos_test_cases_p3-8.yml b/.github/workflows/macos_test_cases_p3-8.yml index 3171dcf..9aa360a 100644 --- a/.github/workflows/macos_test_cases_p3-8.yml +++ b/.github/workflows/macos_test_cases_p3-8.yml @@ -1,11 +1,11 @@ -name: spare_scores test cases on ubuntu for python 3.8 +name: spare_scores test cases on macos for python 3.8 # workflow dispatch has been added for testing purposes on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-latest"] + runs-on: ["macos-13"] steps: - uses: actions/checkout@v4 diff --git a/tests/unit/test_spare_scores.py b/tests/unit/test_spare_scores.py index af11d8b..bcbf974 100644 --- a/tests/unit/test_spare_scores.py +++ b/tests/unit/test_spare_scores.py @@ -10,14 +10,14 @@ class CheckMLPDataset(unittest.TestCase): def test_len(self): - # test case 1: testing length + # test case 1: testing length self.X = np.array([1, 2, 3, 4, 5, 6, 7, 8]) self.Y = np.array([1, 2, 3, 4, 5, 6, 7, 8]) self.Dataset = MLPDataset(self.X, self.Y) self.assertTrue(len(self.Dataset) == 8) - + def test_idx(self): - # test case 2: testing getter + # test case 2: testing getter self.X = np.array([1, 2, 3, 4, 5, 6, 7, 8]) self.Y = np.array([1, 2, 3, 4, 5, 6, 7, 8]) self.Dataset = MLPDataset(self.X, self.Y) @@ -69,7 +69,7 @@ def test_spare_test_SVM(self): ) self.assertTrue(result == ["ROI1"]) - def test_spare_train_MLP(self): + def test_spare_train_MLP(self): self.df_fixture = load_df("../fixtures/sample_data.csv") self.model_fixture = load_model("../fixtures/sample_model.pkl.gz") # Test case 1: Testing spare_train with MLP model @@ -99,8 +99,8 @@ def test_spare_train_MLP(self): set(metadata["predictors"]) == set(self.model_fixture[1]["predictors"]) ) self.assertTrue(metadata["to_predict"] == self.model_fixture[1]["to_predict"]) - - # test case 2: testing MLP regression model + + # test case 2: testing MLP regression model result = spare_train( self.df_fixture, "ROI1", @@ -116,7 +116,7 @@ def test_spare_train_MLP(self): "ROI9", "ROI10" ] - ) + ) status, result_data = result["status"], result["data"] metadata = result_data[1] self.assertTrue(status == "OK") @@ -156,7 +156,7 @@ def test_spare_train_MLPTorch(self): set(metadata["predictors"]) == set(self.model_fixture[1]["predictors"]) ) self.assertTrue(metadata["to_predict"] == self.model_fixture[1]["to_predict"]) - + # test case 2: testing MLPTorch regression model result = spare_train( self.df_fixture, @@ -173,7 +173,7 @@ def test_spare_train_MLPTorch(self): "ROI9", "ROI10", ] - ) + ) status, result_data = result["status"], result["data"] metadata = result_data[1] self.assertTrue(status == "OK") @@ -233,7 +233,7 @@ def test_spare_train_SVM(self): "ROI9", "ROI10" ] - ) + ) status, result_data = result["status"], result["data"] metadata = result_data[1] self.assertTrue(status == "OK") @@ -352,7 +352,7 @@ def test_spare_train_regression_error(self): self.assertTrue(result["status_code"] == 2) self.assertTrue(result["status"] == "Dataset check failed before training was initiated.") - + # Test case 2: testing with a too-small dataset data = { "Var1": [1,2,3,4,5], @@ -409,6 +409,3 @@ def test_spare_train_regression_error(self): ) self.assertTrue(result is not None) - - - diff --git a/tests/unit/test_util.py b/tests/unit/test_util.py index a5d326d..7512b3d 100644 --- a/tests/unit/test_util.py +++ b/tests/unit/test_util.py @@ -133,7 +133,6 @@ def test_load_examples(self): result = load_examples(file_name) self.assertTrue(result is None) - def test_convert_to_number_if_possible(self): # test case 1: valid convertion to integer num = "254" From b1f3d7adaf1b61db5cc918774c6fec433d5455f0 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 15:38:44 +0300 Subject: [PATCH 15/23] Changed numpy version --- dev-dependencies.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-dependencies.txt b/dev-dependencies.txt index 102886c..f3f9238 100644 --- a/dev-dependencies.txt +++ b/dev-dependencies.txt @@ -18,7 +18,7 @@ jsonschema==4.17.3 kiwisolver==1.4.4 matplotlib==3.9.0 msgpack==1.0.5 -numpy==1.26.4 +numpy==1.22.0 packaging==23.1 pandas==2.2.0 Pillow==9.5.0 From 03624dd77a2640fcfc7b2236ac9429e3d2bcf615 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 16:08:42 +0300 Subject: [PATCH 16/23] Changed torch version --- dev-dependencies.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-dependencies.txt b/dev-dependencies.txt index f3f9238..d12df9f 100644 --- a/dev-dependencies.txt +++ b/dev-dependencies.txt @@ -38,8 +38,8 @@ scipy==1.14.0 six==1.16.0 threadpoolctl==3.1.0 tomli==2.0.1 -torch<=2.3.1 -torchvision==0.18.1 +torch==2.2.0 +torchvision==0.17.1 typing_extensions==4.8.0 tzdata==2023.3 urllib3==2.0.3 From 82faf1e513a516f912265c23c18612c37d3d27f8 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 16:32:56 +0300 Subject: [PATCH 17/23] Changed to macos 14 for just 3.12 --- .github/workflows/macos_test_cases_p3-12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml index eadc8e6..f62d11d 100644 --- a/.github/workflows/macos_test_cases_p3-12.yml +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-13"] + runs-on: ["macos-14"] steps: - uses: actions/checkout@v4 From d4b9e8fc3056daeb8c86d881cf308a520c221998 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 16:41:15 +0300 Subject: [PATCH 18/23] Changed to macos 12 for just 3.12 --- .github/workflows/macos_test_cases_p3-12.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml index f62d11d..885a08c 100644 --- a/.github/workflows/macos_test_cases_p3-12.yml +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-14"] + runs-on: ["macos-12"] steps: - uses: actions/checkout@v4 From 9b02fa5c359f12badcb8d56b0a441507a0ddc176 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 20:45:45 +0300 Subject: [PATCH 19/23] Changed some deprecated stuff from scikit-learn --- .github/workflows/macos_test_cases_p3-12.yml | 2 +- spare_scores/mlp.py | 2 +- spare_scores/mlp_torch.py | 4 ++-- spare_scores/spare.py | 2 +- spare_scores/svm.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml index 885a08c..eadc8e6 100644 --- a/.github/workflows/macos_test_cases_p3-12.yml +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-12"] + runs-on: ["macos-13"] steps: - uses: actions/checkout@v4 diff --git a/spare_scores/mlp.py b/spare_scores/mlp.py index afb233a..50000a7 100644 --- a/spare_scores/mlp.py +++ b/spare_scores/mlp.py @@ -254,7 +254,7 @@ def get_stats(self, y: np.ndarray, y_hat: np.ndarray) -> None: else: self.stats["MAE"].append(metrics.mean_absolute_error(y, y_hat)) self.stats["RMSE"].append( - metrics.mean_squared_error(y, y_hat, squared=False) + metrics.root_mean_squared_error(y, y_hat) ) self.stats["R2"].append(metrics.r2_score(y, y_hat)) diff --git a/spare_scores/mlp_torch.py b/spare_scores/mlp_torch.py index b37a0ab..580e6a1 100644 --- a/spare_scores/mlp_torch.py +++ b/spare_scores/mlp_torch.py @@ -16,7 +16,7 @@ confusion_matrix, f1_score, mean_absolute_error, - mean_squared_error, + root_mean_squared_error, precision_score, r2_score, recall_score, @@ -282,7 +282,7 @@ def get_all_stats(self, y_hat: list, y: list, classification: bool = True) -> di else: res_dict = {} mae = mean_absolute_error(y, y_hat) - mrse = mean_squared_error(y, y_hat, squared=False) + mrse = root_mean_squared_error(y, y_hat) r2 = r2_score(y, y_hat) res_dict["MAE"] = mae res_dict["RMSE"] = mrse diff --git a/spare_scores/spare.py b/spare_scores/spare.py index ae5dcaa..2d051b8 100644 --- a/spare_scores/spare.py +++ b/spare_scores/spare.py @@ -221,7 +221,7 @@ def spare_test( spare_var: str = "SPARE_score", verbose: int = 1, logs: str = "", -) -> pd.DataFrame: +) -> dict: """ Applies a trained SPARE model on a test dataset diff --git a/spare_scores/svm.py b/spare_scores/svm.py index a3a7b30..ef9b020 100644 --- a/spare_scores/svm.py +++ b/spare_scores/svm.py @@ -342,7 +342,7 @@ def get_stats(self, y_test: np.ndarray, y_score: np.ndarray) -> None: else: self.stats["MAE"].append(metrics.mean_absolute_error(y_test, y_score)) self.stats["RMSE"].append( - metrics.mean_squared_error(y_test, y_score, squared=False) + metrics.root_mean_squared_error(y_test, y_score) ) self.stats["R2"].append(metrics.r2_score(y_test, y_score)) logging.debug( From d3efcabae41e2423423feec2b212b0f5e305fbc0 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 20:46:24 +0300 Subject: [PATCH 20/23] forgot to run pre-commit --- spare_scores/mlp.py | 4 +--- spare_scores/mlp_torch.py | 2 +- spare_scores/svm.py | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/spare_scores/mlp.py b/spare_scores/mlp.py index 50000a7..ade003e 100644 --- a/spare_scores/mlp.py +++ b/spare_scores/mlp.py @@ -253,9 +253,7 @@ def get_stats(self, y: np.ndarray, y_hat: np.ndarray) -> None: self.stats["F1"].append(2 * precision * recall / (precision + recall)) else: self.stats["MAE"].append(metrics.mean_absolute_error(y, y_hat)) - self.stats["RMSE"].append( - metrics.root_mean_squared_error(y, y_hat) - ) + self.stats["RMSE"].append(metrics.root_mean_squared_error(y, y_hat)) self.stats["R2"].append(metrics.r2_score(y, y_hat)) def output_stats(self) -> None: diff --git a/spare_scores/mlp_torch.py b/spare_scores/mlp_torch.py index 580e6a1..4401fda 100644 --- a/spare_scores/mlp_torch.py +++ b/spare_scores/mlp_torch.py @@ -16,12 +16,12 @@ confusion_matrix, f1_score, mean_absolute_error, - root_mean_squared_error, precision_score, r2_score, recall_score, roc_auc_score, roc_curve, + root_mean_squared_error, ) from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler diff --git a/spare_scores/svm.py b/spare_scores/svm.py index ef9b020..6874f10 100644 --- a/spare_scores/svm.py +++ b/spare_scores/svm.py @@ -341,9 +341,7 @@ def get_stats(self, y_test: np.ndarray, y_score: np.ndarray) -> None: self.stats["F1"].append(2 * precision * recall / (precision + recall)) else: self.stats["MAE"].append(metrics.mean_absolute_error(y_test, y_score)) - self.stats["RMSE"].append( - metrics.root_mean_squared_error(y_test, y_score) - ) + self.stats["RMSE"].append(metrics.root_mean_squared_error(y_test, y_score)) self.stats["R2"].append(metrics.r2_score(y_test, y_score)) logging.debug( " > " From e1084cae08bd23d9fdb75d00427f377e6b2a4eee Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 20:53:36 +0300 Subject: [PATCH 21/23] Revert "forgot to run pre-commit" This reverts commit d3efcabae41e2423423feec2b212b0f5e305fbc0. --- spare_scores/mlp.py | 4 +++- spare_scores/mlp_torch.py | 2 +- spare_scores/svm.py | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/spare_scores/mlp.py b/spare_scores/mlp.py index ade003e..50000a7 100644 --- a/spare_scores/mlp.py +++ b/spare_scores/mlp.py @@ -253,7 +253,9 @@ def get_stats(self, y: np.ndarray, y_hat: np.ndarray) -> None: self.stats["F1"].append(2 * precision * recall / (precision + recall)) else: self.stats["MAE"].append(metrics.mean_absolute_error(y, y_hat)) - self.stats["RMSE"].append(metrics.root_mean_squared_error(y, y_hat)) + self.stats["RMSE"].append( + metrics.root_mean_squared_error(y, y_hat) + ) self.stats["R2"].append(metrics.r2_score(y, y_hat)) def output_stats(self) -> None: diff --git a/spare_scores/mlp_torch.py b/spare_scores/mlp_torch.py index 4401fda..580e6a1 100644 --- a/spare_scores/mlp_torch.py +++ b/spare_scores/mlp_torch.py @@ -16,12 +16,12 @@ confusion_matrix, f1_score, mean_absolute_error, + root_mean_squared_error, precision_score, r2_score, recall_score, roc_auc_score, roc_curve, - root_mean_squared_error, ) from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler diff --git a/spare_scores/svm.py b/spare_scores/svm.py index 6874f10..ef9b020 100644 --- a/spare_scores/svm.py +++ b/spare_scores/svm.py @@ -341,7 +341,9 @@ def get_stats(self, y_test: np.ndarray, y_score: np.ndarray) -> None: self.stats["F1"].append(2 * precision * recall / (precision + recall)) else: self.stats["MAE"].append(metrics.mean_absolute_error(y_test, y_score)) - self.stats["RMSE"].append(metrics.root_mean_squared_error(y_test, y_score)) + self.stats["RMSE"].append( + metrics.root_mean_squared_error(y_test, y_score) + ) self.stats["R2"].append(metrics.r2_score(y_test, y_score)) logging.debug( " > " From de66a0a4c7d222c515e6986252ed40871de3cf33 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 20:53:42 +0300 Subject: [PATCH 22/23] Revert "Changed some deprecated stuff from scikit-learn" This reverts commit 9b02fa5c359f12badcb8d56b0a441507a0ddc176. --- .github/workflows/macos_test_cases_p3-12.yml | 2 +- spare_scores/mlp.py | 2 +- spare_scores/mlp_torch.py | 4 ++-- spare_scores/spare.py | 2 +- spare_scores/svm.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml index eadc8e6..885a08c 100644 --- a/.github/workflows/macos_test_cases_p3-12.yml +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-13"] + runs-on: ["macos-12"] steps: - uses: actions/checkout@v4 diff --git a/spare_scores/mlp.py b/spare_scores/mlp.py index 50000a7..afb233a 100644 --- a/spare_scores/mlp.py +++ b/spare_scores/mlp.py @@ -254,7 +254,7 @@ def get_stats(self, y: np.ndarray, y_hat: np.ndarray) -> None: else: self.stats["MAE"].append(metrics.mean_absolute_error(y, y_hat)) self.stats["RMSE"].append( - metrics.root_mean_squared_error(y, y_hat) + metrics.mean_squared_error(y, y_hat, squared=False) ) self.stats["R2"].append(metrics.r2_score(y, y_hat)) diff --git a/spare_scores/mlp_torch.py b/spare_scores/mlp_torch.py index 580e6a1..b37a0ab 100644 --- a/spare_scores/mlp_torch.py +++ b/spare_scores/mlp_torch.py @@ -16,7 +16,7 @@ confusion_matrix, f1_score, mean_absolute_error, - root_mean_squared_error, + mean_squared_error, precision_score, r2_score, recall_score, @@ -282,7 +282,7 @@ def get_all_stats(self, y_hat: list, y: list, classification: bool = True) -> di else: res_dict = {} mae = mean_absolute_error(y, y_hat) - mrse = root_mean_squared_error(y, y_hat) + mrse = mean_squared_error(y, y_hat, squared=False) r2 = r2_score(y, y_hat) res_dict["MAE"] = mae res_dict["RMSE"] = mrse diff --git a/spare_scores/spare.py b/spare_scores/spare.py index 2d051b8..ae5dcaa 100644 --- a/spare_scores/spare.py +++ b/spare_scores/spare.py @@ -221,7 +221,7 @@ def spare_test( spare_var: str = "SPARE_score", verbose: int = 1, logs: str = "", -) -> dict: +) -> pd.DataFrame: """ Applies a trained SPARE model on a test dataset diff --git a/spare_scores/svm.py b/spare_scores/svm.py index ef9b020..a3a7b30 100644 --- a/spare_scores/svm.py +++ b/spare_scores/svm.py @@ -342,7 +342,7 @@ def get_stats(self, y_test: np.ndarray, y_score: np.ndarray) -> None: else: self.stats["MAE"].append(metrics.mean_absolute_error(y_test, y_score)) self.stats["RMSE"].append( - metrics.root_mean_squared_error(y_test, y_score) + metrics.mean_squared_error(y_test, y_score, squared=False) ) self.stats["R2"].append(metrics.r2_score(y_test, y_score)) logging.debug( From 037aeeb21726119519de395bae58ecb7b364e42c Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Wed, 14 Aug 2024 21:51:54 +0300 Subject: [PATCH 23/23] Made macos 3.8 report to coverage instead of 3.12 --- .github/workflows/macos_test_cases_p3-12.yml | 12 +++--------- .github/workflows/macos_test_cases_p3-8.yml | 10 ++++++++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/macos_test_cases_p3-12.yml b/.github/workflows/macos_test_cases_p3-12.yml index 885a08c..b9c42d4 100644 --- a/.github/workflows/macos_test_cases_p3-12.yml +++ b/.github/workflows/macos_test_cases_p3-12.yml @@ -5,7 +5,7 @@ on: [push, pull_request, workflow_dispatch] jobs: build: - runs-on: ["macos-12"] + runs-on: ["macos-13"] steps: - uses: actions/checkout@v4 @@ -26,12 +26,6 @@ jobs: run: | pip install setuptools twine wheel python -m pip install . - - name: Generate Coverage Report + - name: Run unit tests run: | - pip install pytest-cov - cd tests/unit && pytest --cov=../../ --cov-report=xml - - name: Upload Coverage to Codecov - uses: codecov/codecov-action@v4.0.1 - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: CBICA/spare_score + cd tests/unit && python -m unittest discover -s . -p "*.py" diff --git a/.github/workflows/macos_test_cases_p3-8.yml b/.github/workflows/macos_test_cases_p3-8.yml index 9aa360a..7c91627 100644 --- a/.github/workflows/macos_test_cases_p3-8.yml +++ b/.github/workflows/macos_test_cases_p3-8.yml @@ -31,6 +31,12 @@ jobs: pip install "$WHEEL_FILE" - name: Download dependencies run: pip install setuptools && pip install . - - name: Run unit tests + - name: Generate Coverage Report run: | - cd tests/unit && python -m unittest discover -s . -p "*.py" + pip install pytest-cov + cd tests/unit && pytest --cov=../../ --cov-report=xml + - name: Upload Coverage to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: CBICA/spare_score