diff --git a/gillespy2/core/gillespySolver.py b/gillespy2/core/gillespySolver.py index 6dc19d21f..f839090ff 100644 --- a/gillespy2/core/gillespySolver.py +++ b/gillespy2/core/gillespySolver.py @@ -86,6 +86,13 @@ def get_increment(self, increment): def get_supported_features(cls) -> "Set[Type]": return set() + @classmethod + def validate_model(cls, sol_model, model): + if model is not None: + model.resolve_parameters() + if model.get_json_hash() != sol_model.get_json_hash(): + raise SimulationError("Model must equal ODECSolver.model.") + @classmethod def validate_sbml_features(cls, model): unsupported_features = model.get_model_features() - cls.get_supported_features() diff --git a/gillespy2/solvers/cpp/ode_c_solver.py b/gillespy2/solvers/cpp/ode_c_solver.py index 65d9a4532..313478f20 100644 --- a/gillespy2/solvers/cpp/ode_c_solver.py +++ b/gillespy2/solvers/cpp/ode_c_solver.py @@ -45,9 +45,8 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int if model is None: raise SimulationError("A model is required to run the simulation.") self._set_model(model=model) - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal ODECSolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) @@ -102,7 +101,7 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int sim_status = self._run(sim_exec, args, decoder, timeout, display_args) if sim_status == SimulationReturnCode.FAILED: - raise gillespyError.ExecutionError("Error encountered while running simulation C++ file:\n" + raise ExecutionError("Error encountered while running simulation C++ file:\n" f"Return code: {int(sim_status)}.\n") trajectories, time_stopped = decoder.get_output() diff --git a/gillespy2/solvers/cpp/ssa_c_solver.py b/gillespy2/solvers/cpp/ssa_c_solver.py index 9d647ee52..08a364d6a 100644 --- a/gillespy2/solvers/cpp/ssa_c_solver.py +++ b/gillespy2/solvers/cpp/ssa_c_solver.py @@ -46,9 +46,8 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int if model is None: raise SimulationError("A model is required to run the simulation.") self._set_model(model=model) - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal SSACSolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) @@ -102,7 +101,7 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int sim_status = self._run(sim_exec, args, decoder, timeout, display_args) if sim_status == SimulationReturnCode.FAILED: - raise gillespyError.ExecutionError("Error encountered while running simulation C++ file:\n" + raise ExecutionError("Error encountered while running simulation C++ file:\n" f"Return code: {int(sim_status)}.\n") trajectories, time_stopped = decoder.get_output() diff --git a/gillespy2/solvers/cpp/tau_hybrid_c_solver.py b/gillespy2/solvers/cpp/tau_hybrid_c_solver.py index 8bec0fb8f..5f0c48a3b 100644 --- a/gillespy2/solvers/cpp/tau_hybrid_c_solver.py +++ b/gillespy2/solvers/cpp/tau_hybrid_c_solver.py @@ -172,9 +172,8 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int if model is None: raise SimulationError("A model is required to run the simulation.") self._set_model(model=model) - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal TauHybridCSolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) @@ -231,7 +230,7 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int sim_status = self._run(sim_exec, args, decoder, timeout, display_args) if sim_status == SimulationReturnCode.FAILED: - raise gillespyError.ExecutionError("Error encountered while running simulation C++ file:\n" + raise ExecutionError("Error encountered while running simulation C++ file:\n" f"Return code: {int(sim_status)}.\n") trajectories, time_stopped = decoder.get_output() diff --git a/gillespy2/solvers/cpp/tau_leaping_c_solver.py b/gillespy2/solvers/cpp/tau_leaping_c_solver.py index 42110c2bb..74d117926 100644 --- a/gillespy2/solvers/cpp/tau_leaping_c_solver.py +++ b/gillespy2/solvers/cpp/tau_leaping_c_solver.py @@ -45,9 +45,8 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int if model is None: raise SimulationError("A model is required to run the simulation.") self._set_model(model=model) - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal TauLeapingCSolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) @@ -102,7 +101,7 @@ def run(self=None, model: Model = None, t: int = 20, number_of_trajectories: int sim_status = self._run(sim_exec, args, decoder, timeout, display_args) if sim_status == SimulationReturnCode.FAILED: - raise gillespyError.ExecutionError("Error encountered while running simulation C++ file:\n" + raise ExecutionError("Error encountered while running simulation C++ file:\n" f"Return code: {int(sim_status)}.\n") trajectories, time_stopped = decoder.get_output() diff --git a/gillespy2/solvers/numpy/CLE_solver.py b/gillespy2/solvers/numpy/CLE_solver.py index 96c9876dd..8d7f0b9c5 100644 --- a/gillespy2/solvers/numpy/CLE_solver.py +++ b/gillespy2/solvers/numpy/CLE_solver.py @@ -154,9 +154,8 @@ def run(self, model=None, t=20, number_of_trajectories=1, increment=None, seed=N if model is None: raise SimulationError("A model is required to run the simulation.") self.model = model - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal CLESolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) diff --git a/gillespy2/solvers/numpy/ode_solver.py b/gillespy2/solvers/numpy/ode_solver.py index 40fb7d495..6c75a99e8 100644 --- a/gillespy2/solvers/numpy/ode_solver.py +++ b/gillespy2/solvers/numpy/ode_solver.py @@ -113,9 +113,8 @@ def run(self, model=None, t=20, number_of_trajectories=1, increment=None, show_l if model is None: raise SimulationError("A model is required to run the simulation.") self.model = model - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal OSESolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) diff --git a/gillespy2/solvers/numpy/ssa_solver.py b/gillespy2/solvers/numpy/ssa_solver.py index a25bb6e10..b8ded2e21 100644 --- a/gillespy2/solvers/numpy/ssa_solver.py +++ b/gillespy2/solvers/numpy/ssa_solver.py @@ -78,9 +78,8 @@ def run(self, model=None, t=20, number_of_trajectories=1, increment=None, seed=N if model is None: raise SimulationError("A model is required to run the simulation.") self.model = model - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal NumPySSASolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) @@ -198,9 +197,9 @@ def __run(self, curr_state, total_time, timeline, trajectory_base, live_grapher, if resume is not None: if resume[0].model != self.model: - raise gillespyError.ModelError('When resuming, one must not alter the model being resumed.') + raise ModelError('When resuming, one must not alter the model being resumed.') if t < resume['time'][-1]: - raise gillespyError.ExecutionError( + raise ExecutionError( "'t' must be greater than previous simulations end time, or set in the run() method as the " "simulations next end time") diff --git a/gillespy2/solvers/numpy/tau_hybrid_solver.py b/gillespy2/solvers/numpy/tau_hybrid_solver.py index 2559f392c..4fc04b193 100644 --- a/gillespy2/solvers/numpy/tau_hybrid_solver.py +++ b/gillespy2/solvers/numpy/tau_hybrid_solver.py @@ -833,9 +833,8 @@ def run(self, model=None, t=20, number_of_trajectories=1, increment=None, seed=N if model is None: raise SimulationError("A model is required to run the simulation.") self.model = model - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal TauHybridSolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment) diff --git a/gillespy2/solvers/numpy/tau_leaping_solver.py b/gillespy2/solvers/numpy/tau_leaping_solver.py index 29d993df9..a4a50ef10 100644 --- a/gillespy2/solvers/numpy/tau_leaping_solver.py +++ b/gillespy2/solvers/numpy/tau_leaping_solver.py @@ -141,9 +141,8 @@ def run(self, model=None, t=20, number_of_trajectories=1, increment=None, seed=N if model is None: raise SimulationError("A model is required to run the simulation.") self.model = model - if model is not None and model.get_json_hash() != self.model.get_json_hash(): - raise SimulationError("Model must equal TauLeapingSolver.model.") self.model.resolve_parameters() + self.validate_model(self.model, model) self.validate_sbml_features(model=model) increment = self.get_increment(increment=increment)