| 
					
					
						
							
						
					
					
				 | 
				@ -6,6 +6,7 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				#include "storm/storage/prism/CompositionToJaniVisitor.h"
 | 
				 | 
				 | 
				#include "storm/storage/prism/CompositionToJaniVisitor.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
				#include "storm/storage/jani/Model.h"
 | 
				 | 
				 | 
				#include "storm/storage/jani/Model.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
				#include "storm/storage/jani/TemplateEdge.h"
 | 
				 | 
				 | 
				#include "storm/storage/jani/TemplateEdge.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				#include "storm/storage/jani/expressions/FunctionCallExpression.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				#include "storm/settings/SettingsManager.h"
 | 
				 | 
				 | 
				#include "storm/settings/SettingsManager.h"
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -37,11 +38,22 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				            storm::jani::Model janiModel("jani_from_prism", modelType, 1, manager); | 
				 | 
				 | 
				            storm::jani::Model janiModel("jani_from_prism", modelType, 1, manager); | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            janiModel.getModelFeatures().add(storm::jani::ModelFeature::DerivedOperators); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				            // Add all constants of the PRISM program to the JANI model.
 | 
				 | 
				 | 
				            // Add all constants of the PRISM program to the JANI model.
 | 
			
		
		
	
		
			
				 | 
				 | 
				            for (auto const& constant : program.getConstants()) { | 
				 | 
				 | 
				            for (auto const& constant : program.getConstants()) { | 
			
		
		
	
		
			
				 | 
				 | 
				                janiModel.addConstant(storm::jani::Constant(constant.getName(), constant.getExpressionVariable(), constant.isDefined() ? boost::optional<storm::expressions::Expression>(constant.getExpression()) : boost::none)); | 
				 | 
				 | 
				                janiModel.addConstant(storm::jani::Constant(constant.getName(), constant.getExpressionVariable(), constant.isDefined() ? boost::optional<storm::expressions::Expression>(constant.getExpression()) : boost::none)); | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            // Add all formulas of the PRISM program to the JANI model.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            // Also collect a set of variables that occurr in a formula expressions as these need to be made global.
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            std::set<storm::expressions::Variable> formulaExpressionVariables; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto const& formula : program.getFormulas()) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                storm::jani::FunctionDefinition funDef(formula.getName(), formula.getType(), {}, formula.getExpression()); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                janiModel.addFunctionDefinition(funDef); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                formula.getExpression().getBaseExpression().gatherVariables(formulaExpressionVariables); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				            // Maintain a mapping from expression variables to JANI variables so we can fill in the correct objects when
 | 
				 | 
				 | 
				            // Maintain a mapping from expression variables to JANI variables so we can fill in the correct objects when
 | 
			
		
		
	
		
			
				 | 
				 | 
				            // creating assignments.
 | 
				 | 
				 | 
				            // creating assignments.
 | 
			
		
		
	
		
			
				 | 
				 | 
				            std::map<storm::expressions::Variable, std::reference_wrapper<storm::jani::Variable const>> variableToVariableMap; | 
				 | 
				 | 
				            std::map<storm::expressions::Variable, std::reference_wrapper<storm::jani::Variable const>> variableToVariableMap; | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -104,7 +116,7 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            for (auto const& varMods : variablesToAccessingModuleIndices) { | 
				 | 
				 | 
				            for (auto const& varMods : variablesToAccessingModuleIndices) { | 
			
		
		
	
		
			
				 | 
				 | 
				                assert(!varMods.second.empty()); | 
				 | 
				 | 
				                assert(!varMods.second.empty()); | 
			
		
		
	
		
			
				 | 
				 | 
				                // If there is exactly one module reading and writing the variable, we can make the variable local to this module.
 | 
				 | 
				 | 
				                // If there is exactly one module reading and writing the variable, we can make the variable local to this module.
 | 
			
		
		
	
		
			
				 | 
				 | 
				                variablesToMakeGlobal[varMods.first] = allVariablesGlobal || (varMods.second.size() > 1); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                variablesToMakeGlobal[varMods.first] = allVariablesGlobal || (varMods.second.size() > 1) || formulaExpressionVariables.count(varMods.first) > 0; | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				            // Go through the labels and construct assignments to transient variables that are added to the locations.
 | 
				 | 
				 | 
				            // Go through the labels and construct assignments to transient variables that are added to the locations.
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -343,6 +355,17 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                janiModel.setSystemComposition(janiModel.getStandardSystemComposition()); | 
				 | 
				 | 
				                janiModel.setSystemComposition(janiModel.getStandardSystemComposition()); | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            // if there are formulas, replace the placeholder variables by actual function calls in all expressions
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            if (program.getNumberOfFormulas() > 0) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                janiModel.getModelFeatures().add(storm::jani::ModelFeature::Functions); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                std::map<storm::expressions::Variable, storm::expressions::Expression> substitution; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                for (auto const& formula : program.getFormulas()) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    storm::expressions::Expression functionCallExpr = std::make_shared<storm::expressions::FunctionCallExpression>(*manager, formula.getType(), formula.getName(), std::vector<std::shared_ptr<storm::expressions::BaseExpression const>>())->toExpression(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    substitution.emplace(formula.getExpressionVariable(), functionCallExpr); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                janiModel.substitute(substitution); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				            janiModel.finalize(); | 
				 | 
				 | 
				            janiModel.finalize(); | 
			
		
		
	
		
			
				 | 
				 | 
				             | 
				 | 
				 | 
				             | 
			
		
		
	
		
			
				 | 
				 | 
				            return janiModel; | 
				 | 
				 | 
				            return janiModel; | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |