You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.4 KiB
154 lines
5.4 KiB
#include "Transition.h"
|
|
|
|
#include "storm/utility/macros.h"
|
|
|
|
namespace storm {
|
|
namespace gspn {
|
|
|
|
void Transition::setInputArcMultiplicity(storm::gspn::Place const& place, uint64_t multiplicity) {
|
|
inputMultiplicities[place.getID()] = multiplicity;
|
|
}
|
|
|
|
bool Transition::removeInputArc(storm::gspn::Place const& place) {
|
|
if (existsInputArc(place)) {
|
|
inputMultiplicities.erase(place.getID());
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool Transition::existsInputArc(storm::gspn::Place const& place) const {
|
|
return inputMultiplicities.end() != inputMultiplicities.find(place.getID());
|
|
}
|
|
|
|
void Transition::setOutputArcMultiplicity(storm::gspn::Place const& place, uint64_t multiplicity) {
|
|
outputMultiplicities[place.getID()] = multiplicity;
|
|
}
|
|
|
|
bool Transition::removeOutputArc(storm::gspn::Place const& place) {
|
|
if (existsOutputArc(place)) {
|
|
outputMultiplicities.erase(place.getID());
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool Transition::existsOutputArc(storm::gspn::Place const& place) const {
|
|
return outputMultiplicities.end() != outputMultiplicities.find(place.getID());
|
|
}
|
|
|
|
void Transition::setInhibitionArcMultiplicity(storm::gspn::Place const& place, uint64_t multiplicity) {
|
|
|
|
inhibitionMultiplicities[place.getID()] = multiplicity;
|
|
}
|
|
|
|
bool Transition::removeInhibitionArc(storm::gspn::Place const& place) {
|
|
if (existsInhibitionArc(place)) {
|
|
inhibitionMultiplicities.erase(place.getID());
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool Transition::existsInhibitionArc(storm::gspn::Place const& place) const {
|
|
return inhibitionMultiplicities.end() != inhibitionMultiplicities.find(place.getID());
|
|
}
|
|
|
|
bool Transition::isEnabled(storm::gspn::Marking const& marking) const {
|
|
auto inputIterator = inputMultiplicities.cbegin();
|
|
while (inputIterator != inputMultiplicities.cend()) {
|
|
if (marking.getNumberOfTokensAt(inputIterator->first) < inputIterator->second) {
|
|
return false;
|
|
}
|
|
|
|
++inputIterator;
|
|
}
|
|
|
|
auto inhibitionIterator = inhibitionMultiplicities.cbegin();
|
|
while (inhibitionIterator != inhibitionMultiplicities.cend()) {
|
|
if (marking.getNumberOfTokensAt(inhibitionIterator->first) >= inhibitionIterator->second) {
|
|
return false;
|
|
}
|
|
|
|
++inhibitionIterator;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
storm::gspn::Marking Transition::fire(storm::gspn::Marking const& marking) const {
|
|
storm::gspn::Marking newMarking(marking);
|
|
|
|
auto inputIterator = inputMultiplicities.cbegin();
|
|
while (inputIterator != inputMultiplicities.cend()) {
|
|
newMarking.setNumberOfTokensAt(inputIterator->first,
|
|
newMarking.getNumberOfTokensAt(inputIterator->first) - inputIterator->second);
|
|
++inputIterator;
|
|
}
|
|
|
|
auto outputIterator = outputMultiplicities.cbegin();
|
|
while (outputIterator != outputMultiplicities.cend()) {
|
|
newMarking.setNumberOfTokensAt(outputIterator->first,
|
|
newMarking.getNumberOfTokensAt(outputIterator->first) + outputIterator->second);
|
|
++outputIterator;
|
|
}
|
|
|
|
return newMarking;
|
|
}
|
|
|
|
void Transition::setName(std::string const& name) {
|
|
this->name = name;
|
|
}
|
|
|
|
std::string const& Transition::getName() const {
|
|
return this->name;
|
|
}
|
|
|
|
std::unordered_map<uint64_t, uint64_t> const& Transition::getInputPlaces() const {
|
|
return inputMultiplicities;
|
|
}
|
|
|
|
std::unordered_map<uint64_t, uint64_t> const& Transition::getOutputPlaces() const {
|
|
return outputMultiplicities;
|
|
}
|
|
|
|
std::unordered_map<uint64_t, uint64_t> const& Transition::getInhibitionPlaces() const {
|
|
return inhibitionMultiplicities;
|
|
}
|
|
|
|
uint64_t Transition::getInputArcMultiplicity(storm::gspn::Place const& place) const {
|
|
if (existsInputArc(place)) {
|
|
return inputMultiplicities.at(place.getID());
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
uint64_t Transition::getInhibitionArcMultiplicity(storm::gspn::Place const& place) const {
|
|
if (existsInhibitionArc(place)) {
|
|
return inhibitionMultiplicities.at(place.getID());
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
uint64_t Transition::getOutputArcMultiplicity(storm::gspn::Place const& place) const {
|
|
if (existsOutputArc(place)) {
|
|
return outputMultiplicities.at(place.getID());
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void Transition::setPriority(uint64_t const& priority) {
|
|
this->priority = priority;
|
|
}
|
|
|
|
uint64_t Transition::getPriority() const {
|
|
return this->priority;
|
|
}
|
|
}
|
|
}
|