← Documentation
ADS-IDAC Engine 5.0.0
DiagnosisActionModule.cpp
Go to the documentation of this file.
1// DiagnosisActionModule.cpp: implementation of the DiagnosisActionModule class.
2//
4
6#include "Operator.h"
7#include "../ControlPanel/ControlPanel.h"
8#include <boost/serialization/export.hpp>
9#include "../Global/SimulationContext.h"
10#include <boost/archive/binary_oarchive.hpp>
11#include <boost/archive/binary_iarchive.hpp>
12BOOST_CLASS_EXPORT_IMPLEMENT(DiagnosisActionModule)
13using namespace std;
14
15
17// Construction/Destruction
19
21{
23
24}
25
27{
29}
30
32{
33 this->event_list.clear();
34}
35
38
40{
41 string str;
42 int i;
43 ifstream fin(_filename.c_str(), ios::in);
44 if(!fin.is_open()){
45 cout << "File: " << _filename << " cound not be found" << endl;
46 ofstream fout("err messages.txt", ios::app);
47 fout << r5pars_.timesno << " File: " << _filename << " cound not be found\n";
48 fout.close();
49 }
50 else {
51 fin >> str >> number_of_diagnoses;
52 for (i = 0 ; i != number_of_diagnoses ; i++ )
53 {
54 auto pt = std::make_unique<DiagnosisActionUnit>();
55 pt->readDiagnosisActionUnitInfoFromFile(fin);
56 this->event_list.push_back(std::move(pt));
57 }
58 fin.close();
59 }
60}
61
63{
64 bool branch_generated = false;
65 DiagnosisActionUnit *priority_diagnosis = 0;
66 DiagnosisComponentActionUnit *action_ptr = 0;
67 BranchAction *branch_action = 0;
68 MentalParameterValue *mpv_pt = 0;
69 SystemControl * sc_ptr = 0;
70 ControlValue * control_value_ptr = 0;
71 int receiver = sim::Operator::OAT;
72 int branch_number;
73 double time, delay_time;
74 double control_value = 0.0;
75 string str;
76 if (_operator.getTypeOfOperator() == sim::Operator::OAT) {receiver = sim::Source::Plant;}
77 //
78 // find high priority diagnosis for action
79 priority_diagnosis = this->getPtrToHighPriorityDiagnosisActionUnit(_diagnosis);
80 if (priority_diagnosis != 0) {
81 branch_generated = priority_diagnosis->setPtrToHighPriorityAction(_operator, _stm);
82 if (branch_generated) {
83 return branch_generated;
84 }
85 else if (priority_diagnosis->getActionPrereqsEvaluated()) // no new branch generated - check if all necessary action prerequisistes have been evaluated
86 {
87 action_ptr = priority_diagnosis->getPriorityActionPtr();
88 if (action_ptr != 0)
89 {
90 //
91 if(action_ptr->getPrerequisiteState() == sim::State::Succeed)
92 {
93 // post message for execution of knowledge based action
94 str = "Execute Knowledge Based Action: ";
95 str += action_ptr->getInfoName();
98 g_sim.Aux_info.addRecord(str,branch_number);
99 //
100 branch_action = new BranchAction;
101 branch_action->setActionName(action_ptr->getInfoName());
102 branch_action->setSenderAndReceiver(_operator.getTypeOfOperator(), receiver);
104 //
105 time = 5.0;
106 branch_action->setActionTime(time);
107 branch_action->setTimerAndProbability(time, 1.0 - _operator.hfe_bbn.getDiagnosisFailureProbability());
108 //
109 // determine control value setting for action
110 switch (action_ptr->getActionType()) {
111 //
114 sc_ptr = g_sim.Indicator.controls.getControlFromMap(action_ptr->getInfoName());
115 if (sc_ptr != 0) {
116 control_value_ptr = (ControlValue *) sc_ptr;
117 if (mpv_pt!= 0 && sc_ptr->getTypeOfControl()==DisplayType::ControlValue)
118 {
119 control_value = mpv_pt->getObservedParameterValue();
120 control_value = fmin(control_value, control_value_ptr->getValueForOnOrFullyOpen());
121 control_value = fmax(control_value, control_value_ptr->getValueForOffOrFullyClose());
122 }
123 else // control parameter has not been perceived, do not change control value
124 {
125 control_value = control_value_ptr->getControlValue();
126 //
127 ofstream fout("err messages.txt", ios::app);
128 cout << "DiagnosisActionModule::onceThroughProcessForReasoningStrategy - Parameter: " << action_ptr->getControlParameterName() << " has not been perceived" << endl;
129 fout << r5pars_.timesno << " DiagnosisActionModule::onceThroughProcessForReasoningStrategy - Parameter: " << action_ptr->getControlParameterName() << " has not been perceived\n";
130 fout.close();
131 }
132 } else { // control not found on control panel
133 ofstream fout("err messages.txt", ios::app);
134 cout << "DiagnosisActionModule::onceThroughProcessForReasoningStrategy - Control: " << action_ptr->getInfoName() << " can not be recognized" << endl;
135 fout << r5pars_.timesno << " DiagnosisActionModule::onceThroughProcessForReasoningStrategy - Control: " << action_ptr->getInfoName() << " can not be recognized\n";
136 fout.close();
137 r5pars_.sim_err = true;
138 g_sim.Branch_center.setTempESMessage("DiagnosisActionModule::onceThroughProcessForReasoningStrategy error");
140 }
141 break;
142 //
144 sc_ptr = g_sim.Indicator.controls.getControlFromMap(action_ptr->getInfoName());
145 if (sc_ptr != 0)
146 {
148 control_value_ptr = (ControlValue *) sc_ptr;
149 // Displayed control value may differ from actual control value due to perception filtering
150 // control_value = control_value_ptr->getDisplayedControlValue();
151 control_value = control_value_ptr->getControlValue();
152 control_value += action_ptr->getControlInput();
153 // verify that control value does not exceeed component control range
154 control_value = fmin(control_value, control_value_ptr->getValueForOnOrFullyOpen());
155 control_value = fmax(control_value, control_value_ptr->getValueForOffOrFullyClose());
156 }
157 } else // control not found on control panel
158 {
159 ofstream fout("err messages.txt", ios::app);
160 cout << "DiagnosisActionModule::onceThroughProcessForReasoningStrategy - Control: " << action_ptr->getInfoName() << " can not be recognized" << endl;
161 fout << r5pars_.timesno << " DiagnosisActionModule::onceThroughProcessForReasoningStrategy - Control: " << action_ptr->getInfoName() << " can not be recognized\n";
162 fout.close();
163 r5pars_.sim_err = true;
164 g_sim.Branch_center.setTempESMessage("DiagnosisActionModule::onceThroughProcessForReasoningStrategy error");
166 }
167 break;
168 //
170 control_value = action_ptr->getControlInput();
171 break;
172 //
173 default:
174 break;
175 }
176 //
177 branch_action->setControlValue(control_value);
178 g_sim.Branch_center.addAction(_operator.getTypeOfOperator(), branch_action);
179 //
180 branch_generated = true;
181 //
182
183 } // end - add action branch
184 else
185 {
186 // post message that knowledge based action prereqs not met
187 str = "Prerequisites for Knowledge Based Action: ";
188 str += action_ptr->getInfoName();
189 str += " have not been met.";
192 g_sim.Aux_info.addRecord(str,branch_number);
193 //
194 }
195 } // end - high priority action found
196 else {
197 // reset delay time if no action can be performed
198 delay_time = priority_diagnosis->reset_delay_time.calculateMeanRequiredTime();
199 priority_diagnosis->reset_delay_time.setRemainingTime(r5pars_.timesno + delay_time);
200 }
201 priority_diagnosis->resetDiagnosisActionUnit();
202 }
203 } // end - high priority diagnosis found
204
205 return branch_generated;
206}
207
208
210{
211 DiagnosisActionUnit *priority_diagnosis = nullptr;
212 bool diagnosis_found = false;
213 int highest_priority = 100;
214 double event_confidence;
215 double delay_time;
216 double highest_confidence = 0.5;
217 //
218 // determine if there is a currently active diagnosis
219 auto diagnosis_itr = this->event_list.begin();
220 while (diagnosis_itr != event_list.end() && !diagnosis_found) {
221 if ((*diagnosis_itr)->getStateOfActivation() == sim::State::Active)
222 {
223 priority_diagnosis = diagnosis_itr->get();
224 diagnosis_found = true;
225 }
226 else {
227 diagnosis_itr++;
228 }
229 }
230 // if there is no active diagnosis, search for new diagnosis
231 if (!diagnosis_found)
232 {
233 for (auto& elem : event_list)
234 {
235 event_confidence = _diagnosis.getEventRationalConfidence(elem->getDiagnosisName());
236 if ( event_confidence > highest_confidence &&
237 elem->reset_delay_time.getRemainingTime() < r5pars_.timesno &&
238 elem->getDiagnosisPriority() < highest_priority )
239 {
240 if (elem->action_list.size() > 0) {
241 priority_diagnosis = elem.get();
242 highest_confidence = event_confidence;
243 highest_priority = elem->getDiagnosisPriority();
244 }
245 }
246 }
247 if (priority_diagnosis) {
248 priority_diagnosis->setStateOfActivation(sim::State::Active);
249 delay_time = priority_diagnosis->reset_delay_time.calculateMeanRequiredTime();
250 priority_diagnosis->reset_delay_time.setRemainingTime(r5pars_.timesno + delay_time);
251 }
252 }
253 return priority_diagnosis;
254}
255
257{
259 for (auto& src : _dam.event_list)
260 {
261 auto pt = std::make_unique<DiagnosisActionUnit>();
262 pt->copyDiagnosisActionUnit(*src);
263 event_list.push_back(std::move(pt));
264 }
265}
266
268{
269 fout << "DiagnosisActionUnit" << '\n';
270 fout << number_of_diagnoses << '\n';
271 for(auto& elem : this->event_list)
272 {
273 elem->saveDiagnosisActionUnitToFile(fout);
274 }
275}
276
278{
279 int i;
280 string str;
281 fin >> str;
282 fin >> number_of_diagnoses;
283 for ( i = 0 ; i < number_of_diagnoses ; i++ )
284 {
285 auto pt = std::make_unique<DiagnosisActionUnit>();
286 pt->retreiveDiagnosisActionUnitFromFile(fin);
287 this->event_list.push_back(std::move(pt));
288 }
289}
Base class for all crew members — cognitive processing loops, mental model, and knowledge base.
SimulationContext g_sim
Global simulation context: the single instance, defined in SimulationContext.cpp.
void addRecord(std::string, int)
void setActionTime(double)
void setTempTypeOfConsequence(Consequence)
Stores the consequence of the end state the running sequence will get.
void addAction(int, BranchAction *)
int getIDOfRecentGeneratedBranch()
void setTempESMessage(std::string)
Stores the description of the end state the running sequence will get if it is terminated (set by mod...
void displayInformation(std::string strInformation)
void setSenderAndReceiver(int, int)
void setTypeOfPauseActivity(int)
void setControlValue(double)
double getControlValue()
double getValueForOnOrFullyOpen()
double getValueForOffOrFullyClose()
SystemControl * getControlFromMap(std::string)
ControlPanelControl controls
Definition: ControlPanel.h:54
void setActionName(std::string)
void retreiveDiagnosisActionModuleFromFile(std::ifstream &)
void copyDiagnosisActionModule(DiagnosisActionModule &)
void saveDiagnosisActionModuleToFile(std::ofstream &)
std::vector< std::unique_ptr< DiagnosisActionUnit > > event_list
DiagnosisActionUnit * getPtrToHighPriorityDiagnosisActionUnit(EventSymptomMatrix &)
void readDiagnosisActionModuleInfoFromFile(std::string)
bool onceThroughProcessForReasoningStrategy(Operator &, ShortTermMemory &, EventSymptomMatrix &)
DiagnosisComponentActionUnit * getPriorityActionPtr()
bool setPtrToHighPriorityAction(Operator &, ShortTermMemory &)
double getEventRationalConfidence(std::string)
MentalParameterValue * checkExistanceOfPerceivedParameterValue(std::string)
Definition: InfoChunk.cpp:921
std::string getInfoName()
Definition: KBElement.cpp:26
int getTypeOfOperator()
Definition: Operator.cpp:59
HumanFailureEventsBBN hfe_bbn
Definition: Operator.h:136
InfoChunk perceived_info
void setStateOfActivation(int)
DisplayType getTypeOfControl()
void setTimerAndProbability(double, double)
void setRemainingTime(double)
Definition: Timer.cpp:30
double calculateMeanRequiredTime()
Definition: Timer.cpp:131
struct @0 r5pars_
constexpr int Action
Definition: SimConstants.h:199
constexpr int Additive
Definition: SimConstants.h:236
constexpr int ParameterControl
Definition: SimConstants.h:251
constexpr int OAT
Definition: SimConstants.h:144
constexpr int Plant
Definition: SimConstants.h:135
constexpr int Succeed
Definition: SimConstants.h:104
constexpr int Active
Definition: SimConstants.h:118
constexpr int InductiveDeductive
Definition: SimConstants.h:176
ControlPanel Indicator
Control room panel state.
CommandControlCenter Command_handler
Command/control dispatch.
AnalysisInfoContainer Aux_info
Analysis records.
BranchRecord Branch_center
Dynamic event tree state.