diff --git a/src/python/pulse/engine/PulseEngine.py b/src/python/pulse/engine/PulseEngine.py index 00260ecca991737c354968347ce42c69b618120a..2a1af87f97585266f11b45aa54925efc665d1654 100644 --- a/src/python/pulse/engine/PulseEngine.py +++ b/src/python/pulse/engine/PulseEngine.py @@ -16,6 +16,7 @@ from pulse.cdm.io.engine import serialize_actions_to_string, \ from pulse.cdm.io.patient import serialize_patient_from_string from pulse.cdm.scalars import ElectricPotentialUnit, FrequencyUnit, \ PressureUnit, TemperatureUnit, VolumeUnit, VolumePerTimeUnit +from typing import Optional class eModelType(Enum): HumanAdultWholeBody = 0 @@ -32,9 +33,10 @@ class PulseEngine: __slots__ = ['__pulse', "_is_ready", "_dt_s", "_results", "_results_template", "_event_handler", "_log_forward", - "_spare_time_s"] + "_spare_time_s", "_args"] def __init__(self, eModelType=eModelType.HumanAdultWholeBody, data_root_dir="./"): + self._args = (eModelType, data_root_dir) t = PyPulse.model_type.human_adult_whole_body if eModelType is eModelType.HumanAdultVentilationMechanics: t = PyPulse.model_type.human_adult_ventilation_mechanics @@ -47,8 +49,32 @@ class PulseEngine: self._spare_time_s = 0 self._dt_s = self.__pulse.get_timestep("s") + @staticmethod + def _default_data_request_mgr(): + data_request_mgr = SEDataRequestManager() + data_request_mgr.set_data_requests([ + SEDataRequest.create_physiology_request("HeartRate", unit=FrequencyUnit.Per_min), + SEDataRequest.create_physiology_request("ArterialPressure", unit=PressureUnit.mmHg), + SEDataRequest.create_physiology_request("MeanArterialPressure", unit=PressureUnit.mmHg), + SEDataRequest.create_physiology_request("SystolicArterialPressure", unit=PressureUnit.mmHg), + SEDataRequest.create_physiology_request("DiastolicArterialPressure", unit=PressureUnit.mmHg), + SEDataRequest.create_physiology_request("OxygenSaturation"), + SEDataRequest.create_physiology_request("EndTidalCarbonDioxidePressure", unit=PressureUnit.mmHg), + SEDataRequest.create_physiology_request("RespirationRate", unit=FrequencyUnit.Per_min), + SEDataRequest.create_physiology_request("SkinTemperature", unit=TemperatureUnit.C), + SEDataRequest.create_physiology_request("CardiacOutput", unit=VolumePerTimeUnit.L_Per_min), + SEDataRequest.create_physiology_request("BloodVolume", unit=VolumeUnit.mL), + SEDataRequest.create_ecg_request("Lead3ElectricPotential", unit=ElectricPotentialUnit.mV), + SEDataRequest.create_gas_compartment_substance_request("Carina", "CarbonDioxide", "PartialPressure", unit=PressureUnit.mmHg) + + ]) + return data_request_mgr + def serialize_from_file(self, state_file: str, - data_request_mgr: SEDataRequestManager): + data_request_mgr: Optional[SEDataRequestManager]=None): + if data_request_mgr is None: + data_request_mgr = self._default_data_request_mgr() + # Process requests and setup our results structure drm = self._process_requests(data_request_mgr, eSerializationFormat.JSON) self._is_ready = self.__pulse.serialize_from_file(state_file, drm, PyPulse.serialization_format.json) @@ -64,8 +90,11 @@ class PulseEngine: def serialize_from_string(self, state: str, - data_request_mgr: SEDataRequestManager, + data_request_mgr: Optional[SEDataRequestManager], state_format: eSerializationFormat): + if data_request_mgr is None: + data_request_mgr = self._default_data_request_mgr() + # Process requests and setup our results structure drm = self._process_requests(data_request_mgr, state_format) if state_format == eSerializationFormat.BINARY: @@ -83,6 +112,14 @@ class PulseEngine: return self.__pulse.serialize_to_string(format) return None + def __getstate__(self): + return self._args, self.serialize_to_string(PyPulse.serialization_format.binary) + + def __setstate__(self, args_state): + args, state = args_state + self.__init__(*args) + return self.serialize_from_string(state, None, eSerializationFormat.BINARY) + def initialize_engine(self, patient_configuration: SEPatientConfiguration, data_request_mgr: SEDataRequestManager): # Process requests and setup our results structure @@ -174,23 +211,8 @@ class PulseEngine: def _process_requests(self, data_request_mgr, fmt: eSerializationFormat): if data_request_mgr is None: - data_request_mgr = SEDataRequestManager() - data_request_mgr.set_data_requests([ - SEDataRequest.create_physiology_request("HeartRate", unit=FrequencyUnit.Per_min), - SEDataRequest.create_physiology_request("ArterialPressure", unit=PressureUnit.mmHg), - SEDataRequest.create_physiology_request("MeanArterialPressure", unit=PressureUnit.mmHg), - SEDataRequest.create_physiology_request("SystolicArterialPressure", unit=PressureUnit.mmHg), - SEDataRequest.create_physiology_request("DiastolicArterialPressure", unit=PressureUnit.mmHg), - SEDataRequest.create_physiology_request("OxygenSaturation"), - SEDataRequest.create_physiology_request("EndTidalCarbonDioxidePressure", unit=PressureUnit.mmHg), - SEDataRequest.create_physiology_request("RespirationRate", unit=FrequencyUnit.Per_min), - SEDataRequest.create_physiology_request("SkinTemperature", unit=TemperatureUnit.C), - SEDataRequest.create_physiology_request("CardiacOutput", unit=VolumePerTimeUnit.L_Per_min), - SEDataRequest.create_physiology_request("BloodVolume", unit=VolumeUnit.mL), - SEDataRequest.create_ecg_request("Lead3ElectricPotential", unit=ElectricPotentialUnit.mV), - SEDataRequest.create_gas_compartment_substance_request("Carina", "CarbonDioxide", "PartialPressure", unit=PressureUnit.mmHg) - - ]) + data_request_mgr = self._default_data_request_mgr() + # Simulation time is always the first result. self._results_template = {} # Clear all results self._results_template["SimulationTime(s)"] = []