15 #include<boost/program_options.hpp> 22 #include"../AutomataInterface.hh" 29 namespace Poptions = boost::program_options;
37 const string program(
"dd-explain");
53 Poptions::options_description & desc,
54 Poptions::variables_map & vm)
57 (
"help,h",
"produce help message")
58 (
"file,f", Poptions::value< string >(),
"A||P automaton file (.ddaut format)")
59 (
"log,l", Poptions::value< string >(),
"L log file (.log format)")
60 (
"obs,s", Poptions::value< string >(),
"observable event file (.obs format)")
61 (
"output,o", Poptions::value< string >(),
"outfile name (.ddaut format)")
62 (
"web,w", Poptions::value< string >(),
"html file name (.html format)")
64 Poptions::positional_options_description p;
66 Poptions::store(Poptions::command_line_parser(argc, argv).
options(desc).positional(p).run(), vm);
80 std::istream & logfile,
81 std::istream & obsfile,
82 std::unordered_map<
DdAutFA::State, unordered_set<DdAutFA::Transition> > & safeAlternatives)
84 std::vector<std::string> observations;
85 std::istream_iterator<std::string> it(logfile);
86 std::istream_iterator<std::string> end;
89 observations.emplace_back(*it);
93 std::istream_iterator<std::string> itobs(obsfile);
96 std::for_each(eManager.
begin(),eManager.
end(),
99 if(eManager.
getEvent(eventId).find(*itobs)!=DdAutEventManager::Event::npos)
101 observables.insert(eventId);
106 return explain(fa, sManager, eManager, observations, observables, explanations,
107 fullExplanations,sManagerExplanation,safeAlternatives);
117 for(
auto stateSafeAlternatives: safeAlternatives)
119 auto explSafeSourceId = explanations.
getStatePropertyId( stateSafeAlternatives.first);
120 for(
auto safeTrans : stateSafeAlternatives.second)
170 " violates the property.") <<
"\n";
192 auto altIt = safeAlternatives.find(transition.target());
193 if(altIt != safeAlternatives.end())
195 const auto & safeAlt = altIt->second;
196 std::for_each(safeAlt.begin(),safeAlt.end(),
225 html <<
startTree(
"myexplanation") <<
"\n";
246 auto altIt = safeAlternatives.find(*it);
247 if(altIt != safeAlternatives.end())
249 const auto & safeAlt = altIt->second;
250 std::for_each(safeAlt.begin(),safeAlt.end(),
277 const std::string & logName,
278 const std::string & observableName,
279 const std::string & output,
280 const std::string & htmlName)
300 ifstream file(fileName.c_str());
316 return printCommandLineError(
Msg(
"Error the 'ddaut' automaton file %1% has no acceptor states that assert how the behaviour of the system can violate a given property") % fileName);
321 return printCommandLineError(
Msg(
"Error cannot read the descriptor of the 'ddaut' automaton file %1%, BUG") % fileName);
323 ifstream logfile(logName.c_str());
324 if(!logfile.is_open())
328 ifstream obsfile(observableName.c_str());
329 if(!obsfile.is_open())
337 if(!
explainLog(fa,explanation,fullExplanation,
338 sManager,sManagerExplanation,eManager,
339 logfile,obsfile,safeAlternatives))
341 return printCommandLineError(
Msg(
"Error in the explanation phase of why system %1% violates the safety property based on the observations %2% and the observability of the system defined in %3%") % fileName % logName % observableName);
344 if(!htmlName.empty())
348 printCommandLineWarning(
Msg(
"Expecting a file with a name ending with .html, but I read %1% so I do not export the explanation tree.") % htmlName);
352 ofstream htmlfile(htmlName.c_str());
353 if(!htmlfile.is_open())
357 writeTreeView(htmlfile,fa,sManager,eManager,explanation,sManagerExplanation,safeAlternatives);
375 std::string fileName, output, logName, observableName, htmlName;
378 Poptions::options_description desc(
"Options");
379 Poptions::variables_map vm;
387 fileName = vm[
"file"].as<std::string>();
391 logName = vm[
"log"].as<std::string>();
393 if(vm.count(
"output"))
395 output = vm[
"output"].as<std::string>();
399 observableName = vm[
"obs"].as<std::string>();
403 htmlName = vm[
"web"].as<std::string>();
406 catch(Poptions::required_option & e)
410 catch(Poptions::error & e)
414 return explainFsm(fileName,logName,observableName,output,htmlName);
InfoIdIterator end() const
void initialiseOptions(int argc, char *argv[], Poptions::options_description &desc, Poptions::variables_map &vm)
std::string startListCaretItem(const std::string &item)
StatePropertyManager< DdAutStateLabel, DdAutStateId > DdAutStateManager
Transition newTransition(State source, State target, const EventPropertyId &event)
bool explainLog(const DdAutFA &fa, DdAutFA &explanations, DdAutFA &fullExplanations, const DdAutStateManager &sManager, DdAutStateManager &sManagerExplanation, const DdAutEventManager &eManager, std::istream &logfile, std::istream &obsfile, std::unordered_map< DdAutFA::State, unordered_set< DdAutFA::Transition > > &safeAlternatives)
StatePropertyId statePropertyId(const StateProperty &stateProperty)
void writeTreeViewTransition(std::ostream &html, const DdAutFA &fa, const DdAutStateManager &sManager, const DdAutEventManager &eManager, const DdAutFA &explanation, const DdAutStateManager &sManagerExplanation, const SafeAlt< DdAutFA > &safeAlternatives, DdAutFA::Transition transition)
ConstAcceptorIterator acceptorEnd() const
size_t writeFiniteAutomaton(const Diades::Automata::Experimental::ConstManagedDdAutFA &mfa, const std::string &output, const FileSuffixes &suffixes)
typename IM::InfoId EventId
size_t printCommandLineError(const string &msg)
bool faFromDescriptor(const DdAutFileDescriptor &descriptor, DdAutFA &fa, DdAutStateManager &sManager, DdAutEventManager &eManager)
ConstAcceptorIterator acceptorBegin() const
size_t explainFsm(const std::string &fileName, const std::string &logName, const std::string &observableName, const std::string &output, const std::string &htmlName)
FaultyEventStateMachine< CandidateId, EventInfoId > Fsm
std::ostream & toTreeViewHtmlStart(std::ostream &os)
vector< string > options(numberOfOptions)
std::string startNestedTree()
OutputTransitionIterator outputTransitionBegin(State s) const
InitialStateIterator initialStateEnd() const
std::string listSingleItem(const std::string &item)
void writeTreeViewSafeAlternative(std::ostream &html, const DdAutFA &fa, const DdAutStateManager &sManager, const DdAutEventManager &eManager, DdAutFA::Transition t)
bool explain(const DdAutFA &fsa, const DdAutStateManager &sManager, const DdAutEventManager &eManager, const std::vector< std::string > &observations, Observables &observables, DdAutFA &explanations, DdAutFA &fullExplanations, DdAutStateManager &sManagerExplanation, std::unordered_map< DdAutFA::State, unordered_set< DdAutFA::Transition > > &safeAlternatives)
InfoIdIterator begin() const
bool match(const std::string &fileName, const std::string &suffix) const
AutFsm::Transition Transition
std::string startTree(const std::string &treeId)
typename SM::Transition Transition
const EventPropertyId & getEvent(Transition t) const
FiniteAutomaton< DdAutStateId, DdAutEventId > DdAutFA
const Event & getEvent(EventId id) const
OutputTransitionIterator outputTransitionEnd(State s) const
FileSuffixes suffixes({"log", "ddaut", "obs", "html"})
std::ostream & toTreeViewHtmlEnd(std::ostream &os)
size_t printCommandLineWarning(const string &msg)
InitialStateIterator initialStateBegin() const
EventManager< DdAutEventLabel, DdAutEventId > DdAutEventManager
std::set< DdAutFA::EventPropertyId > Observables
std::string endNestedTree()
void writeTreeView(std::ostream &html, const DdAutFA &fa, const DdAutStateManager &sManager, const DdAutEventManager &eManager, const DdAutFA &explanation, const DdAutStateManager &sManagerExplanation, const SafeAlt< DdAutFA > &safeAlternatives)
void consolidateWithSafeAlternatives(const DdAutFA &fsa, const DdAutStateManager &sManager, DdAutFA &explanations, DdAutStateManager &sManagerExplanation, const SafeAlt< DdAutFA > &safeAlternatives)
int main(int argc, char **argv)
std::string endListCaretItem()
const StatePropertyId & getStatePropertyId(State state) const
const string program("dd-explain")
const StateProperty & getStateProperty(StatePropertyId id) const
std::unordered_map< typename Fsm::State, std::unordered_set< typename Fsm::Transition > > SafeAlt
bool isAcceptingState(State s) const
virtual bool readStream(std::istream &stream)
void printUsage(const po::options_description &desc)