11 #include<boost/program_options.hpp> 38 namespace Poptions = boost::program_options;
41 const string program(
"dd-symb-diagnose");
44 Poptions::options_description & desc,
45 Poptions::options_description & visible,
46 Poptions::variables_map & vm) {
48 (
"help",
"produce help message")
49 (
"scenario", Poptions::value< string >(),
"scenario file (evts format), mandatory");
51 Poptions::options_description hidden(
"Hidden options");
53 (
"model-file", Poptions::value< vector<string> >(),
"model file (des_comp format)");
54 Poptions::positional_options_description p;
55 p.add(
"model-file", -1);
56 desc.add(visible).add(hidden);
57 Poptions::store(Poptions::command_line_parser(argc, argv).
58 options(desc).positional(p).run(), vm);
64 cout <<
"Command line error: here is the usage\n" 65 <<
program <<
" [model.des_comp]\n" << visible <<
'\n';
75 Poptions::options_description & visible,
76 vector<string> & models,
77 vector<string> & scenarios) {
78 if (vm.count(
"help")) {
79 cout <<
"Usage: " <<
program <<
" [model.des_comp]\n" 83 if (!vm.count(
"model-file")) {
86 auto & modelNames = vm[
"model-file"].as<vector < string >> ();
87 if (modelNames.size() > 1) {
90 if (!vm.count(
"scenario")) {
94 std::regex desCompSuffix(
"[a-zA-Z_][a-zA-Z_0-9]*\\.des_comp");
95 if (!std::regex_match(modelNames[0], desCompSuffix)) {
96 printError(
"Expecting a model file with a name ending with .des_comp");
99 auto & scenarioName = vm[
"scenario"].as<
string>();
100 std::regex evtsSuffix(
"[a-zA-Z_][a-zA-Z_0-9]*\\.evts");
101 if (!std::regex_match(scenarioName, evtsSuffix)) {
102 printError(
"Expecting a scenario file with a name ending with .evts");
104 models.push_back(modelNames[0]);
105 scenarios.push_back(scenarioName);
109 vector<ObservableComponent> & models) {
112 while (result && (index < modelNames.size())) {
114 result = models.back().import(modelNames[index]);
120 bool loadScenario(
const string & scenarioFile, vector<Event> & observations,
121 const vector<ObservableComponent> & models) {
122 ifstream file(scenarioFile);
123 bool result = file.is_open();
125 while (result && file) {
128 if (!label.empty()) {
129 observations.push_back(Event::getEvent(label));
130 result = models[0].containsEvent(observations.back());
145 std::list< std::list<Assignment> > listSolutions;
148 std::cout <<
"Here is the solution:" << std::endl;
151 for (
auto & candidate : listSolutions) {
153 std::cout <<
"Candidate " << counter++ <<
": {";
154 for (
auto & fault : candidate) {
167 auto & state = faultCandidate.
state();
168 auto & faults = faultCandidate.
faults();
171 vector<Lcm::EventInfoId> faultEvents = setManager.
decodeEventSet(faults);
175 std::cout <<
"state = " << locStateInfoManager.
getStateProperty(state) <<
" ";
179 std::cout <<
"faults = ";
180 for (
auto evt : faultEvents) {
181 std::cout << evt <<
"<->" << manager.
getEvent(evt) <<
" ";
190 const vector<Event> & observations) {
203 vector<Lcm::EventInfoId> observables;
204 vector<Lcm::EventInfoId> nonObservables;
208 for (
auto & e : component.
events()) {
210 observables.push_back(manager.
eventId(e.label()));
212 nonObservables.push_back(manager.
eventId(e.label()));
237 encode(result, stateVar, nextStateVar, eventVar, bddMachine);
241 for (
auto & evt : nonObservables) {
242 stringstream evtText;
244 auto & value = eventVar.
getValue(evtText.str());
245 auto & nonObs = nonObservable[0].get();
246 nonObservable.clear();
247 nonObservable.push_back(nonObs || bddMachine.
event(value));
249 auto & nonObs = nonObservable[0].get();
252 string initialStateIdText = stream.str();
254 currentStates.push_back(bddMachine.
sources(stateVar.
getValue(initialStateIdText)));
256 for (
auto & e : observations) {
258 stringstream evtText;
260 auto & value = eventVar.
getValue(evtText.str());
261 auto & obs = bddMachine.
event(value);
262 auto & currentBeliefState = currentStates[0].get();
263 currentStates.clear();
264 currentStates.push_back(bddMachine.
reach(currentBeliefState, nonObs, obs));
267 printSolution(currentStates[0].
get(),stateEncoder,candManager,setManager,locStateInfoManager,manager);
272 int main(
int argc,
char * argv[]) {
274 Poptions::options_description desc(
"Complete options");
275 Poptions::options_description visible(
"Allowed options");
276 Poptions::variables_map vm;
279 vector<string> modelNames;
280 vector<string> scenarios;
283 vector<ObservableComponent> models;
285 printError(
"Cannot read the models from the given files");
288 for (
auto & scenario : scenarios) {
289 vector<Event> observations;
291 printError(
"Cannot read a scenario from the given files");
EventPropertyIdIterator eventEnd() const
StatePropertyIdIterator statePropertyIdBegin() const
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::options_description &visible, Poptions::variables_map &vm)
void printError(const string &msg)
StatePropertyIdAsSizeT EventInfoId
VariableEncoderId encodeEventRange(EventIterator first, EventIterator last)
const Value & getValue(const string &label) const
VariableEncoderId encodeStateInfoRange(StateInfoIdIterator first, StateInfoIdIterator last)
BddStateMachine & encode(const Diades::Automata::Experimental::StateMachine< StateProperty, FaultProperty > &component, Variable &stateVar, Variable &nextStateVar, Variable &event, BddStateMachine &result)
Variable & getVariable(VariableEncoderId id)
void runGlobalDiagnosisProblem(const ObservableComponent &component, const vector< Event > &observations)
void analyseOptions(Poptions::variables_map &vm, Poptions::options_description &visible, vector< string > &models, vector< string > &scenarios)
EventId eventId(const Event &event)
vector< string > options(numberOfOptions)
LocalStateInfoId CandidateId
Formula::FormulaVector FormulaVector
std::vector< EventId > decodeEventSet(const EventSet &eventSet) const
bool loadModels(const vector< string > &modelNames, vector< ObservableComponent > &models)
std::pair< StateInfoId, bool > getStateInfoId(const Assignment &assignment) const
An observable Component defined as a automaton.
void printErrorCmdLine(const string &msg, Poptions::options_description &visible)
DdAutFsm::EventPropertyId Event
const State & state() const
void exportToDisjunctiveNormalForm(const Formula &formula, std::list< std::list< Assignment > > &dnf)
const SlEvents & event(const Value &eventValue) const
const Faults & faults() const
FormulaFactory & factory()
const Event & getEvent(EventId id) const
bool isIdentifiable(const Event &e) const
const ObservableMask & mask() const
bool loadScenario(const string &scenarioFile, vector< Event > &observations, const vector< ObservableComponent > &models)
EventPropertyIdIterator eventBegin() const
const string program("dd-symb-diagnose")
InitialStateIterator initialStateBegin() const
Variable & getVariable(VariableEncoderId id) const
void transformToCandidateStateMachine(const Component &component, Lcm::EvManager &manager, Lcm::EvSetManager &setManager, Lcm::LocalStateInfoManager &locStateInfoManager, Lcm::CandidateManager &candidateManager, Lcm::Fsm &result)
const SlStates & reach(const SlStates &sources, const SlEvents &nonObservables, const SlEvents &observations)
const SlEvents & sources(const Value &sourceStateValue) const
StatePropertyIdIterator statePropertyIdEnd() const
const set< Event > & events() const
const StatePropertyId & getStatePropertyId(State state) const
void printSolution(const BddStateMachine::SlEvents &solution, StateInfoEncoder &stateEncoder, Lcm::CandidateManager &candManager, Lcm::EvSetManager &setManager, Lcm::LocalStateInfoManager &locStateInfoManager, Lcm::EvManager &manager)
const StateProperty & getStateProperty(StatePropertyId id) const
int main(int argc, char *argv[])