@@ -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