Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
GspnBuilder.cpp
Go to the documentation of this file.
1#include "GspnBuilder.h"
2
4
5#include "Place.h"
8
9namespace storm {
10namespace gspn {
11void GspnBuilder::setGspnName(std::string const& name) {
12 gspnName = name;
13}
14
15uint_fast64_t GspnBuilder::addPlace(boost::optional<uint64_t> const& capacity, uint_fast64_t const& initialTokens, std::string const& name) {
16 auto newId = places.size();
17 auto place = storm::gspn::Place(newId);
18 place.setCapacity(capacity);
19 place.setNumberOfInitialTokens(initialTokens);
20 place.setName(name);
21 places.push_back(place);
22 placeNames.emplace(name, newId);
23 return newId;
24}
25
26void GspnBuilder::setPlaceLayoutInfo(uint64_t placeId, LayoutInfo const& layoutInfo) {
27 placeLayout[placeId] = layoutInfo;
28}
29
30void GspnBuilder::setTransitionLayoutInfo(uint64_t transitionId, LayoutInfo const& layoutInfo) {
31 transitionLayout[transitionId] = layoutInfo;
32}
33
34uint_fast64_t GspnBuilder::addImmediateTransition(uint_fast64_t const& priority, double const& weight, std::string const& name) {
36 auto newId = GSPN::immediateTransitionIdToTransitionId(immediateTransitions.size());
37 trans.setName(name);
38 trans.setPriority(priority);
39 trans.setID(newId);
40
41 // ensure that the first partition is for the 'general/weighted' transitions
42 if (partitions.count(priority) == 0) {
43 TransitionPartition newPart;
44 newPart.priority = priority;
45 partitions[priority].push_back(newPart);
46 }
47
48 if (storm::utility::isZero(weight)) {
49 trans.setWeight(storm::utility::one<double>());
50 TransitionPartition newPart;
51 newPart.priority = priority;
52 newPart.transitions = {newId};
53 partitions.at(priority).push_back(newPart);
54 } else {
55 trans.setWeight(weight);
56 partitions.at(priority).front().transitions.push_back(newId);
57 }
58 immediateTransitions.push_back(trans);
59
60 transitionNames.emplace(name, newId);
61 return newId;
62}
63
64uint_fast64_t GspnBuilder::addTimedTransition(uint_fast64_t const& priority, double const& rate, std::string const& name) {
65 return addTimedTransition(priority, rate, 1, name);
66}
67
68uint_fast64_t GspnBuilder::addTimedTransition(uint_fast64_t const& priority, double const& rate, boost::optional<uint64_t> const& numServers,
69 std::string const& name) {
71 auto newId = GSPN::timedTransitionIdToTransitionId(timedTransitions.size());
72 trans.setName(name);
73 trans.setPriority(priority);
74 trans.setRate(rate);
75 if (numServers) {
76 trans.setKServerSemantics(numServers.get());
77 } else {
78 trans.setInfiniteServerSemantics();
79 }
80 trans.setID(newId);
81 timedTransitions.push_back(trans);
82
83 transitionNames.emplace(name, newId);
84 return newId;
85}
86
87void GspnBuilder::addInputArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity) {
88 STORM_LOG_THROW(from < places.size(), storm::exceptions::InvalidArgumentException, "No place with id " << from << " known.");
89 auto place = places.at(from);
90 getTransition(to).setInputArcMultiplicity(place, multiplicity);
91}
92
93void GspnBuilder::addInputArc(std::string const& from, std::string const& to, uint64_t multiplicity) {
94 STORM_LOG_THROW(placeNames.count(from) != 0, storm::exceptions::InvalidArgumentException, "Could not find a place with name '" << from << "'");
95 STORM_LOG_THROW(transitionNames.count(to) != 0, storm::exceptions::InvalidArgumentException, "Could not find a transition with name << '" << to << "'");
96 addInputArc(placeNames.at(from), transitionNames.at(to), multiplicity);
97}
98
99void GspnBuilder::addInhibitionArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity) {
100 STORM_LOG_THROW(from < places.size(), storm::exceptions::InvalidArgumentException, "No place with id " << from << " known.");
101 auto place = places.at(from);
102
103 getTransition(to).setInhibitionArcMultiplicity(place, multiplicity);
104}
105
106void GspnBuilder::addInhibitionArc(std::string const& from, std::string const& to, uint64_t multiplicity) {
107 STORM_LOG_THROW(placeNames.count(from) != 0, storm::exceptions::InvalidArgumentException, "Could not find a place with name '" << from << "'");
108 STORM_LOG_THROW(transitionNames.count(to) != 0, storm::exceptions::InvalidArgumentException, "Could not find a transition with name << '" << to << "'");
109 addInhibitionArc(placeNames.at(from), transitionNames.at(to), multiplicity);
110}
111
112void GspnBuilder::addOutputArc(uint_fast64_t const& from, uint_fast64_t const& to, uint_fast64_t const& multiplicity) {
113 STORM_LOG_THROW(to < places.size(), storm::exceptions::InvalidArgumentException, "No place with id " << to << " known.");
114 auto place = places.at(to);
115 getTransition(from).setOutputArcMultiplicity(place, multiplicity);
116}
117
118void GspnBuilder::addOutputArc(std::string const& from, std::string const& to, uint64_t multiplicity) {
119 STORM_LOG_THROW(placeNames.count(to) != 0, storm::exceptions::InvalidArgumentException, "Could not find a place with name '" << to << "'");
120 STORM_LOG_THROW(transitionNames.count(from) != 0, storm::exceptions::InvalidArgumentException, "Could not find a transition with name << '" << from << "'");
121 addOutputArc(transitionNames.at(from), placeNames.at(to), multiplicity);
122}
123
124Transition& GspnBuilder::getTransition(uint64_t id) {
125 if (isTimedTransitionId(id)) {
126 return timedTransitions.at(GSPN::transitionIdToTimedTransitionId(id));
127 } else if (isImmediateTransitionId(id)) {
128 return immediateTransitions.at(id);
129 } else {
130 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "No transitition with id '" << id << "' known.");
131 }
132}
133
134void GspnBuilder::addNormalArc(std::string const& from, std::string const& to, uint64_t multiplicity) {
135 if (placeNames.count(from) > 0 && transitionNames.count(to) > 0) {
136 addInputArc(placeNames.at(from), transitionNames.at(to), multiplicity);
137 } else if (transitionNames.count(from) > 0 && placeNames.count(to) > 0) {
138 addOutputArc(transitionNames.at(from), placeNames.at(to), multiplicity);
139 } else {
140 // No suitable combination. Provide error message:
141 if (placeNames.count(from) > 0) {
142 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException,
143 "Expected a transition with name " << to << " for arc from '" << from << "' to '" << to << "'.");
144 }
145 if (transitionNames.count(from) > 0) {
146 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException,
147 "Expected a place named " << to << " for arc from '" << from << "' to '" << to << "'.");
148 }
149 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException,
150 "Expected a place named " << from << " for arc from '" << from << "' to '" << to << "'.");
151 }
152}
153
154bool GspnBuilder::isTimedTransitionId(uint64_t tid) const {
155 if (tid >> 63) {
156 return GSPN::transitionIdToTimedTransitionId(tid) < timedTransitions.size();
157 }
158 return false;
159}
160
161bool GspnBuilder::isImmediateTransitionId(uint64_t tid) const {
162 if (tid >> 63) {
163 return false;
164 }
165 return GSPN::transitionIdToImmediateTransitionId(tid) < immediateTransitions.size();
166}
167
168storm::gspn::GSPN* GspnBuilder::buildGspn(std::shared_ptr<storm::expressions::ExpressionManager> const& exprManager,
169 std::map<storm::expressions::Variable, storm::expressions::Expression> const& constantsSubstitution) const {
170 std::shared_ptr<storm::expressions::ExpressionManager> actualExprManager;
171 if (exprManager) {
172 actualExprManager = exprManager;
173 } else {
174 actualExprManager = std::make_shared<storm::expressions::ExpressionManager>();
175 }
176
177 std::vector<TransitionPartition> orderedPartitions;
178 for (auto const& priorityPartitions : partitions) {
179 for (auto const& partition : priorityPartitions.second) {
180 // sanity check
181 assert(partition.priority == priorityPartitions.first);
182
183 if (partition.nrTransitions() > 0) {
184 orderedPartitions.push_back(partition);
185 }
186 }
187 }
188 std::reverse(orderedPartitions.begin(), orderedPartitions.end());
189 for (auto const& placeEntry : placeNames) {
190 actualExprManager->declareIntegerVariable(placeEntry.first, false);
191 }
192
193 GSPN* result = new GSPN(gspnName, places, immediateTransitions, timedTransitions, orderedPartitions, actualExprManager, constantsSubstitution);
194 result->setTransitionLayoutInfo(transitionLayout);
195 result->setPlaceLayoutInfo(placeLayout);
196 return result;
197}
198} // namespace gspn
199} // namespace storm
static uint64_t immediateTransitionIdToTransitionId(uint64_t)
Definition GSPN.cpp:17
static uint64_t timedTransitionIdToTransitionId(uint64_t)
Definition GSPN.cpp:13
void setTransitionLayoutInfo(uint64_t transitionId, LayoutInfo const &layout) const
Definition GSPN.cpp:399
static uint64_t transitionIdToTimedTransitionId(uint64_t)
Definition GSPN.cpp:21
void setPlaceLayoutInfo(uint64_t placeId, LayoutInfo const &layout) const
Definition GSPN.cpp:396
static uint64_t transitionIdToImmediateTransitionId(uint64_t)
Definition GSPN.cpp:25
uint_fast64_t addPlace(boost::optional< uint64_t > const &capacity=1, uint_fast64_t const &initialTokens=0, std::string const &name="")
Add a place to the gspn.
void addOutputArc(uint_fast64_t const &from, uint_fast64_t const &to, uint_fast64_t const &multiplicity=1)
Adds an new input arc from a place to an transition.
void setPlaceLayoutInfo(uint64_t placeId, LayoutInfo const &layoutInfo)
uint_fast64_t addImmediateTransition(uint_fast64_t const &priority=0, WeightType const &weight=0, std::string const &name="")
Adds an immediate transition to the gspn.
void addNormalArc(std::string const &from, std::string const &to, uint64_t multiplicity=1)
Adds an arc from a named element to a named element.
storm::gspn::GSPN * buildGspn(std::shared_ptr< storm::expressions::ExpressionManager > const &exprManager=nullptr, std::map< storm::expressions::Variable, storm::expressions::Expression > const &constantsSubstitution=std::map< storm::expressions::Variable, storm::expressions::Expression >()) const
void addInhibitionArc(uint_fast64_t const &from, uint_fast64_t const &to, uint_fast64_t const &multiplicity=1)
Adds an new input arc from a place to an transition.
void addInputArc(uint_fast64_t const &from, uint_fast64_t const &to, uint_fast64_t const &multiplicity=1)
Adds an new input arc from a place to an transition.
void setGspnName(std::string const &name)
Set GSPN name.
void setTransitionLayoutInfo(uint64_t transitionId, LayoutInfo const &layoutInfo)
uint_fast64_t addTimedTransition(uint_fast64_t const &priority, RateType const &rate, std::string const &name="")
Adds an timed transition to the gspn.
This class provides methods to store and retrieve data for a place in a gspn.
Definition Place.h:12
This class represents a transition in a gspn.
Definition Transition.h:14
void setInhibitionArcMultiplicity(storm::gspn::Place const &place, uint64_t multiplicity)
Set the multiplicity of the inhibition arc originating from the place.
void setOutputArcMultiplicity(storm::gspn::Place const &place, uint64_t multiplicity)
Set the multiplicity of the output arc going to the place.
void setInputArcMultiplicity(storm::gspn::Place const &place, uint64_t multiplicity)
Set the multiplicity of the input arc originating from the place.
Definition Transition.cpp:8
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:30
bool isZero(ValueType const &a)
Definition constants.cpp:41
LabParser.cpp.
Definition cli.cpp:18
std::vector< uint64_t > transitions