2 changed files with 178 additions and 0 deletions
			
			
		@ -0,0 +1,89 @@ | 
			
		|||||
 | 
				#include <src/exceptions/IllegalFunctionCallException.h>
 | 
			
		||||
 | 
				#include "GspnBuilder.h"
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				#include "src/utility/macros.h"
 | 
			
		||||
 | 
				#include "src/exceptions/IllegalFunctionCallException.h"
 | 
			
		||||
 | 
				#include "Place.h"
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				namespace storm { | 
			
		||||
 | 
				    namespace gspn { | 
			
		||||
 | 
				        void GspnBuilder::addPlace(uint_fast64_t const& id, int_fast64_t const& capacity, uint_fast64_t const& initialTokens) { | 
			
		||||
 | 
				            addPlace(id, "place_" + std::to_string(id), capacity, initialTokens); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        void GspnBuilder::addPlace(uint_fast64_t const& id, std::string const& name, int_fast64_t const& capacity, uint_fast64_t const& initialTokens) { | 
			
		||||
 | 
				            auto place = storm::gspn::Place(); | 
			
		||||
 | 
				            place.setCapacity(capacity); | 
			
		||||
 | 
				            place.setID(id); | 
			
		||||
 | 
				            place.setName(name); | 
			
		||||
 | 
				            place.setNumberOfInitialTokens(initialTokens); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            idToPlaceName.insert(std::pair<uint_fast64_t const, std::string const>(id, name)); | 
			
		||||
 | 
				            gspn.addPlace(place); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        void GspnBuilder::addImmediateTransition(std::string const& name, uint_fast64_t const& priority, double const& weight) { | 
			
		||||
 | 
				            auto trans = storm::gspn::ImmediateTransition<double>(); | 
			
		||||
 | 
				            trans.setName(name); | 
			
		||||
 | 
				            trans.setPriority(priority); | 
			
		||||
 | 
				            trans.setWeight(weight); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            gspn.addImmediateTransition(trans); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        void GspnBuilder::addTimedTransition(std::string const& name, uint_fast64_t const& priority, double const& rate) { | 
			
		||||
 | 
				            auto trans = storm::gspn::TimedTransition<double>(); | 
			
		||||
 | 
				            trans.setName(name); | 
			
		||||
 | 
				            trans.setPriority(priority); | 
			
		||||
 | 
				            trans.setRate(rate); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            gspn.addTimedTransition(trans); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        void GspnBuilder::addInputArc(uint_fast64_t const& from, std::string const& to, uint_fast64_t const& multiplicity) { | 
			
		||||
 | 
				            auto transPair = gspn.getTransition(to); | 
			
		||||
 | 
				            if (!std::get<0>(transPair)) { | 
			
		||||
 | 
				                STORM_LOG_THROW(false, storm::exceptions::IllegalFunctionCallException, "The transition with the name \"" + to + "\" does not exist."); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            auto placePair = gspn.getPlace(idToPlaceName.at(from)); | 
			
		||||
 | 
				            if (!std::get<0>(placePair)) { | 
			
		||||
 | 
				                STORM_LOG_THROW(false, storm::exceptions::IllegalFunctionCallException, "The place with the id \"" + std::to_string(from) + "\" does not exist."); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            std::get<1>(transPair)->setInputArcMultiplicity(std::get<1>(placePair), multiplicity); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        void GspnBuilder::addInhibitionArc(uint_fast64_t const& from, std::string const& to, uint_fast64_t const& multiplicity) { | 
			
		||||
 | 
				            auto transPair = gspn.getTransition(to); | 
			
		||||
 | 
				            if (!std::get<0>(transPair)) { | 
			
		||||
 | 
				                STORM_LOG_THROW(false, storm::exceptions::IllegalFunctionCallException, "The transition with the name \"" + to + "\" does not exist."); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            auto placePair = gspn.getPlace(idToPlaceName.at(from)); | 
			
		||||
 | 
				            if (!std::get<0>(placePair)) { | 
			
		||||
 | 
				                STORM_LOG_THROW(false, storm::exceptions::IllegalFunctionCallException, "The place with the id \"" + std::to_string(from) + "\" does not exist."); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            std::get<1>(transPair)->setInhibitionArcMultiplicity(std::get<1>(placePair), multiplicity); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        void GspnBuilder::addOutputArc(uint_fast64_t const& from, std::string const& to, uint_fast64_t const& multiplicity) { | 
			
		||||
 | 
				            auto transPair = gspn.getTransition(to); | 
			
		||||
 | 
				            if (!std::get<0>(transPair)) { | 
			
		||||
 | 
				                STORM_LOG_THROW(false, storm::exceptions::IllegalFunctionCallException, "The transition with the name \"" + to + "\" does not exist."); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            auto placePair = gspn.getPlace(idToPlaceName.at(from)); | 
			
		||||
 | 
				            if (!std::get<0>(placePair)) { | 
			
		||||
 | 
				                STORM_LOG_THROW(false, storm::exceptions::IllegalFunctionCallException, "The place with the id \"" + std::to_string(from) + "\" does not exist."); | 
			
		||||
 | 
				            } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            std::get<1>(transPair)->setOutputArcMultiplicity(std::get<1>(placePair), multiplicity); | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				        storm::gspn::GSPN const& GspnBuilder::buildGspn() const { | 
			
		||||
 | 
				            return gspn; | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				} | 
			
		||||
@ -0,0 +1,89 @@ | 
			
		|||||
 | 
				#ifndef STORM_STORAGE_GSPN_GSPNBUILDER_H | 
			
		||||
 | 
				#define STORM_STORAGE_GSPN_GSPNBUILDER_H | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				#include <map> | 
			
		||||
 | 
				#include <string> | 
			
		||||
 | 
				#include <vector> | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				#include "GSPN.h" | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				namespace storm { | 
			
		||||
 | 
				    namespace gspn { | 
			
		||||
 | 
				        class GspnBuilder { | 
			
		||||
 | 
				        public: | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Add a place to the gspn. | 
			
		||||
 | 
				             * @param id The id must be unique for the gspn. | 
			
		||||
 | 
				             * @param capacity The capacity is the limit of tokens in the place. | 
			
		||||
 | 
				             *                 A capacity of -1 indicates an unbounded place. | 
			
		||||
 | 
				             * @param initialTokens The number of inital tokens in the place. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addPlace(uint_fast64_t const& id, int_fast64_t const& capacity = 1, uint_fast64_t const& initialTokens = 0); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Add a place to the gspn. | 
			
		||||
 | 
				             * @param id The id must be unique for the gspn. | 
			
		||||
 | 
				             * @param name The name must be unique for the gspn. | 
			
		||||
 | 
				             * @param capacity The capacity is the limit of tokens in the place. | 
			
		||||
 | 
				             *                 A capacity of -1 indicates an unbounded place. | 
			
		||||
 | 
				             * @param initialTokens The number of inital tokens in the place. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addPlace(uint_fast64_t const& id, std::string const& name, int_fast64_t const& capacity = 1, uint_fast64_t const& initialTokens = 0); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Adds an immediate transition to the gspn. | 
			
		||||
 | 
				             * @param name The name must be unique for the gspn. | 
			
		||||
 | 
				             * @param priority The priority for the transtion. | 
			
		||||
 | 
				             * @param weight The weight for the transition. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addImmediateTransition(std::string const& name, uint_fast64_t const& priority = 0, double const& weight = 0); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Adds an timed transition to the gspn. | 
			
		||||
 | 
				             * @param name The name must be unique for the gspn. | 
			
		||||
 | 
				             * @param priority The priority for the transtion. | 
			
		||||
 | 
				             * @param weight The weight for the transition. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addTimedTransition(std::string const& name, uint_fast64_t const& priority = 0, double const& rate = 0); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Adds an new input arc from a place to an transition. | 
			
		||||
 | 
				             * @param from The place from which the arc is originating. | 
			
		||||
 | 
				             * @param to The transtion to which the arc goes to. | 
			
		||||
 | 
				             * @param multiplicity The multiplicity of the arc. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addInputArc(uint_fast64_t const& from, std::string const& to, uint_fast64_t const& multiplicity = 1); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Adds an new input arc from a place to an transition. | 
			
		||||
 | 
				             * @param from The place from which the arc is originating. | 
			
		||||
 | 
				             * @param to The transtion to which the arc goes to. | 
			
		||||
 | 
				             * @param multiplicity The multiplicity of the arc. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addInhibitionArc(uint_fast64_t const& from, std::string const& to, uint_fast64_t const& multiplicity = 1); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * Adds an new input arc from a place to an transition. | 
			
		||||
 | 
				             * @param from The place from which the arc is originating. | 
			
		||||
 | 
				             * @param to The transtion to which the arc goes to. | 
			
		||||
 | 
				             * @param multiplicity The multiplicity of the arc. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            void addOutputArc(uint_fast64_t const& from, std::string const& to, uint_fast64_t const& multiplicity = 1); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				            /** | 
			
		||||
 | 
				             * | 
			
		||||
 | 
				             * @return The gspn which is constructed by the builder. | 
			
		||||
 | 
				             */ | 
			
		||||
 | 
				            storm::gspn::GSPN const& buildGspn() const; | 
			
		||||
 | 
				        private: | 
			
		||||
 | 
				            // gspn which is returned | 
			
		||||
 | 
				            storm::gspn::GSPN gspn; | 
			
		||||
 | 
				            // map from ids to names (for places) | 
			
		||||
 | 
				            std::map<uint_fast64_t const, std::string const> idToPlaceName; | 
			
		||||
 | 
				        }; | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				} | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				#endif //STORM_STORAGE_GSPN_GSPNBUILDER_H | 
			
		||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue