def test_solver_hdf5_roundtrip(sbml_example_presimulation_module): """TestCase class for AMICI HDF5 I/O""" model = sbml_example_presimulation_module.getModel() solver = model.getSolver() _modify_solver_attrs(solver) hdf5file = 'solverSettings.hdf5' amici.writeSolverSettingsToHDF5(solver, hdf5file, 'ssettings') new_solver = model.getSolver() # check that we changed everything for attr in dir(solver): if not attr.startswith('set'): continue assert getattr(solver, attr.replace('set', 'get'))() \ != getattr(new_solver, attr.replace('set', 'get'))(), attr amici.readSolverSettingsFromHDF5(hdf5file, new_solver, 'ssettings') # check that reading in settings worked for attr in dir(solver): if not attr.startswith('set'): continue assert getattr(solver, attr.replace('set', 'get'))() \ == pytest.approx( getattr(new_solver, attr.replace('set', 'get'))()), attr os.remove(hdf5file)
def __setstate__(self, state: Dict): self.__dict__.update(state) model = amici_petab_import.import_petab_problem(self.petab_problem) solver = model.getSolver() _fd, _file = tempfile.mkstemp() try: # write solver settings to temporary file with open(_fd, 'wb', closefd=False) as f: f.write(state['amici_solver_settings']) # read in solver settings try: amici.readSolverSettingsFromHDF5(_file, solver) except AttributeError as err: if not err.args: err.args = ('', ) err.args += ("Unpickling an AmiciObjective requires an AMICI " "installation with HDF5 support.", ) raise finally: # close file descriptor and remove temporary file os.close(_fd) os.remove(_file) self.amici_model = model self.amici_solver = solver
def __setstate__(self, state: Dict): if state['amici_object_builder'] is None: raise NotImplementedError( "AmiciObjective does not support __setstate__ without " "an `amici_object_builder`.") self.__dict__.update(state) # note: attributes not defined in the builder are lost model = self.amici_object_builder.create_model() solver = self.amici_object_builder.create_solver(model) edatas = self.amici_object_builder.create_edatas(model) try: # write solver settings to temporary file _file = tempfile.mkstemp()[1] with open(_file, 'wb') as f: f.write(state['amici_solver_settings']) # read in solver settings amici.readSolverSettingsFromHDF5(_file, solver) # remove temporary file os.remove(_file) except AttributeError as err: if not err.args: err.args = ('', ) err.args += ("Amici must have been compiled with hdf5 support", ) raise self.amici_model = model self.amici_solver = solver self.edatas = edatas
def __setstate__(self, state: Dict) -> None: self.__dict__.update(state) petab_importer = state['petab_importer'] # note: attributes not defined in the importer are lost model = petab_importer.create_model() solver = petab_importer.create_solver(model) edatas = petab_importer.create_edatas(model) amici.readSolverSettingsFromHDF5(state['amici_solver'], solver) os.remove(state['amici_solver']) self.amici_model = model self.amici_solver = solver self.edatas = edatas
def __setstate__(self, state: Dict) -> None: if state['amici_object_builder'] is None: raise NotImplementedError( "AmiciObjective does not support __setstate__ without " "an `amici_object_builder`.") self.__dict__.update(state) # note: attributes not defined in the builder are lost model = self.amici_object_builder.create_model() solver = self.amici_object_builder.create_solver(model) edatas = self.amici_object_builder.create_edatas(model) _fd, _file = tempfile.mkstemp() try: # write solver settings to temporary file with open(_fd, 'wb', closefd=False) as f: f.write(state['amici_solver_settings']) # read in solver settings try: amici.readSolverSettingsFromHDF5(_file, solver) except AttributeError as err: if not err.args: err.args = ('', ) err.args += ("Unpickling an AmiciObjective requires an AMICI " "installation with HDF5 support.", ) raise finally: # close file descriptor and remove temporary file os.close(_fd) os.remove(_file) self.amici_model = model self.amici_solver = solver self.edatas = edatas self.apply_custom_timepoints() amici.set_model_settings( self.amici_model, state['AMICI_model_settings'], )
def runTest(self): """ test runner routine that loads data expectedResults.h5 hdf file and runs individual models/settings as subTests """ expected_results = h5py.File(self.expectedResultsFile, 'r') for subTest in expected_results.keys(): for case in list(expected_results[subTest].keys()): if case.startswith('sensi2'): model_name = subTest + '_o2' else: model_name = subTest with self.subTest(modelName=model_name, caseName=case): print(f'running {model_name}::{case}') def assert_fun(x): return self.assertTrue(x) model_swig_folder = \ os.path.join(os.path.dirname(__file__), '..', 'build', 'tests', 'cpputest', f'external_{model_name}-prefix', 'src', f'external_{model_name}-build', 'swig') sys.path.insert(0, model_swig_folder) test_model_module = importlib.import_module(model_name) self.model = test_model_module.getModel() self.solver = self.model.getSolver() amici.readModelDataFromHDF5( self.expectedResultsFile, self.model.get(), f'/{subTest}/{case}/options' ) amici.readSolverSettingsFromHDF5( self.expectedResultsFile, self.solver.get(), f'/{subTest}/{case}/options' ) edata = None if 'data' in expected_results[subTest][case].keys(): edata = amici.readSimulationExpData( self.expectedResultsFile, f'/{subTest}/{case}/data', self.model.get() ) rdata = amici.runAmiciSimulation(self.model, self.solver, edata) check_derivative_opts = dict() if model_name == 'model_nested_events': check_derivative_opts['rtol'] = 1e-2 elif model_name == 'model_events': check_derivative_opts['atol'] = 1e-3 if edata \ and self.solver.getSensitivityMethod() \ and self.solver.getSensitivityOrder() \ and len(self.model.getParameterList()) \ and not model_name.startswith('model_neuron') \ and not case.endswith('byhandpreeq'): check_derivatives(self.model, self.solver, edata, assert_fun, **check_derivative_opts) verify_simulation_opts = dict() if model_name.startswith('model_neuron'): verify_simulation_opts['atol'] = 1e-5 verify_simulation_opts['rtol'] = 1e-2 if model_name.startswith('model_robertson') and \ case == 'sensiforwardSPBCG': verify_simulation_opts['atol'] = 1e-3 verify_simulation_opts['rtol'] = 1e-3 verify_simulation_results( rdata, expected_results[subTest][case]['results'], assert_fun, **verify_simulation_opts ) if model_name == 'model_steadystate' and \ case == 'sensiforwarderrorint': edata = amici.amici.ExpData(self.model.get()) if edata and model_name != 'model_neuron_o2' and not ( model_name == 'model_robertson' and case == 'sensiforwardSPBCG' ): # Test runAmiciSimulations: ensure running twice # with same ExpData yields same results if isinstance(edata, amici.amici.ExpData): edatas = [edata, edata] else: edatas = [edata.get(), edata.get()] rdatas = amici.runAmiciSimulations( self.model, self.solver, edatas, num_threads=2 ) verify_simulation_results( rdatas[0], expected_results[subTest][case]['results'], assert_fun, **verify_simulation_opts ) verify_simulation_results( rdatas[1], expected_results[subTest][case]['results'], assert_fun, **verify_simulation_opts ) self.assertRaises( RuntimeError, self.model.getParameterByName, 'thisParameterDoesNotExist' )
def apply_solver_settings(self, solver: 'amici.Solver'): """Apply settings to Solver""" amici.readSolverSettingsFromHDF5(self.filename, solver.get(), '/amiciOptions')
model_name = sub_test + '_o2' else: model_name = sub_test model_swig_folder = \ os.path.join(os.path.dirname(__file__), '..', '..', 'build', 'tests', 'cpputest', f'external_{model_name}-prefix', 'src', f'external_{model_name}-build', 'swig') test_model_module = amici.import_model_module( module_name=model_name, module_path=model_swig_folder) model = test_model_module.getModel() solver = model.getSolver() amici.readModelDataFromHDF5(options_file, model.get(), f'/{sub_test}/{case}/options') amici.readSolverSettingsFromHDF5(options_file, solver.get(), f'/{sub_test}/{case}/options') edata = None if 'data' in expected_results[sub_test][case].keys(): edata = amici.readSimulationExpData(expected_results_file, f'/{sub_test}/{case}/data', model.get()) rdata = amici.runAmiciSimulation(model, solver, edata) check_derivative_opts = dict() if model_name == 'model_nested_events': check_derivative_opts['rtol'] = 1e-2 elif model_name == 'model_events': check_derivative_opts['atol'] = 1e-3
model_name = sub_test + '_o2' else: model_name = sub_test model_swig_folder = \ os.path.join(os.path.dirname(__file__), '..', '..', 'build', 'tests', 'cpputest', f'external_{model_name}-prefix', 'src', f'external_{model_name}-build', 'swig') test_model_module = amici.import_model_module( module_name=model_name, module_path=model_swig_folder) model = test_model_module.getModel() solver = model.getSolver() amici.readModelDataFromHDF5(expected_results_file, model.get(), f'/{sub_test}/{case}/options') amici.readSolverSettingsFromHDF5(expected_results_file, solver.get(), f'/{sub_test}/{case}/options') edata = None if 'data' in expected_results[sub_test][case].keys(): edata = amici.readSimulationExpData(expected_results_file, f'/{sub_test}/{case}/data', model.get()) rdata = amici.runAmiciSimulation(model, solver, edata) check_derivative_opts = dict() if model_name == 'model_nested_events': check_derivative_opts['rtol'] = 1e-2 elif model_name == 'model_events': check_derivative_opts['atol'] = 1e-3