Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DeterministicAutomaton.cpp
Go to the documentation of this file.
2
3#pragma clang diagnostic push
4#pragma clang diagnostic ignored "-Wunused-exception-parameter" // emitted from the flex-generated hoa_lexer.hh
5#include "cpphoafparser/consumer/hoa_intermediate_check_validity.hh"
6#include "cpphoafparser/parser/hoa_parser.hh"
7#include "cpphoafparser/parser/hoa_parser_helper.hh"
8#pragma clang diagnostic pop
9
13#include "storm/io/file.h"
15
16namespace storm {
17namespace automata {
18DeterministicAutomaton::DeterministicAutomaton(APSet apSet, std::size_t numberOfStates, std::size_t initialState, AcceptanceCondition::ptr acceptance)
19 : apSet(apSet), numberOfStates(numberOfStates), initialState(initialState), acceptance(acceptance) {
20 // TODO: this could overflow, add check?
21 edgesPerState = apSet.alphabetSize();
22 numberOfEdges = numberOfStates * edgesPerState;
23 successors.resize(numberOfEdges);
24}
25
27 return initialState;
28}
29
31 return apSet;
32}
33
34std::size_t DeterministicAutomaton::getSuccessor(std::size_t from, APSet::alphabet_element label) const {
35 std::size_t index = from * edgesPerState + label;
36 return successors.at(index);
37}
38
39void DeterministicAutomaton::setSuccessor(std::size_t from, APSet::alphabet_element label, std::size_t successor) {
40 std::size_t index = from * edgesPerState + label;
41 successors.at(index) = successor;
42}
43
45 return numberOfStates;
46}
47
49 return edgesPerState;
50}
51
55
56void DeterministicAutomaton::printHOA(std::ostream& out) const {
57 out << "HOA: v1\n";
58
59 out << "States: " << numberOfStates << "\n";
60
61 out << "Start: " << initialState << "\n";
62
63 out << "AP: " << apSet.size();
64 for (unsigned int i = 0; i < apSet.size(); i++) {
65 out << " " << cpphoafparser::HOAParserHelper::quote(apSet.getAP(i));
66 }
67 out << "\n";
68
69 out << "Acceptance: " << acceptance->getNumberOfAcceptanceSets() << " " << *acceptance->getAcceptanceExpression() << "\n";
70
71 out << "--BODY--" << "\n";
72
73 for (std::size_t s = 0; s < getNumberOfStates(); s++) {
74 out << "State: " << s;
75 out << " {";
76 bool first = true;
77 for (unsigned int i = 0; i < acceptance->getNumberOfAcceptanceSets(); i++) {
78 if (acceptance->getAcceptanceSet(i).get(s)) {
79 if (!first) {
80 out << " ";
81 }
82 first = false;
83 out << i;
84 }
85 }
86 out << "}\n";
87 for (std::size_t label = 0; label < getNumberOfEdgesPerState(); label++) {
88 out << getSuccessor(s, label) << "\n";
89 }
90 }
91}
92
94 HOAConsumerDA::ptr consumer(new HOAConsumerDA());
95 cpphoafparser::HOAIntermediateCheckValidity::ptr validator(new cpphoafparser::HOAIntermediateCheckValidity(consumer));
96 cpphoafparser::HOAParser::parse(in, validator);
97
98 return consumer->getDA();
99}
100
102 std::ifstream in;
103 storm::io::openFile(filename, in);
104 auto da = parse(in);
106
107 STORM_LOG_INFO("Deterministic automaton from HOA file '" << filename << "' has " << da->getNumberOfStates() << " states, " << da->getAPSet().size()
108 << " atomic propositions and " << *da->getAcceptance()->getAcceptanceExpression()
109 << " as acceptance condition.");
110 return da;
111}
112
113} // namespace automata
114} // namespace storm
std::size_t alphabet_element
Definition APSet.h:12
std::shared_ptr< AcceptanceCondition > ptr
static DeterministicAutomaton::ptr parseFromFile(const std::string &filename)
void setSuccessor(std::size_t from, APSet::alphabet_element label, std::size_t successor)
DeterministicAutomaton(APSet apSet, std::size_t numberOfStates, std::size_t initialState, std::shared_ptr< AcceptanceCondition > acceptance)
std::size_t getSuccessor(std::size_t from, APSet::alphabet_element label) const
std::shared_ptr< DeterministicAutomaton > ptr
std::shared_ptr< AcceptanceCondition > getAcceptance() const
static DeterministicAutomaton::ptr parse(std::istream &in)
std::shared_ptr< HOAConsumerDA > ptr
#define STORM_LOG_INFO(message)
Definition logging.h:27
void closeFile(std::ofstream &stream)
Close the given file after writing.
Definition file.h:47
void openFile(std::string const &filepath, std::ofstream &filestream, bool append=false, bool silent=false)
Open the given file for writing.
Definition file.h:18