@@ -397,3 +397,52 @@ def file_checksum(
397397 for chunk in iter (lambda : f .read (chunk_size ), b"" ):
398398 h .update (chunk )
399399 return h .hexdigest ()
400+
401+
402+ def restore_edata (
403+ init_args : Sequence ,
404+ simulation_parameter_dict : dict [str , Any ],
405+ ) -> amici_swig .ExpData :
406+ """
407+ Recreate an ExpData instance.
408+
409+ For use in ExpData.__reduce__.
410+ """
411+ edata = amici_swig .ExpData (* init_args )
412+
413+ edata .pscale = amici .parameter_scaling_from_int_vector (
414+ simulation_parameter_dict .pop ("pscale" )
415+ )
416+ for key , value in simulation_parameter_dict .items ():
417+ if key == "timepoints" :
418+ # timepoints are set during ExpData construction
419+ continue
420+ assert hasattr (edata , key )
421+ setattr (edata , key , value )
422+ return edata
423+
424+
425+ def restore_solver (cls : type , cls_name : str , hdf5_file : str ) -> Solver :
426+ """
427+ Recreate a Solver or SolverPtr instance from an HDF5 file.
428+
429+ For use in Solver.__reduce__.
430+
431+ :param cls:
432+ Class of the original object ({CVode,IDA}Solver or SolverPtr).
433+ :param cls_name:
434+ Name of the (pointed to) solver class ("CVodeSolver" or "IDASolver").
435+ :param hdf5_file:
436+ HDF5 file from which to read the solver settings.
437+ """
438+ if cls_name == "CVodeSolver" :
439+ solver = amici .CVodeSolver ()
440+ elif cls_name == "IDASolver" :
441+ solver = amici .IDASolver ()
442+ else :
443+ raise ValueError (f"Unknown solver class name: { cls_name } " )
444+
445+ if not issubclass (cls , Solver ):
446+ solver = cls (solver )
447+ read_solver_settings_from_hdf5 (hdf5_file , solver )
448+ return solver
0 commit comments