Browse Source
			
			
			partial implementation of gspns, transitions and markings
			
				
		partial implementation of gspns, transitions and markings
	
		
	
			
				Former-commit-id: 77d76d6c89
			
			
				main
			
			
		
				 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