From 9b82ad0b37fa335b40a68d0c720bdaf5109e62eb Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Thu, 13 Aug 2026 23:49:18 -0700 Subject: [PATCH 1/9] Remove strict pinned versions for dependencies --- setup.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index 70533f5..9d2bcdc 100644 --- a/setup.py +++ b/setup.py @@ -26,12 +26,9 @@ install_requires=['numpy', 'pandas', "biopython", - 'scikit-learn >=1.3,<1.5', - 'umap-learn ==0.5.*', - # Pin Numba at maximum supported version for the pinned umap-learn version. - # For more details see: - # https://numba.readthedocs.io/en/stable/reference/deprecation.html#deprecation-of-object-mode-fall-back-behaviour-when-using-jit - 'numba <0.59.0', + 'scikit-learn', + 'umap-learn', + 'numba', 'matplotlib', 'hdbscan' ], From f6a316aea712f75f696c2a8a9fbebec00df244ec Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Thu, 13 Aug 2026 23:49:40 -0700 Subject: [PATCH 2/9] Update MDS arguments for latest scikit-learn --- src/pathogen_embed/pathogen_embed.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pathogen_embed/pathogen_embed.py b/src/pathogen_embed/pathogen_embed.py index 875e9f0..5d97098 100644 --- a/src/pathogen_embed/pathogen_embed.py +++ b/src/pathogen_embed/pathogen_embed.py @@ -540,10 +540,11 @@ def embed(args): elif args.command == "mds": embedding_class = MDS embedding_parameters = { - "dissimilarity": "precomputed", + "init": "classical_mds", + "metric": "precomputed", "n_components": n_components, "n_jobs": 1, - "n_init": 2, + "n_init": 1, "random_state" : args.random_seed, "normalized_stress": False, } From 5632ab15d3aca2f7c1d9e3d68d5a4866d84de30c Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Thu, 13 Aug 2026 23:50:10 -0700 Subject: [PATCH 3/9] Update boxplot arg to work with newer matplotlib --- src/pathogen_embed/pathogen_embed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pathogen_embed/pathogen_embed.py b/src/pathogen_embed/pathogen_embed.py index 5d97098..79c6067 100644 --- a/src/pathogen_embed/pathogen_embed.py +++ b/src/pathogen_embed/pathogen_embed.py @@ -635,7 +635,7 @@ def embed(args): fig, ax = plt.subplots(1, 1, figsize=(8, 8), dpi=300) boxplot = ax.boxplot( grouped_euclidean_distances, - labels=list(genetic_distance_range), + tick_labels=list(genetic_distance_range), positions=list(genetic_distance_range), boxprops={ "linewidth": 0.25, From 35cda88b7fa0ada3eb8070e2adffa22a97c2e06f Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Thu, 13 Aug 2026 23:50:34 -0700 Subject: [PATCH 4/9] Update call to HDBSCAN cluster fit --- src/pathogen_embed/pathogen_embed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pathogen_embed/pathogen_embed.py b/src/pathogen_embed/pathogen_embed.py index 79c6067..c5e20db 100644 --- a/src/pathogen_embed/pathogen_embed.py +++ b/src/pathogen_embed/pathogen_embed.py @@ -705,7 +705,7 @@ def cluster(args): clusterer = hdbscan.HDBSCAN(**clustering_parameters) data_df = data_df.astype(float) - clusterer.fit(data_df) + clusterer.fit(data_df.values) data_df[args.label_attribute] = clusterer.labels_.astype(str) if args.output_figure is not None: From a9a82d76f23abc049167d4c2f7c7002cf563ee39 Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Thu, 13 Aug 2026 23:56:35 -0700 Subject: [PATCH 5/9] Drop old Python version support and add new --- .github/workflows/ci.yml | 2 +- setup.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a09829..bc6fb39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v3 diff --git a/setup.py b/setup.py index 9d2bcdc..a2b32c4 100644 --- a/setup.py +++ b/setup.py @@ -42,10 +42,11 @@ 'Intended Audience :: Science/Research', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Programming Language :: Python :: 3.13', + 'Programming Language :: Python :: 3.14', ], entry_points = { "console_scripts": [ From c54cb040eb6d3124cf3f161790bea5f72f5e005b Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Thu, 13 Aug 2026 23:56:48 -0700 Subject: [PATCH 6/9] Schedule CI every day to catch broken deps earlier --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc6fb39..e73aa35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,6 +5,11 @@ on: paths-ignore: - '*.md' + # Routinely check that tests pass with new versions of dependencies. + schedule: + # Every day at 17:30 UTC / 9:30 Seattle (winter) / 10:30 Seattle (summer) + - cron: "30 17 * * *" + jobs: build: From 48def4de760e2e3701ff10d52067af07b7934f9f Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Fri, 14 Aug 2026 00:03:18 -0700 Subject: [PATCH 7/9] Bump version to reflect major changes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a2b32c4..0875e45 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name='pathogen-embed', - version='3.1.0', + version='4.0.0', description='Reduced dimension embeddings for pathogen sequences', url='https://github.com/blab/pathogen-embed/', author='Sravani Nanduri , John Huddleston ', From 4623e5dc60145c982a431d2691e3f891f1a29f71 Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Fri, 14 Aug 2026 00:05:01 -0700 Subject: [PATCH 8/9] Update changelog --- CHANGES.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index eaa3d69..44df578 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,13 @@ # CHANGELOG +## 4.0.0 + +### Major Changes + +* Update dependencies, removing hardcoded pins on all dependency versions ([#38][]) + +[#38]: https://github.com/blab/pathogen-embed/pull/38 + ## 3.1.0 ### Features From ffb63e0853dcb3667e045d043db4f8741a142837 Mon Sep 17 00:00:00 2001 From: John Huddleston Date: Fri, 14 Aug 2026 00:25:50 -0700 Subject: [PATCH 9/9] Gracefully handle changes to scikit-learn MDS API --- src/pathogen_embed/pathogen_embed.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/pathogen_embed/pathogen_embed.py b/src/pathogen_embed/pathogen_embed.py index c5e20db..d7fba1a 100644 --- a/src/pathogen_embed/pathogen_embed.py +++ b/src/pathogen_embed/pathogen_embed.py @@ -355,7 +355,9 @@ def embed(args): warnings.simplefilter('ignore', category=NumbaDeprecationWarning) + import packaging.version from scipy.stats import linregress + import sklearn from sklearn.decomposition import PCA from sklearn.manifold import TSNE, MDS from umap import UMAP @@ -540,8 +542,6 @@ def embed(args): elif args.command == "mds": embedding_class = MDS embedding_parameters = { - "init": "classical_mds", - "metric": "precomputed", "n_components": n_components, "n_jobs": 1, "n_init": 1, @@ -549,6 +549,14 @@ def embed(args): "normalized_stress": False, } + if packaging.version.parse(sklearn.__version__) >= packaging.version.parse("1.8"): + # Only use init and metric arguments in later versions of scikit-learn that support them: + # https://scikit-learn.org/stable/modules/generated/sklearn.manifold.MDS.html#sklearn.manifold.MDS + embedding_parameters["init"] = "classical_mds" + embedding_parameters["metric"] = "precomputed" + else: + embedding_parameters["dissimilarity"] = "precomputed" + # Override defaults with parameter values passed through embedding parameters, if # possible. if external_embedding_parameters is not None and args.command != "pca":