11use pyo3:: prelude:: * ;
22use pyo3:: wrap_pyfunction;
3- use numpy:: { PyArray1 , PyReadonlyArray1 , PyReadonlyArray2 } ;
3+ use numpy:: { PyArray1 , PyReadonlyArray1 , PyReadonlyArray2 , PyArrayMethods , PyUntypedArrayMethods } ;
44use rand:: { rngs:: StdRng , SeedableRng } ;
5- use rayon;
6- use rustkmedoids;
75
86macro_rules! variant_call {
97( $name: ident, $variant: ident, $type: ty, $ltype: ty) => {
@@ -24,7 +22,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, meds: PyReadonlyArray1<'_, usize>, m
2422 let mut meds = meds. to_vec( ) ?;
2523 let ( loss, assi, n_iter, n_swap) : ( $ltype, _, _, _) = rustkmedoids:: $variant( & dist. as_array( ) , & mut meds, max_iter) ;
2624 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
27- Ok ( ( loss, PyArray1 :: from_vec ( py, assi) , PyArray1 :: from_vec ( py, meds) , n_iter, n_swap) . to_object( py) )
25+ Ok ( ( loss, PyArray1 :: from_vec_bound ( py, assi) , PyArray1 :: from_vec_bound ( py, meds) , n_iter, n_swap) . to_object( py) )
2826 } )
2927}
3028} }
@@ -71,7 +69,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, meds: PyReadonlyArray1<'_, usize>, m
7169 let mut rnd = StdRng :: seed_from_u64( seed) ;
7270 let ( loss, assi, n_iter, n_swap) : ( $ltype, _, _, _) = rustkmedoids:: $variant( & dist. as_array( ) , & mut meds, max_iter, & mut rnd) ;
7371 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
74- Ok ( ( loss, PyArray1 :: from_vec ( py, assi) , PyArray1 :: from_vec ( py, meds) , n_iter, n_swap) . to_object( py) )
72+ Ok ( ( loss, PyArray1 :: from_vec_bound ( py, assi) , PyArray1 :: from_vec_bound ( py, meds) , n_iter, n_swap) . to_object( py) )
7573 } )
7674}
7775} }
@@ -108,7 +106,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, meds: PyReadonlyArray1<'_, usize>, m
108106 rustkmedoids:: $variant( & dist, & mut meds, max_iter, & mut rnd)
109107 } ) ;
110108 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
111- Ok ( ( loss, PyArray1 :: from_vec ( py, assi) , PyArray1 :: from_vec ( py, meds) , n_iter, n_swap) . to_object( py) )
109+ Ok ( ( loss, PyArray1 :: from_vec_bound ( py, assi) , PyArray1 :: from_vec_bound ( py, meds) , n_iter, n_swap) . to_object( py) )
112110 } )
113111}
114112} }
@@ -133,7 +131,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, k: usize) -> PyResult<Py<PyAny>> {
133131 assert_eq!( dist. shape( ) [ 0 ] , dist. shape( ) [ 1 ] ) ;
134132 let ( loss, assi, meds) : ( $ltype, _, _) = rustkmedoids:: pam_build( & dist. as_array( ) , k) ;
135133 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
136- Ok ( ( loss, PyArray1 :: from_vec ( py, assi) , PyArray1 :: from_vec ( py, meds) , 1 ) . to_object( py) )
134+ Ok ( ( loss, PyArray1 :: from_vec_bound ( py, assi) , PyArray1 :: from_vec_bound ( py, meds) , 1 ) . to_object( py) )
137135 } )
138136}
139137} }
@@ -161,7 +159,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, meds: PyReadonlyArray1<'_, usize>, m
161159 let mut meds = meds. to_vec( ) ?;
162160 let ( loss, assi, n_iter) : ( $ltype, _, _) = rustkmedoids:: alternating( & dist. as_array( ) , & mut meds, max_iter) ;
163161 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
164- Ok ( ( loss, PyArray1 :: from_vec ( py, assi) , PyArray1 :: from_vec ( py, meds) , n_iter) . to_object( py) )
162+ Ok ( ( loss, PyArray1 :: from_vec_bound ( py, assi) , PyArray1 :: from_vec_bound ( py, meds) , n_iter) . to_object( py) )
165163 } )
166164}
167165} }
@@ -191,7 +189,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, meds: PyReadonlyArray1<'_, usize>, m
191189 let ( loss, assi, n_iter, n_swap, best_meds, losses) : ( $ltype, _, _, _, _, _) = rustkmedoids:: dynmsc( & dist. as_array( ) , & mut meds, minimum_k, max_iter) ;
192190 let bestk = best_meds. len( ) ;
193191 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
194- Ok ( ( loss, PyArray1 :: from_vec ( py, assi) , PyArray1 :: from_vec ( py, best_meds) , bestk, PyArray1 :: from_vec ( py, losses) , ( minimum_k..maxk) . collect:: <Vec <usize >>( ) , n_iter, n_swap) . to_object( py) )
192+ Ok ( ( loss, PyArray1 :: from_vec_bound ( py, assi) , PyArray1 :: from_vec_bound ( py, best_meds) , bestk, PyArray1 :: from_vec_bound ( py, losses) , ( minimum_k..maxk) . collect:: <Vec <usize >>( ) , n_iter, n_swap) . to_object( py) )
195193 } )
196194}
197195} }
@@ -216,7 +214,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, assi: PyReadonlyArray1<'_, usize>, s
216214 assert_eq!( dist. shape( ) [ 0 ] , dist. shape( ) [ 1 ] ) ;
217215 let ( sil, sils) : ( f64 , _) = rustkmedoids:: silhouette( & dist. as_array( ) , & assi. to_vec( ) ?, samples) ;
218216 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
219- Ok ( ( sil, PyArray1 :: from_vec ( py, sils) ) . to_object( py) )
217+ Ok ( ( sil, PyArray1 :: from_vec_bound ( py, sils) ) . to_object( py) )
220218 } )
221219}
222220} }
@@ -271,7 +269,7 @@ fn $name(dist: PyReadonlyArray2<'_, $type>, meds: PyReadonlyArray1<'_, usize>, s
271269 assert_eq!( dist. shape( ) [ 0 ] , dist. shape( ) [ 1 ] ) ;
272270 let ( sil, sils) : ( f64 , _) = rustkmedoids:: medoid_silhouette( & dist. as_array( ) , & meds. to_vec( ) ?, samples) ;
273271 Python :: with_gil( |py| -> PyResult <Py <PyAny >> {
274- Ok ( ( sil, PyArray1 :: from_vec ( py, sils) ) . to_object( py) )
272+ Ok ( ( sil, PyArray1 :: from_vec_bound ( py, sils) ) . to_object( py) )
275273 } )
276274}
277275} }
@@ -282,7 +280,7 @@ medoid_silhouette_call!(medoid_silhouette_i32, i32);
282280
283281#[ pymodule]
284282#[ allow( unused_variables) ]
285- fn kmedoids ( py : Python , m : & PyModule ) -> PyResult < ( ) > {
283+ fn kmedoids ( m : & Bound < ' _ , PyModule > ) -> PyResult < ( ) > {
286284 m. add ( "_fasterpam_f32" , wrap_pyfunction ! ( fasterpam_f32, m) ?) ?;
287285 m. add ( "_fasterpam_f64" , wrap_pyfunction ! ( fasterpam_f64, m) ?) ?;
288286 m. add ( "_fasterpam_i32" , wrap_pyfunction ! ( fasterpam_i32, m) ?) ?;
@@ -335,4 +333,3 @@ fn kmedoids(py: Python, m: &PyModule) -> PyResult<()> {
335333 // not supported: m.add("_medoid_silhouette_i64", wrap_pyfunction!(medoid_silhouette_i64, m)?)?;
336334 Ok ( ( ) )
337335}
338-
0 commit comments