Browse Source
			
			
			first version jani export for gspns
			
				
		first version jani export for gspns
	
		
	
			
				Former-commit-id:maina1bcd24cbe[formerly99e3d151d4] Former-commit-id:31473ed214
				 3 changed files with 188 additions and 12 deletions
			
			
		| @ -0,0 +1 @@ | |||
| #include "JaniGSPNBuilder.h"
 | |||
| @ -0,0 +1,161 @@ | |||
| #pragma once | |||
| 
 | |||
| #include "src/storage/gspn/GSPN.h" | |||
| #include "src/storage/jani/Model.h" | |||
| #include "src/storage/expressions/ExpressionManager.h" | |||
| 
 | |||
| namespace storm { | |||
|     namespace builder { | |||
|         class JaniGSPNBuilder { | |||
|         public: | |||
|             JaniGSPNBuilder(storm::gspn::GSPN const& gspn, std::shared_ptr<storm::expressions::ExpressionManager> const& expManager) : gspn(gspn), expressionManager(expManager) { | |||
|                  | |||
|             } | |||
|              | |||
|             virtual ~JaniGSPNBuilder() { | |||
|                 for (auto const& varEntry : vars) { | |||
|                     delete varEntry.second; | |||
|                 } | |||
|             } | |||
|              | |||
|             bool setIgnoreWeights(bool ignore = true)  { | |||
|                 ignoreWeights = ignore; | |||
|             } | |||
|              | |||
|              | |||
|             storm::jani::Model* build() { | |||
|                 storm::jani::Model* model = new storm::jani::Model(gspn.getName(), storm::jani::ModelType::MA, janiVersion, expressionManager); | |||
|                 storm::jani::Automaton mainAutomaton("immediate"); | |||
|                 addVariables(model); | |||
|                 uint64_t locId = addLocation(mainAutomaton); | |||
|                 addEdges(mainAutomaton, locId); | |||
|                 model->addAutomaton(mainAutomaton); | |||
|                 model->setStandardSystemComposition(); | |||
|                 return model; | |||
|             } | |||
|              | |||
|             void addVariables(storm::jani::Model* model) { | |||
|                 for (auto const& place : gspn.getPlaces()) { | |||
|                     storm::jani::Variable* janiVar = nullptr; | |||
|                     if (place.getCapacity() == -1) { | |||
|                         // Effectively no capacity limit known | |||
|                         janiVar = new storm::jani::UnboundedIntegerVariable(place.getName(), expressionManager->declareIntegerVariable(place.getName()), expressionManager->integer(place.getNumberOfInitialTokens()), false); | |||
|                     } else { | |||
|                         janiVar = new storm::jani::BoundedIntegerVariable(place.getName(), expressionManager->declareIntegerVariable(place.getName()), expressionManager->integer(place.getNumberOfInitialTokens()), expressionManager->integer(0), expressionManager->integer(place.getCapacity())); | |||
|                     } | |||
|                     assert(janiVar != nullptr); | |||
|                     assert(vars.count(place.getID()) == 0); | |||
|                     vars[place.getID()] = janiVar; | |||
|                     model->addVariable(*janiVar); | |||
|                 } | |||
|             } | |||
|              | |||
|             uint64_t addLocation(storm::jani::Automaton& automaton) { | |||
|                 uint64_t janiLoc = automaton.addLocation(storm::jani::Location("loc")); | |||
|                 automaton.addInitialLocation("loc"); | |||
|                 return janiLoc; | |||
|             } | |||
|              | |||
|             void addEdges(storm::jani::Automaton& automaton, uint64_t locId) { | |||
|                  | |||
|                 storm::expressions::Expression guard = expressionManager->boolean(true); | |||
|                 for (auto const& trans : gspn.getImmediateTransitions()) { | |||
|                     if (ignoreWeights || trans->noWeightAttached()) { | |||
|                         std::vector<storm::jani::Assignment> assignments; | |||
|                         for (auto inPlaceIt = trans->getInputPlacesCBegin(); inPlaceIt != trans->getInputPlacesCEnd(); ++inPlaceIt) { | |||
|                             guard = guard && (vars[(**inPlaceIt).getID()]->getExpressionVariable() > trans->getInputArcMultiplicity(**inPlaceIt)); | |||
|                             assignments.emplace_back( *vars[(**inPlaceIt).getID()], (vars[(**inPlaceIt).getID()]->getExpressionVariable() - trans->getInputArcMultiplicity(**inPlaceIt)) ); | |||
|                         } | |||
|                         for (auto inhibPlaceIt = trans->getInhibitionPlacesCBegin(); inhibPlaceIt != trans->getInhibitionPlacesCEnd(); ++inhibPlaceIt) { | |||
|                             guard = guard && (vars[(**inhibPlaceIt).getID()]->getExpressionVariable() > trans->getInhibitionArcMultiplicity(**inhibPlaceIt)); | |||
|                         } | |||
|                         for (auto outputPlaceIt = trans->getOutputPlacesCBegin(); outputPlaceIt != trans->getOutputPlacesCEnd(); ++outputPlaceIt) { | |||
|                             assignments.emplace_back( *vars[(**outputPlaceIt).getID()], (vars[(**outputPlaceIt).getID()]->getExpressionVariable() + trans->getOutputArcMultiplicity(**outputPlaceIt)) ); | |||
|                         } | |||
|                         storm::jani::OrderedAssignments oa(assignments); | |||
|                         storm::jani::EdgeDestination dest(locId, expressionManager->integer(1), oa); | |||
|                         storm::jani::Edge e(locId, storm::jani::Model::silentActionIndex, boost::none, guard, {dest}); | |||
|                         automaton.addEdge(e); | |||
|                     } | |||
|                      | |||
|                 } | |||
|                 if(!ignoreWeights) { | |||
|                  | |||
|                     // TODO here there is something to fix if we add transition partitions. | |||
|                     storm::expressions::Expression guard = expressionManager->boolean(false); | |||
|                     std::vector<storm::jani::EdgeDestination> weightedDestinations; | |||
|                      | |||
|                     // Compute enabled weight expression. | |||
|                     storm::expressions::Expression totalWeight = expressionManager->rational(0.0); | |||
|                     for (auto const& trans : gspn.getImmediateTransitions()) { | |||
|                         if (trans->noWeightAttached()) { | |||
|                             continue; | |||
|                         } | |||
|                         storm::expressions::Expression destguard = expressionManager->boolean(true); | |||
|                         for (auto inPlaceIt = trans->getInputPlacesCBegin(); inPlaceIt != trans->getInputPlacesCEnd(); ++inPlaceIt) { | |||
|                             destguard = destguard && (vars[(**inPlaceIt).getID()]->getExpressionVariable() > trans->getInputArcMultiplicity(**inPlaceIt)); | |||
|                         } | |||
|                         for (auto inhibPlaceIt = trans->getInhibitionPlacesCBegin(); inhibPlaceIt != trans->getInhibitionPlacesCEnd(); ++inhibPlaceIt) { | |||
|                             destguard = destguard && (vars[(**inhibPlaceIt).getID()]->getExpressionVariable() > trans->getInhibitionArcMultiplicity(**inhibPlaceIt)); | |||
|                         } | |||
|                         totalWeight = totalWeight + storm::expressions::ite(destguard, expressionManager->rational(trans->getWeight()), expressionManager->rational(0.0)); | |||
|                          | |||
|                     } | |||
|                     totalWeight = totalWeight.simplify(); | |||
|                      | |||
|                     for (auto const& trans : gspn.getImmediateTransitions()) { | |||
|                         if (trans->noWeightAttached()) { | |||
|                             continue; | |||
|                         } | |||
|                         storm::expressions::Expression destguard = expressionManager->boolean(true); | |||
|                         std::vector<storm::jani::Assignment> assignments; | |||
|                         for (auto inPlaceIt = trans->getInputPlacesCBegin(); inPlaceIt != trans->getInputPlacesCEnd(); ++inPlaceIt) { | |||
|                             destguard = destguard && (vars[(**inPlaceIt).getID()]->getExpressionVariable() > trans->getInputArcMultiplicity(**inPlaceIt)); | |||
|                             assignments.emplace_back( *vars[(**inPlaceIt).getID()], (vars[(**inPlaceIt).getID()]->getExpressionVariable() - trans->getInputArcMultiplicity(**inPlaceIt)) ); | |||
|                         } | |||
|                         for (auto inhibPlaceIt = trans->getInhibitionPlacesCBegin(); inhibPlaceIt != trans->getInhibitionPlacesCEnd(); ++inhibPlaceIt) { | |||
|                             destguard = destguard && (vars[(**inhibPlaceIt).getID()]->getExpressionVariable() > trans->getInhibitionArcMultiplicity(**inhibPlaceIt)); | |||
|                         } | |||
|                         for (auto outputPlaceIt = trans->getOutputPlacesCBegin(); outputPlaceIt != trans->getOutputPlacesCEnd(); ++outputPlaceIt) { | |||
|                             assignments.emplace_back( *vars[(**outputPlaceIt).getID()], (vars[(**outputPlaceIt).getID()]->getExpressionVariable() + trans->getOutputArcMultiplicity(**outputPlaceIt)) ); | |||
|                         } | |||
|                         destguard = destguard.simplify(); | |||
|                         guard = guard || destguard; | |||
|                         storm::jani::OrderedAssignments oa(assignments); | |||
|                         storm::jani::EdgeDestination dest(locId, storm::expressions::ite(destguard, (expressionManager->rational(trans->getWeight()) / totalWeight), expressionManager->rational(0.0)), oa); | |||
|                         weightedDestinations.push_back(dest); | |||
|                     } | |||
|                     storm::jani::Edge e(locId, storm::jani::Model::silentActionIndex, boost::none, guard.simplify(), weightedDestinations); | |||
|                     automaton.addEdge(e); | |||
|                 } | |||
|                 for (auto const& trans : gspn.getTimedTransitions()) { | |||
|                     storm::expressions::Expression guard = expressionManager->boolean(true); | |||
|                      | |||
|                     std::vector<storm::jani::Assignment> assignments; | |||
|                     for (auto inPlaceIt = trans->getInputPlacesCBegin(); inPlaceIt != trans->getInputPlacesCEnd(); ++inPlaceIt) { | |||
|                         guard = guard && (vars[(**inPlaceIt).getID()]->getExpressionVariable() > trans->getInputArcMultiplicity(**inPlaceIt)); | |||
|                         assignments.emplace_back( *vars[(**inPlaceIt).getID()], (vars[(**inPlaceIt).getID()]->getExpressionVariable() - trans->getInputArcMultiplicity(**inPlaceIt)) ); | |||
|                     } | |||
|                     for (auto inhibPlaceIt = trans->getInhibitionPlacesCBegin(); inhibPlaceIt != trans->getInhibitionPlacesCEnd(); ++inhibPlaceIt) { | |||
|                         guard = guard && (vars[(**inhibPlaceIt).getID()]->getExpressionVariable() > trans->getInhibitionArcMultiplicity(**inhibPlaceIt)); | |||
|                     } | |||
|                     for (auto outputPlaceIt = trans->getOutputPlacesCBegin(); outputPlaceIt != trans->getOutputPlacesCEnd(); ++outputPlaceIt) { | |||
|                         assignments.emplace_back( *vars[(**outputPlaceIt).getID()], (vars[(**outputPlaceIt).getID()]->getExpressionVariable() + trans->getOutputArcMultiplicity(**outputPlaceIt)) ); | |||
|                     } | |||
|                     storm::jani::OrderedAssignments oa(assignments); | |||
|                     storm::jani::EdgeDestination dest(locId, expressionManager->integer(1), oa); | |||
|                     storm::jani::Edge e(locId, storm::jani::Model::silentActionIndex, expressionManager->rational(trans->getRate()), guard, {dest}); | |||
|                     automaton.addEdge(e); | |||
|                 } | |||
|             } | |||
|              | |||
|         private: | |||
|             bool ignoreWeights; | |||
|             const uint64_t janiVersion = 1; | |||
|             storm::gspn::GSPN const& gspn; | |||
|             std::map<uint64_t, storm::jani::Variable*> vars; | |||
|             std::shared_ptr<storm::expressions::ExpressionManager> expressionManager; | |||
|              | |||
|         }; | |||
|     } | |||
| } | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue