@@ -17,6 +17,7 @@ use pineappl::grid::Grid;
1717use pineappl:: pids:: PidBasis ;
1818use pyo3:: exceptions:: PyValueError ;
1919use pyo3:: prelude:: * ;
20+ use pyo3:: types:: PyTuple ;
2021use std:: collections:: BTreeMap ;
2122use std:: fs:: File ;
2223use std:: io:: BufReader ;
@@ -468,9 +469,8 @@ impl PyGrid {
468469 ///
469470 /// Parameters
470471 /// ----------
471- /// slices : list(list(tuple(PyOperatorSliceInfo, PyReadOnlyArray4)))
472- /// list of EKOs where each element is a list of (PyOperatorSliceInfo, 4D array)
473- /// describing each convolution
472+ /// slices : list(Generator(tuple(PyOperatorSliceInfo, PyReadOnlyArray4)))
473+ /// list of EKOs where each element is in turn a list of (PyOperatorSliceInfo, 4D array)
474474 /// order_mask : numpy.ndarray(bool)
475475 /// boolean mask to activate orders
476476 /// xi : (float, float)
@@ -486,7 +486,7 @@ impl PyGrid {
486486 /// produced FK table
487487 pub fn evolve (
488488 & self ,
489- slices : Vec < Vec < ( PyOperatorSliceInfo , PyReadonlyArray4 < f64 > ) > > ,
489+ slices : Vec < Bound < PyAny > > ,
490490 order_mask : Vec < bool > ,
491491 xi : ( f64 , f64 , f64 ) ,
492492 ren1 : Vec < f64 > ,
@@ -496,12 +496,19 @@ impl PyGrid {
496496 . grid
497497 . evolve (
498498 slices
499- . iter ( )
499+ . into_iter ( )
500500 . map ( |subslice| {
501- subslice. iter ( ) . map ( |( info, op) | {
501+ // create lazy iterators from Python object
502+ subslice. try_iter ( ) . unwrap ( ) . map ( |item| {
503+ let item = item. unwrap ( ) ;
504+ let op_tuple = item. downcast :: < PyTuple > ( ) . unwrap ( ) ;
505+ let info: PyOperatorSliceInfo =
506+ op_tuple. get_item ( 0 ) . unwrap ( ) . extract ( ) . unwrap ( ) ;
507+ let op: PyReadonlyArray4 < f64 > =
508+ op_tuple. get_item ( 1 ) . unwrap ( ) . extract ( ) . unwrap ( ) ;
509+
502510 Ok :: < _ , std:: io:: Error > ( (
503- info. info . clone ( ) ,
504- // TODO: avoid copying
511+ info. info ,
505512 CowArray :: from ( op. as_array ( ) . to_owned ( ) ) ,
506513 ) )
507514 } )
@@ -512,7 +519,6 @@ impl PyGrid {
512519 & AlphasTable { ren1, alphas } ,
513520 )
514521 . map ( |fk_table| PyFkTable { fk_table } )
515- // TODO: avoid unwrap and convert `Result` into `PyResult`
516522 . unwrap ( ) )
517523 }
518524
0 commit comments