Browse Source
partial implementation of gspns, transitions and markings
partial implementation of gspns, transitions and markings
Former-commit-id: 77d76d6c89
tempestpy_adaptions
ThomasH
9 years ago
7 changed files with 397 additions and 1 deletions
-
17src/storage/gspn/GSPN.h
-
35src/storage/gspn/ImmediateTransition.h
-
43src/storage/gspn/Marking.cpp
-
66src/storage/gspn/Marking.h
-
36src/storage/gspn/TimedTransition.h
-
85src/storage/gspn/Transition.cpp
-
116src/storage/gspn/Transition.h
@ -0,0 +1,35 @@ |
|||||
|
#ifndef STORM_IMMEDIATETRANSITION_H |
||||
|
#define STORM_IMMEDIATETRANSITION_H |
||||
|
|
||||
|
#include "src/storage/gspn/Transition.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace gspn { |
||||
|
template <typename WeightType> |
||||
|
class ImmediateTransition : public storm::gspn::Transition { |
||||
|
public: |
||||
|
/*! |
||||
|
* Sets the weight of this transition to the given value. |
||||
|
* |
||||
|
* @param weight The new weight for this transition. |
||||
|
*/ |
||||
|
void setWeight(WeightType weight) { |
||||
|
this->weight = weight; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves the weight of this transition. |
||||
|
* |
||||
|
* @return The weight of this transition. |
||||
|
*/ |
||||
|
WeightType getWeight() { |
||||
|
return this->weight; |
||||
|
} |
||||
|
private: |
||||
|
// the weight of the transition |
||||
|
WeightType weight; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif //STORM_IMMEDIATETRANSITION_H |
@ -0,0 +1,43 @@ |
|||||
|
#include "src/storage/gspn/Marking.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace gspn { |
||||
|
Marking::Marking(uint_fast64_t numberOfPlaces, uint_fast64_t maxNumberOfTokens) { |
||||
|
this->numberOfPlaces = numberOfPlaces; |
||||
|
this->maxNumberOfTokens = maxNumberOfTokens; |
||||
|
|
||||
|
this->numberOfBits = std::floor(std::log2(maxNumberOfTokens)) + 1; |
||||
|
this->marking = storm::storage::BitVector(numberOfBits * numberOfPlaces); |
||||
|
} |
||||
|
|
||||
|
uint_fast64_t Marking::getNumberOfPlaces() { |
||||
|
return this->numberOfPlaces; |
||||
|
} |
||||
|
|
||||
|
uint_fast64_t Marking::getMaxNumberOfTokens() { |
||||
|
return this->maxNumberOfTokens; |
||||
|
} |
||||
|
|
||||
|
void Marking::setNumberOfTokensAt(uint_fast64_t place, uint_fast64_t numberOfTokens) { |
||||
|
//check range
|
||||
|
for (uint_fast64_t i = getNumberOfPlaces() * numberOfBits; i <(getNumberOfPlaces() * numberOfBits) + numberOfBits; ++i) { |
||||
|
if (numberOfTokens % 2 == 0) { |
||||
|
marking.set(i, false); |
||||
|
} else { |
||||
|
marking.set(i, true); |
||||
|
} |
||||
|
numberOfTokens /= 2; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
uint_fast64_t Marking::getNumberOfTokensAt(uint_fast64_t place) { |
||||
|
uint_fast64_t tokens = 0; |
||||
|
for (uint_fast64_t i = getNumberOfPlaces() * numberOfBits, mult = 0; i <(getNumberOfPlaces() * numberOfBits) + numberOfBits; ++i, ++mult) { |
||||
|
if (marking.get(i)) { |
||||
|
tokens += std::pow(2, mult); |
||||
|
} |
||||
|
} |
||||
|
return tokens; |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,66 @@ |
|||||
|
#ifndef STORM_MARKING_H |
||||
|
#define STORM_MARKING_H |
||||
|
|
||||
|
#include <cmath> |
||||
|
|
||||
|
#include "src/storage/BitVector.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace gspn { |
||||
|
class Marking { |
||||
|
public: |
||||
|
/*! |
||||
|
* Creates an empty marking (at all places are 0 tokens). |
||||
|
* |
||||
|
* @param numberOfPlaces The number of places in the gspn. |
||||
|
* @param maxNumberOfTokens The maximal number of tokens in one place. |
||||
|
*/ |
||||
|
Marking(uint_fast64_t numberOfPlaces, uint_fast64_t maxNumberOfTokens); |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves the number of places for which the tokens are stored. |
||||
|
* |
||||
|
* @return The number of places. |
||||
|
*/ |
||||
|
uint_fast64_t getNumberOfPlaces(); |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves the maximal number of tokens which can be stored in one place. |
||||
|
* |
||||
|
* @return The maximal number of tokens. |
||||
|
*/ |
||||
|
uint_fast64_t getMaxNumberOfTokens(); |
||||
|
|
||||
|
/*! |
||||
|
* Set the number of tokens for the given place to the given amount. |
||||
|
* |
||||
|
* @param place Place must be a valid place for which the number of tokens is changed. |
||||
|
* @param numberOfTokens The new number of tokens at the place. |
||||
|
*/ |
||||
|
void setNumberOfTokensAt(uint_fast64_t place, uint_fast64_t numberOfTokens); |
||||
|
|
||||
|
/*! |
||||
|
* Get the number of tokens for the given place. |
||||
|
* |
||||
|
* @param place The place from which the tokens are counted. |
||||
|
* @return The number of tokens at the place. |
||||
|
*/ |
||||
|
uint_fast64_t getNumberOfTokensAt(uint_fast64_t place); |
||||
|
private: |
||||
|
// the maximal number of places in the gspn |
||||
|
uint_fast64_t numberOfPlaces; |
||||
|
|
||||
|
// the maximal number of tokens in one place |
||||
|
uint_fast64_t maxNumberOfTokens; |
||||
|
|
||||
|
// contains the information of the marking |
||||
|
storm::storage::BitVector marking; |
||||
|
|
||||
|
// number of bits which are needed to store the tokens for one place |
||||
|
uint_fast64_t numberOfBits; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif //STORM_MARKING_H |
@ -0,0 +1,36 @@ |
|||||
|
#ifndef STORM_TIMEDTRANSITION_H |
||||
|
#define STORM_TIMEDTRANSITION_H |
||||
|
|
||||
|
#include "src/storage/gspn/Transition.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace gspn { |
||||
|
template <typename RateType> |
||||
|
class TimedTransition : public storm::gspn::Transition { |
||||
|
public: |
||||
|
/*! |
||||
|
* Sets the rate of this transition to the given value. |
||||
|
* |
||||
|
* @param rate The new rate for this transition. |
||||
|
*/ |
||||
|
void setRate(RateType rate) { |
||||
|
this->rate = rate; |
||||
|
} |
||||
|
|
||||
|
/*! |
||||
|
* Retrieves the rate of this transition. |
||||
|
* |
||||
|
* @return The rate of this transition. |
||||
|
*/ |
||||
|
RateType getRate() { |
||||
|
return this->rate; |
||||
|
} |
||||
|
|
||||
|
private: |
||||
|
// the rate of the transition |
||||
|
RateType rate; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif //STORM_TIMEDTRANSITION_H |
@ -0,0 +1,85 @@ |
|||||
|
#include "src/storage/gspn/Transition.h"
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace gspn { |
||||
|
|
||||
|
void Transition::setInputArcCardinality(uint_fast64_t place, uint_fast64_t multiplicity) { |
||||
|
inputMultiplicities[place] = multiplicity; |
||||
|
} |
||||
|
|
||||
|
bool Transition::removeInputArc(uint_fast64_t place) { |
||||
|
if (existsInputArc(place)) { |
||||
|
inputMultiplicities.erase(place); |
||||
|
return true; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
bool Transition::existsInputArc(uint_fast64_t place) { |
||||
|
return inputMultiplicities.end() != inputMultiplicities.find(place); |
||||
|
} |
||||
|
|
||||
|
void Transition::setOutputArcCardinality(uint_fast64_t place, uint_fast64_t multiplicity) { |
||||
|
outputMultiplicities[place] = multiplicity; |
||||
|
} |
||||
|
|
||||
|
bool Transition::removeOutputArc(uint_fast64_t place) { |
||||
|
if (existsOutputArc(place)) { |
||||
|
outputMultiplicities.erase(place); |
||||
|
return true; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
bool Transition::existsOutputArc(uint_fast64_t place) { |
||||
|
return outputMultiplicities.end() != outputMultiplicities.find(place); |
||||
|
} |
||||
|
|
||||
|
void Transition::setInhibitionArcCardinality(uint_fast64_t place, uint_fast64_t multiplicity) { |
||||
|
inhibitionMultiplicities[place] = multiplicity; |
||||
|
} |
||||
|
|
||||
|
bool Transition::removeInhibitionArc(uint_fast64_t place) { |
||||
|
if (existsInhibitionArc(place)) { |
||||
|
inhibitionMultiplicities.erase(place); |
||||
|
return true; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
bool Transition::existsInhibitionArc(uint_fast64_t place) { |
||||
|
return inhibitionMultiplicities.end() != inhibitionMultiplicities.find(place); |
||||
|
} |
||||
|
|
||||
|
bool Transition::isEnabled(storm::gspn::Marking marking) { |
||||
|
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(const storm::gspn::Marking marking) { |
||||
|
//check if transition is enabled
|
||||
|
|
||||
|
return gspn::Marking(0, 0); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,116 @@ |
|||||
|
#ifndef STORM_TRANSITION_H |
||||
|
#define STORM_TRANSITION_H |
||||
|
|
||||
|
#include <map> |
||||
|
#include "Marking.h" |
||||
|
|
||||
|
namespace storm { |
||||
|
namespace gspn { |
||||
|
class Transition { |
||||
|
public: |
||||
|
/*! |
||||
|
* Set the multiplicity of the input arc originating from the place. |
||||
|
* If the arc already exists, the former multiplicity is overwritten. |
||||
|
* If the arc does not yet exists, it is created. |
||||
|
* |
||||
|
* @param place The place connected by an input arc. |
||||
|
* @param multiplicity The multiplicity of the specified arc. |
||||
|
*/ |
||||
|
void setInputArcCardinality(uint_fast64_t place, uint_fast64_t multiplicity); |
||||
|
|
||||
|
/*! |
||||
|
* Removes an input arc connected to a given place. |
||||
|
* |
||||
|
* @param place The place from which the input arc is originating. |
||||
|
* @return True if the arc existed. |
||||
|
*/ |
||||
|
bool removeInputArc(uint_fast64_t place); |
||||
|
|
||||
|
/*! |
||||
|
* Checks whether the given place is connected to this transition via an input arc. |
||||
|
* |
||||
|
* @param place The place which is going to be checked. |
||||
|
* @return True if the place is connected via an input arc. |
||||
|
*/ |
||||
|
bool existsInputArc(uint_fast64_t place); |
||||
|
|
||||
|
/*! |
||||
|
* Set the multiplicity of the output arc going to the place. |
||||
|
* If the arc already exists, the former multiplicity is overwritten. |
||||
|
* If the arc does not yet exists, it is created. |
||||
|
* |
||||
|
* @param place The place connected by an output arc. |
||||
|
* @param multiplicity The multiplicity of the specified arc. |
||||
|
*/ |
||||
|
void setOutputArcCardinality(uint_fast64_t place, uint_fast64_t multiplicity); |
||||
|
|
||||
|
/*! |
||||
|
* Removes an output arc connected to a given place. |
||||
|
* |
||||
|
* @param place The place from which the output arc is leading to. |
||||
|
* @return True if the arc existed. |
||||
|
*/ |
||||
|
bool removeOutputArc(uint_fast64_t place); |
||||
|
|
||||
|
/*! |
||||
|
* Checks whether the given place is connected to this transition via an output arc. |
||||
|
* |
||||
|
* @param place The place which is going to be checked. |
||||
|
* @return True if the place is connected via an output arc. |
||||
|
*/ |
||||
|
bool existsOutputArc(uint_fast64_t place); |
||||
|
|
||||
|
/*! |
||||
|
* Set the multiplicity of the inhibition arc originating from the place. |
||||
|
* If the arc already exists, the former multiplicity is overwritten. |
||||
|
* If the arc does not yet exists, it is created. |
||||
|
* |
||||
|
* @param place The place connected by an inhibition arc. |
||||
|
* @param multiplicity The multiplicity of the specified arc. |
||||
|
*/ |
||||
|
void setInhibitionArcCardinality(uint_fast64_t place, uint_fast64_t multiplicity); |
||||
|
|
||||
|
/*! |
||||
|
* Removes an inhibition arc connected to a given place. |
||||
|
* |
||||
|
* @param place The place from which the inhibition arc is originating. |
||||
|
* @return True if the arc existed. |
||||
|
*/ |
||||
|
bool removeInhibitionArc(uint_fast64_t place); |
||||
|
|
||||
|
/*! |
||||
|
* Checks whether the given place is connected to this transition via an inhibition arc. |
||||
|
* |
||||
|
* @param place The place which is going to be checked. |
||||
|
* @return True if the place is connected via an inhibition arc. |
||||
|
*/ |
||||
|
bool existsInhibitionArc(uint_fast64_t place); |
||||
|
|
||||
|
/*! |
||||
|
* Checks if the given marking enables the transition. |
||||
|
* |
||||
|
* @return True if the transition is enabled. |
||||
|
*/ |
||||
|
bool isEnabled(storm::gspn::Marking marking); |
||||
|
|
||||
|
/*! |
||||
|
* Fire the transition if possible. |
||||
|
* |
||||
|
* @param marking The current marking before the transition is fired. |
||||
|
* @return The marking after the transition was fired. |
||||
|
*/ |
||||
|
storm::gspn::Marking fire(const storm::gspn::Marking marking); |
||||
|
private: |
||||
|
// maps places connected to this transition with an input arc to the corresponding multiplicity |
||||
|
std::map<uint_fast64_t, uint_fast64_t> inputMultiplicities; |
||||
|
|
||||
|
// maps places connected to this transition with an output arc to the corresponding multiplicities |
||||
|
std::map<uint_fast64_t, uint_fast64_t> outputMultiplicities; |
||||
|
|
||||
|
// maps places connected to this transition with an inhibition arc to the corresponding multiplicity |
||||
|
std::map<uint_fast64_t, uint_fast64_t> inhibitionMultiplicities; |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif //STORM_TRANSITION_H |
Write
Preview
Loading…
Cancel
Save
Reference in new issue