Skip to content

Commit 0bf8a68

Browse files
committed
Update dependencies, for Python 3.14 compatibility
1 parent 018f26b commit 0bf8a68

5 files changed

Lines changed: 30 additions & 17 deletions

File tree

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
11
/target
2+
/build
3+
/tests/__pycache__
4+
/kmedoids/__pycache__
5+
/kmedoids/*.so
6+
/Cargo.lock

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
For changes to the main Rust package, please see <https://github.com/kno10/rust-kmedoids/blob/main/CHANGELOG.md>
44

5+
## kmedoids 0.5.4 (2025-09-17)
6+
7+
- no functionality changes
8+
- update Rust edition, rand, rayon
9+
- Python 3.14 compatibility
10+
- update to pyo3 0.26, numpy 0.26
11+
512
## kmedoids 0.5.3.1 (2024-12-09)
613

714
- no changes, but rebuild binary packages because of compile issue

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ authors:
1010
title: "Fast k-medoids Clustering in Rust and Python"
1111
journal: "J. Open Source Softw."
1212
doi: 10.21105/joss.04183
13-
version: 0.5.3
14-
date-released: 2024-12-02
13+
version: 0.5.4
14+
date-released: 2025-09-17
1515
license: GPL-3.0
1616
preferred-citation:
1717
title: "Fast k-medoids Clustering in Rust and Python"

Cargo.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
2-
edition = "2021"
2+
edition = "2024"
33
name = "kmedoids"
4-
version = "0.5.3"
4+
version = "0.5.4"
55
authors = ["Erich Schubert <erich.schubert@tu-dortmund.de>", "Lars Lenssen <lars.lenssen@tu-dortmund.de>"]
66
description = "k-Medoids clustering with the FasterPAM algorithm"
77
homepage = "https://github.com/kno10/python-kmedoids"
@@ -14,13 +14,13 @@ name = "kmedoids"
1414
crate-type = ["cdylib"]
1515

1616
[dependencies]
17-
rustkmedoids = { version = "0.5.3", package = "kmedoids", git = "https://github.com/kno10/rust-kmedoids" }
18-
numpy = "0.23"
17+
rustkmedoids = { version = "0.5.4", package = "kmedoids", git = "https://github.com/kno10/rust-kmedoids" }
18+
numpy = "0.26"
1919
ndarray = "0.16"
20-
rand = "0.8"
21-
rayon = "1.10"
20+
rand = "0.9"
21+
rayon = "1.11"
2222

2323
[dependencies.pyo3]
24-
version = "^0.23"
24+
version = "^0.26"
2525
features = ["extension-module"]
2626

src/lib.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, meds: PyReadonlyArray1<'py, us
2222
assert_eq!(dist.shape()[0], dist.shape()[1]);
2323
let mut meds = meds.to_vec()?;
2424
let (loss, assi, n_iter, n_swap): ($ltype, _, _, _) = rustkmedoids::$variant(&dist.as_array(), &mut meds, max_iter);
25-
Python::with_gil(|py| {
25+
Python::attach(|py| {
2626
Ok((loss, PyArray1::from_vec(py, assi), PyArray1::from_vec(py, meds), n_iter, n_swap).into_pyobject(py)?.unbind())
2727
})
2828
}
@@ -69,7 +69,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, meds: PyReadonlyArray1<'py, us
6969
let mut meds = meds.to_vec()?;
7070
let mut rnd = StdRng::seed_from_u64(seed);
7171
let (loss, assi, n_iter, n_swap): ($ltype, _, _, _) = rustkmedoids::$variant(&dist.as_array(), &mut meds, max_iter, &mut rnd);
72-
Python::with_gil(|py| {
72+
Python::attach(|py| {
7373
Ok((loss, PyArray1::from_vec(py, assi), PyArray1::from_vec(py, meds), n_iter, n_swap).into_pyobject(py)?.unbind())
7474
})
7575
}
@@ -106,7 +106,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, meds: PyReadonlyArray1<'py, us
106106
let mut rnd = StdRng::seed_from_u64(seed);
107107
rustkmedoids::$variant(&dist, &mut meds, max_iter, &mut rnd)
108108
});
109-
Python::with_gil(|py| {
109+
Python::attach(|py| {
110110
Ok((loss, PyArray1::from_vec(py, assi), PyArray1::from_vec(py, meds), n_iter, n_swap).into_pyobject(py)?.unbind())
111111
})
112112
}
@@ -131,7 +131,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, k: usize) -> PyResult<Py<PyTup
131131
assert_eq!(dist.ndim(), 2);
132132
assert_eq!(dist.shape()[0], dist.shape()[1]);
133133
let (loss, assi, meds): ($ltype, _, _) = rustkmedoids::pam_build(&dist.as_array(), k);
134-
Python::with_gil(|py| {
134+
Python::attach(|py| {
135135
Ok((loss, PyArray1::from_vec(py, assi), PyArray1::from_vec(py, meds), 1).into_pyobject(py)?.unbind())
136136
})
137137
}
@@ -159,7 +159,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, meds: PyReadonlyArray1<'py, us
159159
assert_eq!(dist.shape()[0], dist.shape()[1]);
160160
let mut meds = meds.to_vec()?;
161161
let (loss, assi, n_iter): ($ltype, _, _) = rustkmedoids::alternating(&dist.as_array(), &mut meds, max_iter);
162-
Python::with_gil(|py| {
162+
Python::attach(|py| {
163163
Ok((loss, PyArray1::from_vec(py, assi), PyArray1::from_vec(py, meds), n_iter).into_pyobject(py)?.unbind())
164164
})
165165
}
@@ -189,7 +189,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, meds: PyReadonlyArray1<'py, us
189189
let maxk = meds.len() + 1;
190190
let (loss, assi, n_iter, n_swap, best_meds, losses): ($ltype, _, _, _, _, _) = rustkmedoids::dynmsc(&dist.as_array(), &mut meds, minimum_k, max_iter);
191191
let bestk = best_meds.len();
192-
Python::with_gil(|py| {
192+
Python::attach(|py| {
193193
Ok((loss, PyArray1::from_vec(py, assi), PyArray1::from_vec(py, best_meds), bestk, PyArray1::from_vec(py, losses), PyArray1::from_vec(py, (minimum_k..maxk).collect::<Vec<usize>>()), n_iter, n_swap).into_pyobject(py)?.unbind())
194194
})
195195
}
@@ -214,7 +214,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, assi: PyReadonlyArray1<'py, us
214214
assert_eq!(dist.ndim(), 2);
215215
assert_eq!(dist.shape()[0], dist.shape()[1]);
216216
let (sil, sils): (f64, _) = rustkmedoids::silhouette(&dist.as_array(), &assi.to_vec()?, samples);
217-
Python::with_gil(|py| {
217+
Python::attach(|py| {
218218
Ok((sil, PyArray1::from_vec(py, sils)).into_pyobject(py)?.unbind())
219219
})
220220
}
@@ -269,7 +269,7 @@ fn $name<'py>(dist: PyReadonlyArray2<'py, $type>, meds: PyReadonlyArray1<'py, us
269269
assert_eq!(dist.ndim(), 2);
270270
assert_eq!(dist.shape()[0], dist.shape()[1]);
271271
let (sil, sils): (f64, _) = rustkmedoids::medoid_silhouette(&dist.as_array(), &meds.to_vec()?, samples);
272-
Python::with_gil(|py| {
272+
Python::attach(|py| {
273273
Ok((sil, PyArray1::from_vec(py, sils)).into_pyobject(py)?.unbind())
274274
})
275275
}
@@ -332,5 +332,6 @@ fn kmedoids(m: &Bound<'_, PyModule>) -> PyResult<()> {
332332
m.add("_medoid_silhouette_f64", wrap_pyfunction!(medoid_silhouette_f64, m)?)?;
333333
m.add("_medoid_silhouette_i32", wrap_pyfunction!(medoid_silhouette_i32, m)?)?;
334334
// not supported: m.add("_medoid_silhouette_i64", wrap_pyfunction!(medoid_silhouette_i64, m)?)?;
335+
// use m.sum(axis=1).argmin() instead of choose_medoid_within_partition
335336
Ok(())
336337
}

0 commit comments

Comments
 (0)