← Documentation
ADS-IDAC Engine 5.0.0
DiagnosisActionUnit.cpp
Go to the documentation of this file.
1// DiagnosisActionUnit.cpp: implementation of the DiagnosisActionUnit class.
2//
4
6#include "../ControlPanel/ControlPanel.h"
7#include "../Global/SimulationContext.h"
8using namespace std;
9
10
12// Construction/Destruction
14
16{
17 diagnosis_priority = -999;
18 diagnosis_name = "NONE";
19 priority_action_ptr = nullptr;
21}
22
24{
26}
27
29{
30 action_list.clear();
31}
32
39
41
43{
44 string str;
45 double t_min, alpha, beta;
46 int i, num_actions;
47 fin >> str >> diagnosis_name;
48 fin >> str >> diagnosis_priority;
49 fin >> str >> t_min >> alpha >> beta;
50 this->reset_delay_time.setT_Minimum(t_min);
53 //
54 fin >> str >> num_actions;
55 for (i = 0 ; i < num_actions ; i++)
56 {
57 auto comp_action_ptr = make_unique<DiagnosisComponentActionUnit>();
58 comp_action_ptr->readDiagnosisComponentActionUnitInfoFromFile(fin);
59 this->action_list.push_back(std::move(comp_action_ptr));
60 }
61
62}
63
65{
66 auto comp_action_itr = this->action_list.begin();
67 //DecisionAction *perceived_action_ptr = 0;
68 SystemControl *system_control_ptr = 0;
69 MentalParameterValue *mental_value_ptr = 0;
70 bool branch_generated = false;
71 bool evaluate_prereqs;
72 bool no_prereqs;
73 bool control_at_limit;
74 bool control_failed;
75 bool found_action_prereq = false;
76 double current_control_value, new_control_value;
77 int highest_priority = 100;
78 int prereq_state;
79 string str;
80 this->priority_action_ptr = nullptr;
81 this->setActionPrereqsEvaluated(true);
82 //
83 comp_action_itr = this->action_list.begin();
84 while (comp_action_itr != this->action_list.end() && !branch_generated && !found_action_prereq)
85 {
86 //
87 if( (*comp_action_itr)->getPriority() < highest_priority) {
88 //
89 // determine if control input will exceed high or low limits or if control has failed
90 control_at_limit = false;
91 control_failed = false;
92 //perceived_action_ptr = _stm.perceived_info.checkExistanceOfAction((*comp_action_itr)->getInfoName());
93 system_control_ptr = g_sim.Indicator.controls.getControlFromMap((*comp_action_itr)->getInfoName());
94 if (system_control_ptr != 0) {
95 //
96 // determine if new control value will exceed high or low limit
97 //current_control_value = perceived_action_ptr->getPerceivedControlValue();
98 current_control_value = system_control_ptr->getControlValue();
99 switch ((*comp_action_itr)->getActionType()) {
101 new_control_value = current_control_value + (*comp_action_itr)->getControlInput();
102 if (new_control_value < (*comp_action_itr)->getLowerLimit() ||
103 new_control_value > (*comp_action_itr)->getUpperLimit() ||
104 fabs(new_control_value - current_control_value) < 0.0001 ) {
105 control_at_limit = true;
106 }
107 break;
109 mental_value_ptr = _stm.perceived_info.checkExistanceOfPerceivedParameterValue((*comp_action_itr)->getControlParameterName());
110 if (mental_value_ptr != 0 ) {
111 new_control_value = mental_value_ptr->getObservedParameterValue();
112 if (new_control_value < (*comp_action_itr)->getLowerLimit() ||
113 new_control_value > (*comp_action_itr)->getUpperLimit() ||
114 fabs(new_control_value - current_control_value) < 0.0001 ) {
115 control_at_limit = true;
116 }
117 }
118 break;
120 new_control_value = (*comp_action_itr)->getControlInput();
121 if (new_control_value < (*comp_action_itr)->getLowerLimit() ||
122 new_control_value > (*comp_action_itr)->getUpperLimit() ||
123 fabs(new_control_value - current_control_value) < 0.0001 ) {
124 control_at_limit = true;
125 }
126 break;
128 break;
129 default:
130 break;
131 }
132 }
133 if (system_control_ptr->getFunctionalState() == sim::State::FailedP)
134 {
135 control_failed = true;
136 }
137 //
138 if(!control_at_limit && !control_failed) {
139 //
140 if ((*comp_action_itr)->action_prerequisites.size() == 0 ) {
141 no_prereqs = true;
142 } else {
143 no_prereqs = false;
144 }
145 prereq_state = (*comp_action_itr)->getPrerequisiteState();
146 if (!no_prereqs && (prereq_state == sim::None || prereq_state == sim::State::Active))
147 {
148 evaluate_prereqs = true;
149 found_action_prereq = true;
150 this->setActionPrereqsEvaluated(false);
151 } else {
152 evaluate_prereqs = false;
153 }
154 //
155 if(evaluate_prereqs) {
156 //
157 if ((*comp_action_itr)->getPrerequisiteState() == sim::None) {
158 // post message for for the prerequisite evaluation
159 str = "Evaluate Action Prerequisites for diagnosis (";
160 str += this->getDiagnosisName();
161 str += ") action (";
162 str += (*comp_action_itr)->getInfoName();
163 str += ")";
166 //
167 }
168 (*comp_action_itr)->setPrerequisiteState(sim::State::Active);
169 branch_generated = (*comp_action_itr)->assessPrerequisites(_operator, _stm, sim::Strategy::InductiveDeductive);
170 if (branch_generated) {
171 return branch_generated;
172 }
173 } else if (no_prereqs || prereq_state == sim::State::Succeed){
174 highest_priority = (*comp_action_itr)->getPriority();
175 priority_action_ptr = (*comp_action_itr).get();
176 }
177 }
178 }
179 comp_action_itr++;
180 }
181 return branch_generated;
182}
183
185{
187 for (auto& action_item : this->action_list){
188 action_item->resetComponentActionUnit();
189 }
190}
191
193{
198 this->copyStateOfActivation(_dau);
199 for (auto& src : _dau.action_list)
200 {
201 auto action_unit_ptr = make_unique<DiagnosisComponentActionUnit>();
202 action_unit_ptr->copyDiagnosisComponentActionUnit(*src);
203 this->action_list.push_back(std::move(action_unit_ptr));
204 }
205}
206
208{
209 int num_actions;
210 int action_prereqs_flag = 0;
211 fout << diagnosis_name << ' ' << diagnosis_priority << '\n';
212 if (action_prereqs_evaluated) {action_prereqs_flag = 1;}
213 fout << action_prereqs_flag << '\n';
215 this->saveStateOfActivationToFile(fout);
216 num_actions = this->action_list.size();
217 fout << num_actions << '\n';
218 for (auto& action_unit : action_list)
219 {
220 action_unit->saveDiagnosisComponentActionUnitToFile(fout);
221 }
222}
223
225{
226 int i, num_actions;
227 int action_prereqs_flag;
228 //
230 fin >> action_prereqs_flag;
231 if (action_prereqs_flag == 1) {
232 action_prereqs_flag = true;
233 } else {
234 action_prereqs_flag = false;
235 }
238 fin >> num_actions;
239 for ( i = 0 ; i < num_actions ; i++)
240 {
241 auto action_unit_ptr = make_unique<DiagnosisComponentActionUnit>();
242 action_unit_ptr->retrieveDiagnosisComponentActionUnitFromFile(fin);
243 this->action_list.push_back(std::move(action_unit_ptr));
244 }
245}
SimulationContext g_sim
Global simulation context: the single instance, defined in SimulationContext.cpp.
void addRecord(std::string, int)
int getIDOfRecentGeneratedBranch()
void displayInformation(std::string strInformation)
double getControlValue()
SystemControl * getControlFromMap(std::string)
ControlPanelControl controls
Definition: ControlPanel.h:54
DiagnosisComponentActionUnit * getPriorityActionPtr()
DiagnosisComponentActionUnit * priority_action_ptr
void saveDiagnosisActionUnitToFile(std::ofstream &)
void setActionPrereqsEvaluated(bool)
void readDiagnosisActionUnitInfoFromFile(std::ifstream &)
std::vector< std::unique_ptr< DiagnosisComponentActionUnit > > action_list
std::string getDiagnosisName()
void retreiveDiagnosisActionUnitFromFile(std::ifstream &)
void copyDiagnosisActionUnit(DiagnosisActionUnit &)
void setDiagnosisName(std::string)
bool setPtrToHighPriorityAction(Operator &, ShortTermMemory &)
MentalParameterValue * checkExistanceOfPerceivedParameterValue(std::string)
Definition: InfoChunk.cpp:921
InfoChunk perceived_info
void setStateOfActivation(int)
void saveStateOfActivationToFile(std::ofstream &)
void retrieveStateOfActivationFromFile(std::ifstream &)
void copyStateOfActivation(StateOfActivation &)
int getFunctionalState()
void saveTimerToFile(std::ofstream &)
Definition: Timer.cpp:54
void retrieveTimerFromFile(std::ifstream &)
Definition: Timer.cpp:59
void copyTimer(Timer &)
Definition: Timer.cpp:44
void setT_Minimum(double)
Definition: Timer.cpp:38
void setBeta_Weibull(double)
Definition: Timer.cpp:36
void setAlpha_Weibull(double)
Definition: Timer.cpp:34
bool log
Enable/disable rank-specific logging.
constexpr int Action
Definition: SimConstants.h:199
constexpr int Additive
Definition: SimConstants.h:236
constexpr int ParameterControl
Definition: SimConstants.h:251
constexpr int FailedP
Definition: SimConstants.h:115
constexpr int Succeed
Definition: SimConstants.h:104
constexpr int Active
Definition: SimConstants.h:118
constexpr int Control
Definition: SimConstants.h:111
constexpr int InductiveDeductive
Definition: SimConstants.h:176
constexpr int None
Definition: SimConstants.h:75
ControlPanel Indicator
Control room panel state.
CommandControlCenter Command_handler
Command/control dispatch.
AnalysisInfoContainer Aux_info
Analysis records.
BranchRecord Branch_center
Dynamic event tree state.