PhysiologyEngineDynamicStabilization.h
1 /**************************************************************************************
2 Copyright 2015 Applied Research Associates, Inc.
3 Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4 this file except in compliance with the License. You may obtain a copy of the License
5 at:
6 http://www.apache.org/licenses/LICENSE-2.0
7 Unless required by applicable law or agreed to in writing, software distributed under
8 the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9 CONDITIONS OF ANY KIND, either express or implied. See the License for the
10 specific language governing permissions and limitations under the License.
11 **************************************************************************************/
12 
13 #pragma once
14 
15 #include <biogears/cdm/engine/PhysiologyEngineStabilization.h>
16 #include <biogears/cdm/engine/PhysiologyEngineTrack.h>
17 #include <biogears/schema/biogears/BioGears.hxx>
18 
19 namespace biogears {
20 class TimeUnit;
21 class PhysiologyEngineDynamicStabilizationCriteria;
22 
23 class BIOGEARS_API PropertyConvergence : public Loggable {
25 
26 protected:
28 
29 public:
30  virtual ~PropertyConvergence();
31 
32  bool Test(double time_s);
33 
34  double GetPercentError() const;
35  double GetLastPercentError() const;
36  double GetLastErrorTime_s() const;
37  double GetCurrentTarget() const;
38  SEDataRequest& GetDataRequest() const;
39  bool IsOptional() const;
40  void SetOptional(bool b);
41 
42  void TrackScalar(const SEScalar& s);
43  SEDataRequestScalar& GetDataRequestScalar();
44 
45 protected:
48 
49  bool m_Optional;
50  double m_Target;
51  double m_Error;
52  double m_LastError;
54  std::stringstream m_ss;
55 };
56 
58 CDM_BIND_DECL(PhysiologyEngineDynamicStabilizationCriteriaData)
61 
62 public:
64 
66 
67  virtual void Clear();
68 
69  virtual bool Load(const CDM::PhysiologyEngineDynamicStabilizationCriteriaData& in);
71 
72 protected:
73  virtual void Unload(CDM::PhysiologyEngineDynamicStabilizationCriteriaData& data) const;
74 
75 public:
76  virtual std::string GetName() const;
77  virtual const char* GetName_cStr() const;
78  virtual void SetName(const char* name);
79  virtual void SetName(const std::string& name);
80  virtual bool HasName() const;
81  virtual void InvalidateName();
82 
83  virtual bool HasConvergenceTime() const;
84  virtual SEScalarTime& GetConvergenceTime();
85  virtual double GetConvergenceTime(const TimeUnit& unit) const;
86 
87  virtual bool HasMinimumReactionTime() const;
88  virtual SEScalarTime& GetMinimumReactionTime();
89  virtual double GetMinimumReactionTime(const TimeUnit& unit) const;
90 
91  virtual bool HasMaximumAllowedStabilizationTime() const;
92  virtual SEScalarTime& GetMaximumAllowedStabilizationTime();
93  virtual double GetMaximumAllowedStabilizationTime(const TimeUnit& unit) const;
94 
95  virtual const std::vector<PropertyConvergence*>& GetPropertyConvergence() const;
96  virtual PropertyConvergence& CreateSystemPropertyConvergence(double percentError, const char* name);
97  virtual PropertyConvergence& CreateSystemPropertyConvergence(double percentError, const std::string& name);
98 
99  virtual PropertyConvergence& CreateGasCompartmentPropertyConvergence(double percentError, const char* cmpt, const char* name);
100  virtual PropertyConvergence& CreateGasCompartmentPropertyConvergence(double percentError, const std::string& cmpt, const std::string& name);
101  virtual PropertyConvergence& CreateGasCompartmentPropertyConvergence(double percentError, const char* cmpt, SESubstance& substance, const char* name);
102  virtual PropertyConvergence& CreateGasCompartmentPropertyConvergence(double percentError, const std::string& cmpt, SESubstance& substance, const std::string& name);
103  virtual PropertyConvergence& CreateLiquidCompartmentPropertyConvergence(double percentError, const char* cmpt, const char* name);
104  virtual PropertyConvergence& CreateLiquidCompartmentPropertyConvergence(double percentError, const std::string& cmpt, const std::string& name);
105  virtual PropertyConvergence& CreateLiquidCompartmentPropertyConvergence(double percentError, const char* cmpt, SESubstance& substance, const char* name);
106  virtual PropertyConvergence& CreateLiquidCompartmentPropertyConvergence(double percentError, const std::string& cmpt, SESubstance& substance, const std::string& name);
107  virtual PropertyConvergence& CreateThermalCompartmentPropertyConvergence(double percentError, const char* cmpt, const char* name);
108  virtual PropertyConvergence& CreateThermalCompartmentPropertyConvergence(double percentError, const std::string& cmpt, const std::string& name);
109  virtual PropertyConvergence& CreateTissueCompartmentPropertyConvergence(double percentError, const char* cmpt, const char* name);
110  virtual PropertyConvergence& CreateTissueCompartmentPropertyConvergence(double percentError, const std::string& cmpt, const std::string& name);
111 
112 protected:
113  std::string m_Name;
117 
119  std::vector<PropertyConvergence*> m_PropertyConvergence;
120 };
121 
122 class BIOGEARS_API PhysiologyEngineDynamicStabilizer : public Loggable {
123 public:
126 
127  virtual void Converge();
128  virtual bool HasConverged() { return m_converged; }
129  virtual bool HasConvergedOptional() { return m_convergedOptional; }
130  virtual bool HasExceededTime() { return m_exceededTime; }
131 
132 protected:
137  double m_dT_s;
138  double m_totTime_s; // Total time we have been converging
139  double m_covTime_s; // Convergence Window Length
140  double m_minTime_s; // Minimum amount of time to run before testing
141  double m_maxTime_s; // Maximum amount of time to run before we quit
142  double m_passTime_s;
144 
145  const std::vector<PropertyConvergence*>& m_properties;
146 };
147 
148 CDM_BIND_DECL(PhysiologyEngineDynamicStabilizationData)
150 public:
153 
154  virtual void Clear() override;
155 
156  virtual bool Load(const CDM::PhysiologyEngineDynamicStabilizationData& in);
157  virtual CDM::PhysiologyEngineDynamicStabilizationData* Unload() const override;
158 
159 protected:
160  virtual void Unload(CDM::PhysiologyEngineDynamicStabilizationData& data) const;
161 
162 public:
163  virtual bool Load(const char* file) override;
164  virtual bool Load(const std::string& file) override;
165 
166  virtual bool StabilizeRestingState(PhysiologyEngine& engine) override;
167  virtual bool StabilizeFeedbackState(PhysiologyEngine& engine) override;
168  virtual bool StabilizeConditions(PhysiologyEngine& engine, const std::vector<const SECondition*>& conditions) override;
169 
170  virtual PhysiologyEngineDynamicStabilizationCriteria& GetRestingCriteria();
171  virtual const PhysiologyEngineDynamicStabilizationCriteria& GetRestingCriteria() const;
172 
173  virtual bool HasFeedbackCriteria() const;
174  virtual PhysiologyEngineDynamicStabilizationCriteria& GetFeedbackCriteria();
175  virtual const PhysiologyEngineDynamicStabilizationCriteria* GetFeedbackCriteria() const;
176 
177  virtual void RemoveConditionCriteria(const char* name);
178  virtual void RemoveConditionCriteria(const std::string& name);
179  virtual void AddConditionCriteria(PhysiologyEngineDynamicStabilizationCriteria& criteria);
180  virtual const std::vector<PhysiologyEngineDynamicStabilizationCriteria*>& GetConditionCriteria() const;
181  virtual PhysiologyEngineDynamicStabilizationCriteria* GetConditionCriteria(const char* name) const;
182  virtual PhysiologyEngineDynamicStabilizationCriteria* GetConditionCriteria(const std::string& name) const;
183 
184 protected:
185  virtual bool Stabilize(PhysiologyEngine& engine, const PhysiologyEngineDynamicStabilizationCriteria& criteria);
186 
189  std::vector<PhysiologyEngineDynamicStabilizationCriteria*> m_ConditionCriteria;
190 
191  bool Merge();
193  std::vector<PhysiologyEngineDynamicStabilizationCriteria*> m_ActiveConditions;
194 
195 };
196 }
double m_maxTime_s
Definition: PhysiologyEngineDynamicStabilization.h:141
Definition: PhysiologyEngineTrack.h:49
friend PhysiologyEngineDynamicStabilization
Definition: PhysiologyEngineDynamicStabilization.h:60
friend PhysiologyEngineDynamicStabilizationCriteria
Definition: PhysiologyEngineDynamicStabilization.h:24
Definition: SEScalar.h:33
double m_covTime_s
Definition: PhysiologyEngineDynamicStabilization.h:139
double m_passTime_s
Definition: PhysiologyEngineDynamicStabilization.h:142
virtual bool HasConverged()
Definition: PhysiologyEngineDynamicStabilization.h:128
Class corresponding to the PhysiologyEngineDynamicStabilizationData schema type.
Definition: EngineConfiguration.hxx:1959
SEDataRequest & m_DataRequest
Definition: PhysiologyEngineDynamicStabilization.h:46
SEScalarTime * m_ConvergenceTime
Definition: PhysiologyEngineDynamicStabilization.h:114
Definition: PhysiologyEngineDynamicStabilization.h:23
virtual ~PhysiologyEngineDynamicStabilizer()
Definition: PhysiologyEngineDynamicStabilization.h:125
bool m_hasOptionalProperties
Definition: PhysiologyEngineDynamicStabilization.h:136
double m_Error
Definition: PhysiologyEngineDynamicStabilization.h:51
Definition: PhysiologyEngineDynamicStabilization.h:59
PhysiologyEngineDynamicStabilizationCriteria m_RestingCriteria
Definition: PhysiologyEngineDynamicStabilization.h:187
std::vector< PhysiologyEngineDynamicStabilizationCriteria * > m_ActiveConditions
Definition: PhysiologyEngineDynamicStabilization.h:193
Definition: PhysiologyEngineDynamicStabilization.h:122
std::vector< PhysiologyEngineDynamicStabilizationCriteria * > m_ConditionCriteria
Definition: PhysiologyEngineDynamicStabilization.h:189
Definition: Logger.h:27
SEScalarTime * m_MinimumReactionTime
Definition: PhysiologyEngineDynamicStabilization.h:115
PhysiologyEngineDynamicStabilizationCriteria * m_FeedbackCriteria
Definition: PhysiologyEngineDynamicStabilization.h:188
Definition: Logger.h:75
bool m_converged
Definition: PhysiologyEngineDynamicStabilization.h:133
Definition: PhysiologyEngine.h:68
bool m_exceededTime
Definition: PhysiologyEngineDynamicStabilization.h:135
double m_optsPassTime_s
Definition: PhysiologyEngineDynamicStabilization.h:143
double m_dT_s
Definition: PhysiologyEngineDynamicStabilization.h:137
Definition: SEScalarTime.h:37
Definition: SEScalarTime.h:18
std::stringstream m_ss
Definition: PhysiologyEngineDynamicStabilization.h:54
std::vector< PropertyConvergence * > m_PropertyConvergence
Definition: PhysiologyEngineDynamicStabilization.h:119
bool m_convergedOptional
Definition: PhysiologyEngineDynamicStabilization.h:134
double m_LastError
Definition: PhysiologyEngineDynamicStabilization.h:52
PhysiologyEngineDynamicStabilizationCriteria m_MergedConditions
Definition: PhysiologyEngineDynamicStabilization.h:192
virtual bool HasExceededTime()
Definition: PhysiologyEngineDynamicStabilization.h:130
virtual bool HasConvergedOptional()
Definition: PhysiologyEngineDynamicStabilization.h:129
Definition: PhysiologyEngineStabilization.h:28
Definition: SEDataRequestManager.h:30
double m_Target
Definition: PhysiologyEngineDynamicStabilization.h:50
Definition: SESubstance.h:49
bool m_Optional
Definition: PhysiologyEngineDynamicStabilization.h:49
SEScalarTime * m_MaximumAllowedStabilizationTime
Definition: PhysiologyEngineDynamicStabilization.h:116
double m_LastErrorTime_s
Definition: PhysiologyEngineDynamicStabilization.h:53
std::string m_Name
Definition: PhysiologyEngineDynamicStabilization.h:113
Definition: SEDataRequest.h:25
Class corresponding to the PhysiologyEngineDynamicStabilizationCriteriaData schema type...
Definition: EngineConfiguration.hxx:2443
double m_totTime_s
Definition: PhysiologyEngineDynamicStabilization.h:138
SEDataRequestManager m_DataRequestMgr
Definition: PhysiologyEngineDynamicStabilization.h:118
Definition: SEElectricalCircuit.h:18
Definition: PhysiologyEngineDynamicStabilization.h:149
double m_minTime_s
Definition: PhysiologyEngineDynamicStabilization.h:140
SEDataRequestScalar m_DataRequestScalar
Definition: PhysiologyEngineDynamicStabilization.h:47
const std::vector< PropertyConvergence * > & m_properties
Definition: PhysiologyEngineDynamicStabilization.h:145