diff --git a/python/tests/test_swig_interface.py b/python/tests/test_swig_interface.py index 6a7cfec855..8d3358b509 100644 --- a/python/tests/test_swig_interface.py +++ b/python/tests/test_swig_interface.py @@ -471,3 +471,16 @@ def test_expdata_and_expdataview_are_deepcopyable(): ev2 = copy.deepcopy(ev1) assert ev2._swigptr.this != ev1._swigptr.this assert ev1 == ev2 + + +def test_model_is_deepcopyable(pysb_example_presimulation_module): + model_module = pysb_example_presimulation_module + for model1 in ( + model_module.getModel(), + amici.ModelPtr(model_module.getModel()), + ): + model2 = copy.deepcopy(model1) + assert model1.this != model2.this + assert model1.getT0() == model2.getT0() + model2.setT0(100 * model2.getT0()) + assert model1.getT0() != model2.getT0() diff --git a/swig/model.i b/swig/model.i index 3063590c21..36d43310ef 100644 --- a/swig/model.i +++ b/swig/model.i @@ -94,10 +94,22 @@ using namespace amici; %ignore fdx_rdatadx_solver; %ignore fdsigmaydy; +%newobject amici::Model::clone; +%extend amici::Model { +%pythoncode %{ +def __deepcopy__(self, memo): + return self.clone() +%} +}; +%extend std::unique_ptr { +%pythoncode %{ +def __deepcopy__(self, memo): + return self.clone() +%} +}; -%newobject amici::Model::clone; // Process symbols in header %include "amici/model.h"