@@ -101,17 +101,46 @@ def _solver_repr(self: "Solver"):
101101        f"   state_ordering: {self.get_state_ordering()}" 
102102        " >" 
103103    ])
104+ 
105+ def _solver_reduce (self: " Solver" 
106+     " " " 
107+     For now, we just store solver settings in a temporary HDF5 file. 
108+     This is sufficient for multiprocessing use cases, but will not survive 
109+     reboots and will not work in distributed (MPI) settings. 
110+     This requires that amici was compiled with HDF5 support. 
111+     " " "  
112+     from amici.swig_wrappers  import  restore_solver
113+     from tempfile import  NamedTemporaryFile
114+     from amici import  write_solver_settings_to_hdf5
115+     import  os
116+     with NamedTemporaryFile (suffix=" .h5" delete =False) as tmpfile:
117+         tmpfilename = tmpfile.name 
118+         write_solver_settings_to_hdf5 (self, tmpfilename)
119+ 
120+     return  (
121+         restore_solver,
122+         (self.__class__ , self.get_class_name (), tmpfilename,),
123+     )
124+ 
104125%}
105126%extend amici::CVodeSolver {
106127%pythoncode %{
107128def __repr__ (self):
108129    return  _solver_repr (self)
130+ 
131+ def __reduce__ (self):
132+     return  _solver_reduce (self)
133+ 
109134%}
110135};
111136%extend amici::IDASolver {
112137%pythoncode %{
113138def __repr__ (self):
114139    return  _solver_repr (self)
140+ 
141+ def __reduce__ (self):
142+     return  _solver_reduce (self)
143+ 
115144%}
116145};
117146
@@ -122,13 +151,20 @@ def __repr__(self):
122151
123152def __deepcopy__ (self, memo):
124153    return  self.clone ()
154+ 
155+ def __reduce__ (self):
156+     return  _solver_reduce (self)
125157%}
126158};
127159
128160%extend amici::Solver {
129161%pythoncode %{
130162def __deepcopy__ (self, memo):
131163    return  self.clone ()
164+ 
165+ def __reduce__ (self):
166+     return  _solver_reduce (self)
167+ 
132168%}
133169};
134170
0 commit comments