What’s New in the Pulse Physiology Engine 4.4.0
×
Controller.h
1/* Distributed under the Apache License, Version 2.0.
2 See accompanying NOTICE file for details.*/
3
4#pragma once
5
6#include "engine/CommonDefs.h"
7#include "engine/PulseConfiguration.h"
8#include "engine/common/controller/BlackBoxManager.h"
9#include "engine/common/controller/CircuitManager.h"
10#include "engine/common/controller/CompartmentManager.h"
11#include "engine/common/controller/SubstanceManager.h"
12
13// CDM
14#include "cdm/engine/SEActionManager.h"
15#include "cdm/engine/SEConditionManager.h"
16#include "cdm/engine/SEDataRequested.h"
17#include "cdm/engine/SEDataRequestTracker.h"
18#include "cdm/engine/SEEngineStabilization.h"
19#include "cdm/engine/SEEventManager.h"
20#include "cdm/engine/SEPatientConfiguration.h"
21#include "cdm/patient/SEPatient.h"
22#include "cdm/properties/SEScalarTime.h"
23
24namespace pulse
25{
26 class StabilizationController;
27 class Model;
28
29 class EnvironmentModel;
30
31 class BloodChemistryModel;
32 class CardiovascularModel;
33 class EndocrineModel;
34 class EnergyModel;
35 class GastrointestinalModel;
36 class HepaticModel;
37 class NervousModel;
38 class RenalModel;
39 class RespiratoryModel;
40 class DrugModel;
41 class TissueModel;
42
43 class AnesthesiaMachineModel;
44 class BagValveMaskModel;
45 class ExtracorporealMembraneOxygenationDeviceModel;
46 class ElectroCardioGramModel;
47 class InhalerModel;
48 class MechanicalVentilatorModel;
49
50 class SaturationCalculator;
51
52 enum class EngineState
53 {
54 NotReady = 0,
55 Initialization,
56 InitialStabilization,
57 AtInitialStableState,
58 SecondaryStabilization,
59 AtSecondaryStableState,
60 Active,
61 Fatal
62 };
63
64 // Keep enums in sync with appropriate proto file !!
65 enum class eAirwayMode
66 {
67 Free = 0,
68 AnesthesiaMachine,
69 BagValveMask,
70 Inhaler,
71 MechanicalVentilation,// Action
72 MechanicalVentilator, // Equipment
73 NasalCannula,
74 NonRebreatherMask,
75 SimpleMask
76 };
77 extern PULSE_DECL const std::string& eAirwayMode_Name(eAirwayMode m);
78
79 class PULSE_DECL Data : public Loggable
80 {
81 friend class Engine;
82 protected:// Create in an Engine
83 Data(Logger* logger = nullptr);
84 public:
85 virtual ~Data();
86
87 virtual std::string GetDataRoot() const { return m_DataDir; }
88 virtual void SetDataRoot(const std::string& dir) { m_DataDir = dir; }
89
90 virtual void AdvanceCallback(double time_s);
91
92 virtual EngineState GetState() const { return m_State; }
93
94 virtual DataTrack& GetDataTrack() const;
95 virtual SEEngineTracker& GetEngineTracker() const;
96
97 virtual SaturationCalculator& GetSaturationCalculator() const;
98
99 virtual SubstanceManager& GetSubstances() const;
100
101 virtual const SEPatient& GetInitialPatient() const;
102 virtual SEPatient& GetCurrentPatient() const;
103
104 virtual bool HasBloodChemistry() const;
105 virtual SEBloodChemistrySystem& GetBloodChemistry() const;
106 virtual bool HasCardiovascular() const;
107 virtual SECardiovascularSystem& GetCardiovascular() const;
108 virtual bool HasDrugs() const;
109 virtual SEDrugSystem& GetDrugs() const;
110 virtual bool HasEndocrine() const;
111 virtual SEEndocrineSystem& GetEndocrine() const;
112 virtual bool HasEnergy() const;
113 virtual SEEnergySystem& GetEnergy() const;
114 virtual bool HasGastrointestinal() const;
115 virtual SEGastrointestinalSystem& GetGastrointestinal() const;
116 virtual bool HasHepatic() const;
117 virtual SEHepaticSystem& GetHepatic() const;
118 virtual bool HasNervous() const;
119 virtual SENervousSystem& GetNervous() const;
120 virtual bool HasRenal() const;
121 virtual SERenalSystem& GetRenal() const;
122 virtual bool HasRespiratory() const;
123 virtual SERespiratorySystem& GetRespiratory() const;
124 virtual bool HasTissue() const;
125 virtual SETissueSystem& GetTissue() const;
126
127 virtual bool HasEnvironment() const;
128 virtual SEEnvironment& GetEnvironment() const;
129 virtual bool HasAnesthesiaMachine() const;
130 virtual SEAnesthesiaMachine& GetAnesthesiaMachine() const;
131 virtual bool HasBagValveMask() const;
132 virtual SEBagValveMask& GetBagValveMask() const;
133 virtual bool HasECG() const;
134 virtual SEElectroCardioGram& GetECG() const;
135 virtual bool HasExtracorporealMembraneOxygenationDevice() const;
136 virtual SEExtracorporealMembraneOxygenationDevice& GetExtracorporealMembraneOxygenationDevice() const;
137 virtual bool HasInhaler() const;
138 virtual SEInhaler& GetInhaler() const;
139 virtual bool HasMechanicalVentilator() const;
140 virtual SEMechanicalVentilator& GetMechanicalVentilator() const;
141
142 virtual SEActionManager& GetActions() const;
143
144 virtual SEConditionManager& GetConditions() const;
145
146 virtual SEEventManager& GetEvents() const;
147
148 virtual CircuitManager& GetCircuits() const;
149
150 virtual CompartmentManager& GetCompartments() const;
151
152 virtual BlackBoxManager& GetBlackBoxes() const;
153
154 virtual const PulseConfiguration& GetConfiguration() const;
155
156 virtual double GetTimeStep_s() const;
157 virtual const SEScalarTime& GetTimeStep() const;
158 virtual const SEScalarTime& GetEngineTime() const;
159 virtual const SEScalarTime& GetSimulationTime() const;
160 virtual double GetSimulationTime_s() const;
161 virtual const SEScalarTime& GetStabilizationTime() const;
162
163 virtual bool IsAirwayModeSupported(eAirwayMode /*mode*/) { return true; }
164 virtual eAirwayMode GetAirwayMode() const { return m_AirwayMode; }
165 virtual void SetAirwayMode(eAirwayMode mode);
166
167 virtual eSwitch GetIntubation() const { return m_Intubation; }
168
169 virtual void SetAdvanceHandler(SEAdvanceHandler* handler) { m_AdvanceHandler = handler; }
170
171 virtual const SEScalarProperties& GetOverrides() const;
172
173 std::stringstream m_ss;
174 protected:
175 virtual void SetupTracker();
176
177 EngineState m_State;
178 eEngineInitializationState m_EngineInitializationState;
179 SEScalarTime m_CurrentTime;
180 SEScalarTime m_SimulationTime;
181 SEScalarTime m_StabilizationTime;
182 double m_SpareAdvanceTime_s;
183 eAirwayMode m_AirwayMode;
184 eSwitch m_Intubation;
185
186 PulseConfiguration* m_Config = nullptr;
187
188 SEDataRequested* m_DataRequested = nullptr;
189 SEEngineTracker* m_EngineTracker = nullptr;
190
191 SaturationCalculator* m_SaturationCalculator = nullptr;
192
193 SubstanceManager* m_Substances = nullptr;
194
195 SEActionManager* m_Actions = nullptr;
196 SEConditionManager* m_Conditions = nullptr;
197 CircuitManager* m_Circuits = nullptr;
198 CompartmentManager* m_Compartments = nullptr;
199 BlackBoxManager* m_BlackBoxes = nullptr;
200
201 EnvironmentModel* m_EnvironmentModel = nullptr;
202
203 BloodChemistryModel* m_BloodChemistryModel = nullptr;
204 CardiovascularModel* m_CardiovascularModel = nullptr;
205 EndocrineModel* m_EndocrineModel = nullptr;
206 EnergyModel* m_EnergyModel = nullptr;
207 GastrointestinalModel* m_GastrointestinalModel = nullptr;
208 HepaticModel* m_HepaticModel = nullptr;
209 NervousModel* m_NervousModel = nullptr;
210 RenalModel* m_RenalModel = nullptr;
211 RespiratoryModel* m_RespiratoryModel = nullptr;
212 DrugModel* m_DrugModel = nullptr;
213 TissueModel* m_TissueModel = nullptr;
214
215 AnesthesiaMachineModel* m_AnesthesiaMachineModel = nullptr;
216 BagValveMaskModel* m_BagValveMaskModel = nullptr;
217 ExtracorporealMembraneOxygenationDeviceModel* m_ExtracorporealMembraneOxygenationDeviceModel = nullptr;
218 ElectroCardioGramModel* m_ElectroCardioGramModel = nullptr;
219 InhalerModel* m_InhalerModel = nullptr;
220 MechanicalVentilatorModel* m_MechanicalVentilatorModel = nullptr;
221
222 SEPatient* m_InitialPatient = nullptr;
223 SEPatient* m_CurrentPatient = nullptr;
224
225 SEEventManager* m_EventManager = nullptr;
226 LoggerForward* m_LogForward = nullptr;
227
228 SEAdvanceHandler* m_AdvanceHandler = nullptr;
229
230 std::string m_DataDir;
231
232 SEScalarProperties m_ScalarOverrides;
233 protected:
234 std::vector<pulse::Model*> m_Models;
235 };
236
240 class PULSE_DECL Controller : public Data
241 {
242 friend class Engine;
243 friend class EngineTest;
244 friend class PBState;//friend the serialization class
245 protected:// Create via Engine
246 Controller(Logger* logger = nullptr);
247 public:
248 virtual ~Controller();
249
250 virtual Data& GetData() { return (*this); }
251 virtual const Data& GetData() const { return (*this); }
252
253 virtual bool SerializeFromFile(const std::string& file, const SEDataRequestManager* drMgr=nullptr);
254 virtual bool SerializeToFile(const std::string& file) const;
255
256 virtual bool SerializeFromString(const std::string& state, eSerializationFormat m, const SEDataRequestManager* drMgr=nullptr);
257 virtual bool SerializeToString(std::string& state, eSerializationFormat m) const;
258
259 virtual bool InitializeEngine(const SEPatientConfiguration& patient_configuration, const SEDataRequestManager* drMgr=nullptr);
260 virtual bool IsReady() const;
261 virtual eEngineInitializationState GetInitializationState() const;
262
263 virtual void Clear();
264
265 virtual bool SetConfigurationOverride(const SEEngineConfiguration* config);
266
267 virtual void SetSimulationTime(const SEScalarTime& time);
268
269 virtual bool AdvanceModelTime();
270 virtual bool AdvanceModelTime(double time, const TimeUnit& unit);
271 virtual bool ProcessAction(const SEAction& action);
272
273 virtual bool GetPatientAssessment(SEPatientAssessment& assessment) const = 0;
274
275 virtual bool CreateCircuitsAndCompartments();
276
277 virtual void CheckIntubation();
278 protected:
279 virtual std::string GetTypeName() const = 0;
280 virtual void LogBuildInfo() const;
281 // Setup Circuit/Compartments for systems
282
283 // Default/Optimal Cardiovascular
284 virtual void SetupCardiovascular();
285 virtual void SetupRenal();
286 virtual void SetupTissue();
287 virtual void SetupCerebrospinalFluid();
288
289 // Optional ComputationalLife Expansion Setup Methods
290 virtual void SetupComputationalLifeCardiovascular();
291 virtual void SetupComputationalLifeRenal();
292 virtual void SetupComputationalLifeTissue();
293 virtual void SetupComputationalLifeCerebrospinalFluid();
294
295 // Default/Optimal Gastrointestinal
296 virtual void SetupGastrointestinal();
297
298 // Default/Optimal Respiratory
299 virtual void SetupRespiratory();
300
301 // Optional Expanded Lungs Respiratory and Cardiovascular Circuit Setup Methods
302 virtual void SetupExpandedLungsRespiratory();
303 virtual void SetupExpandedLungsCardiovascular();
304
305 // Default/Optimal Equipment
306 virtual void SetupAnesthesiaMachine();
307 virtual void SetupBagValveMask();
308 virtual void SetupExtracorporealMembraneOxygenationDevice();
309 virtual void SetupInhaler();
310 virtual void SetupMechanicalVentilation();
311 virtual void SetupMechanicalVentilator();
312 virtual void SetupNasalCannula();
313 virtual void SetupSimpleMask();
314 virtual void SetupNonRebreatherMask();
315
316 // Default/Optimal Energy
317 virtual void SetupExternalTemperature();
318 virtual void SetupInternalTemperature();
319
320 virtual bool OverrideCircuits();
321 virtual bool ModifyCircuits(const SEScalarProperties& modifiers);
322
323 virtual bool Initialize(const SEPatient& patient, bool ignoreBoundsChecks=false);
324 virtual bool Stabilize(const SEPatientConfiguration& patient_configuration);
325 virtual void LogPatientStabilizationDiffs();
326
327 // Allocate all the models this engine supports
328 virtual void Allocate();
329 virtual bool SetupPatient(const SEPatient& patient) = 0;
330 // Based on what modles are used, setup order for the following
331 virtual void InitializeModels();
332 // Notify Models that steady state has been achieved
333 virtual void AtSteadyState(EngineState state);
334 virtual void PreProcess();
335 virtual void Process();
336 virtual void PostProcess();
337
338 PulseConfiguration const*m_ConfigOverride = nullptr;
339 StabilizationController *m_Stabilizer = nullptr;
340 eSwitch m_Tracking = eSwitch::On;
341 };
342
343 class PULSE_DECL StabilizationController : public SEEngineStabilization::Controller
344 {
345 public:
346 StabilizationController(pulse::Controller& pc) : _pc(pc) {}
347 virtual ~StabilizationController() = default;
348
349 bool AdvanceTime() override { return _pc.AdvanceModelTime(); }
350 SEEngineTracker* GetEngineTracker() override
351 {
352 return &_pc.GetData().GetEngineTracker();
353 }
354 double GetTimeStep(const TimeUnit& unit) override
355 {
356 return _pc.GetData().GetTimeStep().GetValue(unit);
357 }
358 double GetSimulationTime(const TimeUnit& unit) override
359 {
360 return _pc.GetData().GetSimulationTime().GetValue(unit);
361 }
362
363 protected:
364 pulse::Controller& _pc;
365 };
366
367 class FatalListner : public LoggerForward
368 {
369 public:
370 FatalListner(SEEventManager& mgr) : m_Events(mgr) {};
371 ~FatalListner() = default;
372
373 void ForwardDebug(const std::string& /*msg*/) override { }
374 void ForwardInfo(const std::string& /*msg*/) override { }
375 void ForwardWarning(const std::string& /*msg*/) override { }
376 void ForwardError(const std::string& /*msg*/) override { }
377 void ForwardFatal(const std::string& /*msg*/) override
378 {
379 m_Events.SetEvent(eEvent::IrreversibleState, true);
380 }
381
382 protected:
383 SEEventManager& m_Events;
384 };
385END_NAMESPACE
Definition: DataTrack.h:17
Definition: Logger.h:23
Definition: Logger.h:60
Definition: Logger.h:71
Pulse specific configuration parameters for all systems/equipment
Definition: PulseConfiguration.h:20
Definition: SEAction.h:14
Definition: SEActionManager.h:12
Definition: SEAdvanceHandler.h:8
Definition: SEAnesthesiaMachine.h:24
Definition: SEBagValveMask.h:14
Definition: SEBloodChemistrySystem.h:10
Definition: SECardiovascularSystem.h:27
Definition: SEConditionManager.h:26
Definition: SEDataRequestManager.h:10
Definition: SEDataRequested.h:11
Definition: SEDrugSystem.h:9
Definition: SEElectroCardioGram.h:9
Definition: SEEndocrineSystem.h:8
Definition: SEEnergySystem.h:8
Definition: SEEngineConfiguration.h:8
Definition: SEEngineStabilization.h:19
Definition: SEDataRequestTracker.h:102
double GetValue(size_t idx) const override
Definition: SEDataRequestTracker.cpp:207
Definition: SEEnvironment.h:13
Definition: SEEventManager.h:131
Definition: SEExtracorporealMembraneOxygenationDevice.h:10
Definition: SEGastrointestinalSystem.h:9
Definition: SEHepaticSystem.h:8
Definition: SEInhaler.h:12
Definition: SEMechanicalVentilator.h:10
Definition: SENervousSystem.h:9
Data formed at a level of a clinicians report. This is high level data, such as a mean or generalized...
Definition: SEPatientAssessment.h:22
Definition: SEPatientConfiguration.h:11
Definition: SEPatient.h:13
Definition: SERenalSystem.h:8
Definition: SERespiratorySystem.h:44
Definition: SEScalarTime.h:28
Definition: SETissueSystem.h:8
Definition: SEScalarTime.h:8
Definition: Logger.h:14
const std::string & eAirwayMode_Name(eAirwayMode m)
Definition: PBEnums.cpp:12

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.