From d494ccead5b201dbde69af3aeadb5f06e3c98f7b Mon Sep 17 00:00:00 2001 From: DSilva27 Date: Tue, 16 Jul 2024 15:35:14 -0400 Subject: [PATCH 01/11] implement memory friendly loader for svd pipeline --- .../_commands/run_preprocessing.py | 2 +- .../data/_dataloaders/gt_dataloader.py | 21 +++++++++++++++ .../_dataloaders/preproc_dataloader.py} | 1 + src/cryo_challenge/data/_io/svd_io_utils.py | 27 +++++++++++++------ .../data/_validation/config_validators.py | 6 ++--- tests/config_files/test_config_svd.yaml | 2 +- 6 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 src/cryo_challenge/data/_dataloaders/gt_dataloader.py rename src/cryo_challenge/{_preprocessing/dataloader.py => data/_dataloaders/preproc_dataloader.py} (99%) diff --git a/src/cryo_challenge/_commands/run_preprocessing.py b/src/cryo_challenge/_commands/run_preprocessing.py index aa743ad..7a7a141 100644 --- a/src/cryo_challenge/_commands/run_preprocessing.py +++ b/src/cryo_challenge/_commands/run_preprocessing.py @@ -5,7 +5,7 @@ from ..data._validation.config_validators import validate_config_preprocessing from .._preprocessing.preprocessing_pipeline import preprocess_submissions -from .._preprocessing.dataloader import SubmissionPreprocessingDataLoader +from ..data._dataloaders.preproc_dataloader import SubmissionPreprocessingDataLoader def add_args(parser): diff --git a/src/cryo_challenge/data/_dataloaders/gt_dataloader.py b/src/cryo_challenge/data/_dataloaders/gt_dataloader.py new file mode 100644 index 0000000..b7bfe87 --- /dev/null +++ b/src/cryo_challenge/data/_dataloaders/gt_dataloader.py @@ -0,0 +1,21 @@ +import numpy as np +import torch +from torch.utils.data import Dataset + + +class GT_Dataset(Dataset): + def __init__(self, npy_file): + self.npy_file = npy_file + self.data = np.load(npy_file, mmap_mode="r") + + self.shape = self.data.shape + self._dim = len(self.data.shape) + + def dim(self): + return self._dim + + def __getitem__(self, idx): + if torch.is_tensor(idx): + idx = idx.tolist() + sample = self.data[idx] + return torch.from_numpy(sample.copy()) diff --git a/src/cryo_challenge/_preprocessing/dataloader.py b/src/cryo_challenge/data/_dataloaders/preproc_dataloader.py similarity index 99% rename from src/cryo_challenge/_preprocessing/dataloader.py rename to src/cryo_challenge/data/_dataloaders/preproc_dataloader.py index 2593c2a..ea7debd 100644 --- a/src/cryo_challenge/_preprocessing/dataloader.py +++ b/src/cryo_challenge/data/_dataloaders/preproc_dataloader.py @@ -151,6 +151,7 @@ def __getitem__(self, idx): glob.glob(os.path.join(self.submission_paths[idx], "*.mrc")) ) vol_paths = [vol_path for vol_path in vol_paths if "mask" not in vol_path] + vol_paths = vol_paths[:3] assert len(vol_paths) > 0, "No volumes found in submission directory" diff --git a/src/cryo_challenge/data/_io/svd_io_utils.py b/src/cryo_challenge/data/_io/svd_io_utils.py index f194c14..404e66a 100644 --- a/src/cryo_challenge/data/_io/svd_io_utils.py +++ b/src/cryo_challenge/data/_io/svd_io_utils.py @@ -2,6 +2,7 @@ from typing import Tuple from ..._preprocessing.fourier_utils import downsample_volume +from ...data._dataloaders.gt_dataloader import GT_Dataset def load_volumes( @@ -84,7 +85,7 @@ def load_ref_vols(box_size_ds: int, path_to_volumes: str, dtype=torch.float32): box_size_ds: int Size of the downsampled box. path_to_volumes: str - Path to the file containing the reference volumes. Must be in PyTorch format. + Path to the file containing the reference volumes. Must be in Numpy format. dtype: torch.dtype Data type of the volumes. @@ -100,26 +101,36 @@ def load_ref_vols(box_size_ds: int, path_to_volumes: str, dtype=torch.float32): >>> volumes_ds = load_ref_vols(box_size_ds, path_to_volumes) """ # noqa: E501 try: - volumes = torch.load(path_to_volumes) + volumes = GT_Dataset(path_to_volumes) except (FileNotFoundError, EOFError): raise ValueError("Volumes not found or not in PyTorch format.") # Reshape volumes to correct size if volumes.dim() == 2: - box_size = int(round((float(volumes.shape[-1]) ** (1. / 3.)))) - volumes = torch.reshape(volumes, (-1, box_size, box_size, box_size)) + box_size = int(round((float(volumes.shape[-1]) ** (1.0 / 3.0)))) + reshape = True + elif volumes.dim() == 4: pass else: - raise ValueError(f"The shape of the volumes stored in {path_to_volumes} have the unexpected shape " - f"{torch.shape}. Please, review the file and regenerate it so that volumes stored hasve the " - f"shape (num_vols, box_size ** 3) or (num_vols, box_size, box_size, box_size).") + raise ValueError( + f"The shape of the volumes stored in {path_to_volumes} have the unexpected shape " + f"Please, review the file and regenerate it so that volumes stored have " + f"shape (num_vols, box_size ** 3) or (num_vols, box_size, box_size, box_size)." + ) volumes_ds = torch.empty( (volumes.shape[0], box_size_ds, box_size_ds, box_size_ds), dtype=dtype ) for i, vol in enumerate(volumes): - volumes_ds[i] = downsample_volume(vol, box_size_ds) + if reshape: + volumes_ds[i] = downsample_volume( + vol.reshape(box_size, box_size, box_size), box_size_ds + ) + + else: + volumes_ds[i] = downsample_volume(vol, box_size_ds) + volumes_ds[i] = volumes_ds[i] / volumes_ds[i].sum() mean_volume = volumes_ds.mean(dim=0) diff --git a/src/cryo_challenge/data/_validation/config_validators.py b/src/cryo_challenge/data/_validation/config_validators.py index 93316a0..d2a61eb 100644 --- a/src/cryo_challenge/data/_validation/config_validators.py +++ b/src/cryo_challenge/data/_validation/config_validators.py @@ -1,7 +1,7 @@ from numbers import Number import pandas as pd import os -from typing import List + def validate_generic_config(config: dict, reference: dict) -> None: """ @@ -291,8 +291,8 @@ def validate_config_svd(config: dict) -> None: assert isinstance(config["path_to_reference"], str) os.path.exists(config["path_to_reference"]) assert ( - "pt" in config["path_to_reference"] - ), "Reference path point to a .pt file" + "npy" in config["path_to_reference"] + ), "Reference path point to a .npy file" os.path.exists(config["path_to_volumes"]) for submission in config["submission_list"]: diff --git a/tests/config_files/test_config_svd.yaml b/tests/config_files/test_config_svd.yaml index c392525..3d30723 100644 --- a/tests/config_files/test_config_svd.yaml +++ b/tests/config_files/test_config_svd.yaml @@ -3,7 +3,7 @@ box_size_ds: 32 submission_list: [0] experiment_mode: "all_vs_ref" # options are "all_vs_all", "all_vs_ref" # optional unless experiment_mode is "all_vs_ref" -path_to_reference: tests/data/Ground_truth/test_maps_gt_flat_10.pt +path_to_reference: tests/data/Ground_truth/test_maps_gt_flat_10.npy dtype: "float32" # options are "float32", "float64" output_options: # path will be created if it does not exist From 5a51663fdd47ea6f53f2cd02590efa57d31f6186 Mon Sep 17 00:00:00 2001 From: DSilva27 Date: Wed, 17 Jul 2024 11:36:53 -0400 Subject: [PATCH 02/11] implement subset of volumes used for svd --- config_files/config_svd.yaml | 7 +++- src/cryo_challenge/_svd/svd_pipeline.py | 3 +- src/cryo_challenge/data/_io/svd_io_utils.py | 38 +++++++++++++------ .../data/_validation/config_validators.py | 26 +++++++++---- tests/config_files/test_config_svd.yaml | 4 +- 5 files changed, 55 insertions(+), 23 deletions(-) diff --git a/config_files/config_svd.yaml b/config_files/config_svd.yaml index 327812e..799b75b 100644 --- a/config_files/config_svd.yaml +++ b/config_files/config_svd.yaml @@ -2,8 +2,13 @@ path_to_volumes: /path/to/volumes box_size_ds: 32 submission_list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] experiment_mode: "all_vs_ref" # options are "all_vs_all", "all_vs_ref" + # optional unless experiment_mode is "all_vs_ref" -path_to_reference: /path/to/reference +reference_options: + path_to_reference: /path/to/reference + n_volumes: 300 # optional, default is all volumes + random_subset: False # if False, the subset is chosen as volumes[::skip_vols, ...] to satisfy n_volumes + dtype: "float32" # options are "float32", "float64" output_options: # path will be created if it does not exist diff --git a/src/cryo_challenge/_svd/svd_pipeline.py b/src/cryo_challenge/_svd/svd_pipeline.py index 08ffa59..eecf5d3 100644 --- a/src/cryo_challenge/_svd/svd_pipeline.py +++ b/src/cryo_challenge/_svd/svd_pipeline.py @@ -179,8 +179,7 @@ def run_all_vs_ref_pipeline(config: dict): dtype = torch.float32 if config["dtype"] == "float32" else torch.float64 ref_volumes, mean_volume = load_ref_vols( - box_size_ds=config["box_size_ds"], - path_to_volumes=config["path_to_reference"], + config, dtype=dtype, ) diff --git a/src/cryo_challenge/data/_io/svd_io_utils.py b/src/cryo_challenge/data/_io/svd_io_utils.py index 404e66a..8e331ad 100644 --- a/src/cryo_challenge/data/_io/svd_io_utils.py +++ b/src/cryo_challenge/data/_io/svd_io_utils.py @@ -76,16 +76,14 @@ def load_volumes( return volumes, mean_volumes, metadata -def load_ref_vols(box_size_ds: int, path_to_volumes: str, dtype=torch.float32): +def load_ref_vols(config: dict, dtype=torch.float32): """ Load the reference volumes, downsample them, normalize them, and remove the mean volume. Parameters ---------- - box_size_ds: int - Size of the downsampled box. - path_to_volumes: str - Path to the file containing the reference volumes. Must be in Numpy format. + config: dict, + Dictionary containing the configuration parameters. dtype: torch.dtype Data type of the volumes. @@ -100,10 +98,27 @@ def load_ref_vols(box_size_ds: int, path_to_volumes: str, dtype=torch.float32): >>> path_to_volumes = "/path/to/volumes.pt" >>> volumes_ds = load_ref_vols(box_size_ds, path_to_volumes) """ # noqa: E501 - try: - volumes = GT_Dataset(path_to_volumes) - except (FileNotFoundError, EOFError): - raise ValueError("Volumes not found or not in PyTorch format.") + + path_to_volumes = config["reference_options"]["path_to_reference"] + box_size_ds = config["box_size_ds"] + + volumes = GT_Dataset(path_to_volumes) + + if config["reference_options"]["n_volumes"] is None: + n_vols = volumes.shape[0] + vol_skip = 1 + random_subset = False + + else: + n_vols = config["reference_options"]["n_volumes"] + vol_skip = volumes.shape[0] // n_vols + random_subset = config["reference_options"]["random_subset"] + + if random_subset: + indices = torch.randperm(volumes.shape[0])[:n_vols] + + else: + indices = torch.arange(0, n_vols) * vol_skip # Reshape volumes to correct size if volumes.dim() == 2: @@ -120,9 +135,10 @@ def load_ref_vols(box_size_ds: int, path_to_volumes: str, dtype=torch.float32): ) volumes_ds = torch.empty( - (volumes.shape[0], box_size_ds, box_size_ds, box_size_ds), dtype=dtype + (n_vols, box_size_ds, box_size_ds, box_size_ds), dtype=dtype ) - for i, vol in enumerate(volumes): + for i, idx in enumerate(indices): + vol = volumes[idx] if reshape: volumes_ds[i] = downsample_volume( vol.reshape(box_size, box_size, box_size), box_size_ds diff --git a/src/cryo_challenge/data/_validation/config_validators.py b/src/cryo_challenge/data/_validation/config_validators.py index d2a61eb..2cdf790 100644 --- a/src/cryo_challenge/data/_validation/config_validators.py +++ b/src/cryo_challenge/data/_validation/config_validators.py @@ -282,17 +282,27 @@ def validate_config_svd(config: dict) -> None: validate_config_svd_output(config["output_options"]) if config["experiment_mode"] == "all_vs_ref": - if "path_to_reference" not in config.keys(): + if "reference_options" not in config.keys(): raise ValueError( - "Reference path is required for experiment mode 'all_vs_ref'" + "Reference options are required for experiment mode 'all_vs_ref'" ) - else: - assert isinstance(config["path_to_reference"], str) - os.path.exists(config["path_to_reference"]) - assert ( - "npy" in config["path_to_reference"] - ), "Reference path point to a .npy file" + keys_and_types_ref = { + "path_to_reference": str, + } + validate_generic_config(config["reference_options"], keys_and_types_ref) + + assert isinstance(config["reference_options"]["path_to_reference"], str) + os.path.exists(config["reference_options"]["path_to_reference"]) + assert ( + "npy" in config["reference_options"]["path_to_reference"] + ), "Reference path point to a .npy file" + + if "n_volumes" not in config["reference_options"].keys(): + config["reference_options"]["n_volumes"] = None + + if "random_subset" not in config["reference_options"].keys(): + config["reference_options"]["random_subset"] = False os.path.exists(config["path_to_volumes"]) for submission in config["submission_list"]: diff --git a/tests/config_files/test_config_svd.yaml b/tests/config_files/test_config_svd.yaml index 3d30723..e3e3115 100644 --- a/tests/config_files/test_config_svd.yaml +++ b/tests/config_files/test_config_svd.yaml @@ -3,7 +3,9 @@ box_size_ds: 32 submission_list: [0] experiment_mode: "all_vs_ref" # options are "all_vs_all", "all_vs_ref" # optional unless experiment_mode is "all_vs_ref" -path_to_reference: tests/data/Ground_truth/test_maps_gt_flat_10.npy +reference_options: + path_to_reference: tests/data/Ground_truth/test_maps_gt_flat_10.npy + dtype: "float32" # options are "float32", "float64" output_options: # path will be created if it does not exist From 49c0b00fb797733f17efeb8a6e6fe184ab771923 Mon Sep 17 00:00:00 2001 From: DSilva27 Date: Wed, 17 Jul 2024 11:46:40 -0400 Subject: [PATCH 03/11] update config file to reproduce presentation plots --- config_files/config_svd.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config_files/config_svd.yaml b/config_files/config_svd.yaml index 799b75b..9bbade2 100644 --- a/config_files/config_svd.yaml +++ b/config_files/config_svd.yaml @@ -1,12 +1,12 @@ path_to_volumes: /path/to/volumes -box_size_ds: 32 +box_size_ds: 128 submission_list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] experiment_mode: "all_vs_ref" # options are "all_vs_all", "all_vs_ref" # optional unless experiment_mode is "all_vs_ref" reference_options: path_to_reference: /path/to/reference - n_volumes: 300 # optional, default is all volumes + n_volumes: 338 # optional, default is all volumes random_subset: False # if False, the subset is chosen as volumes[::skip_vols, ...] to satisfy n_volumes dtype: "float32" # options are "float32", "float64" @@ -14,6 +14,6 @@ output_options: # path will be created if it does not exist output_path: /path/to/output # whether or not to save the processed volumes (downsampled, normalized, etc.) - save_volumes: True + save_volumes: False # whether or not to save the SVD matrices (U, S, V) - save_svd_matrices: True + save_svd_matrices: False From 4804865d47960a9ed1d73ac4f99d00e2f1dac964 Mon Sep 17 00:00:00 2001 From: DSilva27 Date: Wed, 17 Jul 2024 11:49:40 -0400 Subject: [PATCH 04/11] update tutorial --- tutorials/2_tutorial_svd.ipynb | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/tutorials/2_tutorial_svd.ipynb b/tutorials/2_tutorial_svd.ipynb index b41bfba..f42e334 100644 --- a/tutorials/2_tutorial_svd.ipynb +++ b/tutorials/2_tutorial_svd.ipynb @@ -62,7 +62,7 @@ "# Select path to SVD config file\n", "# An example of this file is available in the path ../config_files/config_svd.yaml\n", "config_svd_path = FileChooser(os.path.expanduser(\"~\"))\n", - "config_svd_path.filter_pattern = '*.yaml'\n", + "config_svd_path.filter_pattern = \"*.yaml\"\n", "display(config_svd_path)" ] }, @@ -93,11 +93,22 @@ "Here is a brief explanation of each key\n", "\n", "* path_to_volumes (str): this is the path to your submissions (the result of running the preprocessing). They should be called submission_0.pt, submission_1.pt, ...\n", + "\n", "* box_size_ds (int): you can choose to downsample the volumes to speed up the analysis, or to get rid of high frequency features.\n", + "\n", "* submission_list (List): here you can choose which submissions are used for the analysis. If you want to use submissions 0, 3, 6; then this should be [0, 3, 6]\n", + "\n", "* experiment_mode (str): the options are \"all_vs_all\", \"all_vs_ref\". If you are using ref, then SVD is computed from the refence volumes and the rest of the volumes are projected to it. Otherwise, all volumes are used to do the projection\n", - "* path_to_reference (str): path to the reference volumes (only needed if mode is \"all_vs_ref\")\n", + "\n", + "* reference_options (dict)\n", + " * path_to_reference (str): path to the reference volumes (only needed if mode is \"all_vs_ref\")\n", + " * n_volumes (int): number of volumes to use for analysis\n", + " * random_subset (bool): whether to use a random subset or not\n", + "\n", + " If you set `random_set = True`, then SVD will be run with randomly chosen n_volumes Volumes. Otherwise, the volumes are chosen as `skip_vols = total_volumes // n_volumes` and something equivalent to `volumes[::skip_vols, ...]`\n", + "\n", "* dtype (str): can be float32 or float64\n", + "\n", "* output_options (dict): dictionary with options to personalize the output\n", " * output_path (str): where the volumes will be saved\n", " * save_volumes (bool): whether or not to save the volumes used (this will save the normalized, downsampled, and mean-removed volumes)\n", @@ -125,7 +136,7 @@ "source": [ "# Select path to SVD results\n", "svd_results_path = FileChooser(os.path.expanduser(\"~\"))\n", - "svd_results_path.filter_pattern = '*.pt'\n", + "svd_results_path.filter_pattern = \"*.pt\"\n", "display(svd_results_path)" ] }, @@ -316,7 +327,7 @@ "source": [ "# Select path to SVD results\n", "svd_all_vs_all_results_path = FileChooser(os.path.expanduser(\"~\"))\n", - "svd_all_vs_all_results_path.filter_pattern = '*.pt'\n", + "svd_all_vs_all_results_path.filter_pattern = \"*.pt\"\n", "display(svd_all_vs_all_results_path)" ] }, @@ -425,9 +436,9 @@ ], "metadata": { "kernelspec": { - "display_name": "gpucryonerf", + "display_name": "cryo-challenge-kernel", "language": "python", - "name": "python3" + "name": "cryo-challenge-kernel" }, "language_info": { "codemirror_mode": { @@ -439,7 +450,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.17" + "version": "3.10.10" } }, "nbformat": 4, From 531d3e6841974020e282fc95bb9cc41747cd378c Mon Sep 17 00:00:00 2001 From: DSilva27 Date: Wed, 17 Jul 2024 13:31:16 -0400 Subject: [PATCH 05/11] update config for svd to make it obvious that reference files should be npy --- config_files/config_svd.yaml | 2 +- tutorials/2_tutorial_svd.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config_files/config_svd.yaml b/config_files/config_svd.yaml index 9bbade2..e449c2c 100644 --- a/config_files/config_svd.yaml +++ b/config_files/config_svd.yaml @@ -5,7 +5,7 @@ experiment_mode: "all_vs_ref" # options are "all_vs_all", "all_vs_ref" # optional unless experiment_mode is "all_vs_ref" reference_options: - path_to_reference: /path/to/reference + path_to_reference: /path/to/reference/gt_maps.npy n_volumes: 338 # optional, default is all volumes random_subset: False # if False, the subset is chosen as volumes[::skip_vols, ...] to satisfy n_volumes diff --git a/tutorials/2_tutorial_svd.ipynb b/tutorials/2_tutorial_svd.ipynb index f42e334..d047dcc 100644 --- a/tutorials/2_tutorial_svd.ipynb +++ b/tutorials/2_tutorial_svd.ipynb @@ -101,7 +101,7 @@ "* experiment_mode (str): the options are \"all_vs_all\", \"all_vs_ref\". If you are using ref, then SVD is computed from the refence volumes and the rest of the volumes are projected to it. Otherwise, all volumes are used to do the projection\n", "\n", "* reference_options (dict)\n", - " * path_to_reference (str): path to the reference volumes (only needed if mode is \"all_vs_ref\")\n", + " * path_to_reference (str): path to the reference volumes (only needed if mode is \"all_vs_ref\"). Should be a .npy file that contains all the reference volumes, e.g., maps_flat.npy.\n", " * n_volumes (int): number of volumes to use for analysis\n", " * random_subset (bool): whether to use a random subset or not\n", "\n", From 2b6564299d7388d819884ff8a5af964f7a142ef0 Mon Sep 17 00:00:00 2001 From: Geoffrey Woollard Date: Mon, 5 Aug 2024 09:11:35 -0400 Subject: [PATCH 06/11] download numpy from osf --- tests/scripts/fetch_test_data.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/scripts/fetch_test_data.sh b/tests/scripts/fetch_test_data.sh index c252871..41404e8 100644 --- a/tests/scripts/fetch_test_data.sh +++ b/tests/scripts/fetch_test_data.sh @@ -3,6 +3,7 @@ wget https://files.osf.io/v1/resources/8h6fz/providers/dropbox/tests/dataset_2_s ADIR=$(pwd) ln -s $ADIR/tests/data/dataset_2_submissions/test_submission_0_n8.pt $ADIR/tests/data/dataset_2_submissions/submission_0.pt # symlink for svd which needs submission_0.pt for filename wget https://files.osf.io/v1/resources/8h6fz/providers/dropbox/tests/Ground_truth/test_maps_gt_flat_10.pt?download=true -O tests/data/Ground_truth/test_maps_gt_flat_10.pt +wget https://files.osf.io/v1/resources/8h6fz/providers/dropbox/tests/Ground_truth/test_maps_gt_flat_10.npy?download=true -O tests/data/Ground_truth/test_maps_gt_flat_10.npy wget https://files.osf.io/v1/resources/8h6fz/providers/dropbox/tests/Ground_truth/test_metadata_10.csv?download=true -O tests/data/Ground_truth/test_metadata_10.csv wget https://files.osf.io/v1/resources/8h6fz/providers/dropbox/tests/Ground_truth/1.mrc?download=true -O tests/data/Ground_truth/1.mrc wget https://files.osf.io/v1/resources/8h6fz/providers/dropbox/Ground_truth/mask_dilated_wide_224x224.mrc?download=true -O tests/data/Ground_truth/mask_dilated_wide_224x224.mrc From d928dcd32c89425456a37771343a8a4645ab0de0 Mon Sep 17 00:00:00 2001 From: Geoffrey Woollard Date: Mon, 5 Aug 2024 09:30:45 -0400 Subject: [PATCH 07/11] only python 3.8 --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index f8a40f2..78acef0 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.8"] steps: From 4b99ef014a6d47e8043b73e0f0d2ce115cd01da9 Mon Sep 17 00:00:00 2001 From: Geoffrey Woollard Date: Mon, 5 Aug 2024 10:03:28 -0400 Subject: [PATCH 08/11] only python 3.9 --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 78acef0..633404b 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8"] + python-version: ["3.9"] steps: From 0a6f17b739ee40a01d31db93a5bbb6b41cbe3a20 Mon Sep 17 00:00:00 2001 From: Geoffrey Woollard Date: Mon, 5 Aug 2024 10:15:27 -0400 Subject: [PATCH 09/11] only python 3.10 --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 633404b..50e9ca9 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9"] + python-version: ["3.10"] steps: From 8a80c4fe73cfb085bf81281d6f4c4880ae7f2af6 Mon Sep 17 00:00:00 2001 From: Geoffrey Woollard Date: Mon, 5 Aug 2024 10:34:31 -0400 Subject: [PATCH 10/11] 3.8,3.9,3.10,3.11' with fail fast false --- .github/workflows/testing.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 50e9ca9..9bcf7c5 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,7 +14,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.10"] + python-version: ["3.8", "3.9", "3.10"] + fail-fast: false steps: From c389ceed77c544add5482b320c1a38fbaad63fc8 Mon Sep 17 00:00:00 2001 From: Geoffrey Woollard Date: Mon, 5 Aug 2024 10:34:41 -0400 Subject: [PATCH 11/11] 3.8,3.9,3.10,3.11' with fail fast false --- .github/workflows/testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 9bcf7c5..413047d 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10", "3.11"] fail-fast: false