Storm 1.14.0.1
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,
121 "Could not find a transition with name << '" << from << "'.");
122 addOutputArc(transitionNames.at(from), placeNames.at(to), multiplicity);
123}
124
125Transition& GspnBuilder::getTransition(uint64_t id) {
126 if (isTimedTransitionId(id)) {
127 return timedTransitions.at(GSPN::transitionIdToTimedTransitionId(id));
128 } else if (isImmediateTransitionId(id)) {
129 return immediateTransitions.at(id);
130 } else {
131 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException, "No transitition with id '" << id << "' known.");
132 }
133}
134
135void GspnBuilder::addNormalArc(std::string const& from, std::string const& to, uint64_t multiplicity) {
136 if (placeNames.count(from) > 0 && transitionNames.count(to) > 0) {
137 addInputArc(placeNames.at(from), transitionNames.at(to), multiplicity);
138 } else if (transitionNames.count(from) > 0 && placeNames.count(to) > 0) {
139 addOutputArc(transitionNames.at(from), placeNames.at(to), multiplicity);
140 } else {
141 // No suitable combination. Provide error message:
142 STORM_LOG_THROW(placeNames.count(from) == 0, storm::exceptions::InvalidArgumentException,
143 "Expected a transition with name " << to << " for arc from '" << from << "' to '" << to << "'.");
144 STORM_LOG_THROW(transitionNames.count(from) == 0, storm::exceptions::InvalidArgumentException,
145 "Expected a place named " << to << " for arc from '" << from << "' to '" << to << "'.");
146 STORM_LOG_THROW(false, storm::exceptions::InvalidArgumentException,
147 "Expected a place named " << from << " for arc from '" << from << "' to '" << to << "'.");
148 }
149}
150
151bool GspnBuilder::isTimedTransitionId(uint64_t tid) const {
152 if (tid >> 63) {
153 return GSPN::transitionIdToTimedTransitionId(tid) < timedTransitions.size();
154 }
155 return false;
156}
157
158bool GspnBuilder::isImmediateTransitionId(uint64_t tid) const {
159 if (tid >> 63) {
160 return false;
161 }
162 return GSPN::transitionIdToImmediateTransitionId(tid) < immediateTransitions.size();
163}
164
165storm::gspn::GSPN* GspnBuilder::buildGspn(std::shared_ptr<storm::expressions::ExpressionManager> const& exprManager,
166 std::map<storm::expressions::Variable, storm::expressions::Expression> const& constantsSubstitution) const {
167 std::shared_ptr<storm::expressions::ExpressionManager> actualExprManager;
168 if (exprManager) {
169 actualExprManager = exprManager;
170 } else {
171 actualExprManager = std::make_shared<storm::expressions::ExpressionManager>();
172 }
173
174 std::vector<TransitionPartition> orderedPartitions;
175 for (auto const& priorityPartitions : partitions) {
176 for (auto const& partition : priorityPartitions.second) {
177 // sanity check
178 STORM_LOG_ASSERT(partition.priority == priorityPartitions.first, "Partition priority mismatch.");
179
180 if (partition.nrTransitions() > 0) {
181 orderedPartitions.push_back(partition);
182 }
183 }
184 }
185 std::reverse(orderedPartitions.begin(), orderedPartitions.end());
186 for (auto const& placeEntry : placeNames) {
187 actualExprManager->declareIntegerVariable(placeEntry.first, false);
188 }
189
190 GSPN* result = new GSPN(gspnName, places, immediateTransitions, timedTransitions, orderedPartitions, actualExprManager, constantsSubstitution);
191 result->setTransitionLayoutInfo(transitionLayout);
192 result->setPlaceLayoutInfo(placeLayout);
193 return result;
194}
195} // namespace gspn
196} // namespace storm
static uint64_t immediateTransitionIdToTransitionId(uint64_t)
Definition GSPN.cpp:15
static uint64_t timedTransitionIdToTransitionId(uint64_t)
Definition GSPN.cpp:11
void setTransitionLayoutInfo(uint64_t transitionId, LayoutInfo const &layout) const
Definition GSPN.cpp:397
static uint64_t transitionIdToTimedTransitionId(uint64_t)
Definition GSPN.cpp:19
void setPlaceLayoutInfo(uint64_t placeId, LayoutInfo const &layout) const
Definition GSPN.cpp:394
static uint64_t transitionIdToImmediateTransitionId(uint64_t)
Definition GSPN.cpp:23
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
#define STORM_LOG_ASSERT(cond, message)
Definition macros.h:9
#define STORM_LOG_THROW(cond, exception, message)
Definition macros.h:28
bool isZero(ValueType const &a)
Definition constants.cpp:42
ValueType one()
Definition constants.cpp:19
std::vector< uint64_t > transitions