3 changed files with 52 additions and 8 deletions
			
			
		- 
					57src/storm/builder/BuilderType.cpp
 - 
					1src/storm/builder/BuilderType.h
 - 
					2src/storm/utility/Engine.cpp
 
@ -1,23 +1,66 @@ | 
				
			|||
#include "storm/builder/BuilderType.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/storage/dd/DdType.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/storage/jani/ModelFeatures.h"
 | 
				
			|||
#include "storm/generator/JaniNextStateGenerator.h"
 | 
				
			|||
#include "storm/generator/PrismNextStateGenerator.h"
 | 
				
			|||
#include "storm/builder/DdJaniModelBuilder.h"
 | 
				
			|||
#include "storm/builder/DdPrismModelBuilder.h"
 | 
				
			|||
#include "storm/builder/jit/ExplicitJitJaniModelBuilder.h"
 | 
				
			|||
 | 
				
			|||
#include "storm/utility/macros.h"
 | 
				
			|||
#include "storm/exceptions/UnexpectedException.h"
 | 
				
			|||
 | 
				
			|||
namespace storm { | 
				
			|||
    namespace builder { | 
				
			|||
         | 
				
			|||
        storm::jani::ModelFeatures getSupportedJaniFeatures(BuilderType const& builderType) { | 
				
			|||
            storm::jani::ModelFeatures features; | 
				
			|||
            features.add(storm::jani::ModelFeature::DerivedOperators); | 
				
			|||
            features.add(storm::jani::ModelFeature::StateExitRewards); | 
				
			|||
            if (builderType == BuilderType::Explicit) { | 
				
			|||
                features.add(storm::jani::ModelFeature::Arrays); | 
				
			|||
            // The supported jani features should be independent of the ValueType and Dd type. We just take sylvan and double for all.
 | 
				
			|||
            storm::dd::DdType const ddType = storm::dd::DdType::Sylvan; | 
				
			|||
            typedef double ValueType; | 
				
			|||
            switch (builderType) { | 
				
			|||
                case BuilderType::Explicit: | 
				
			|||
                    return storm::generator::JaniNextStateGenerator<ValueType>::getSupportedJaniFeatures(); | 
				
			|||
                case BuilderType::Dd: | 
				
			|||
                    return storm::builder::DdJaniModelBuilder<ddType, ValueType>::getSupportedJaniFeatures(); | 
				
			|||
                case BuilderType::Jit: | 
				
			|||
                    return storm::builder::jit::ExplicitJitJaniModelBuilder<ValueType>::getSupportedJaniFeatures(); | 
				
			|||
                 | 
				
			|||
            } | 
				
			|||
            return features; | 
				
			|||
            STORM_LOG_THROW(false, storm::exceptions::UnexpectedException, "Unexpected builder type."); | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
        template <typename ValueType> | 
				
			|||
        bool canHandle(BuilderType const& builderType, storm::storage::SymbolicModelDescription const& modelDescription) { | 
				
			|||
            return true; | 
				
			|||
            storm::dd::DdType const ddType = storm::dd::DdType::Sylvan; | 
				
			|||
            if (!modelDescription.hasModel()) { | 
				
			|||
                // If there is no model to be build, we assume that the task of obtaining a model is either not required or can be accomplished somehow.
 | 
				
			|||
                return true; | 
				
			|||
            } | 
				
			|||
            STORM_LOG_THROW(modelDescription.isPrismProgram() || modelDescription.isJaniModel(), storm::exceptions::UnexpectedException, "The model is neither PRISM nor Jani which is not expected."); | 
				
			|||
            switch (builderType) { | 
				
			|||
                case BuilderType::Explicit: | 
				
			|||
                    if (modelDescription.isPrismProgram()) { | 
				
			|||
                        return storm::generator::PrismNextStateGenerator<ValueType>::canHandle(modelDescription.asPrismProgram()); | 
				
			|||
                    } else { | 
				
			|||
                        return storm::generator::JaniNextStateGenerator<ValueType>::canHandle(modelDescription.asJaniModel()); | 
				
			|||
                    } | 
				
			|||
                case BuilderType::Dd: | 
				
			|||
                    if (modelDescription.isPrismProgram()) { | 
				
			|||
                        return storm::builder::DdPrismModelBuilder<ddType, ValueType>::canHandle(modelDescription.asPrismProgram()); | 
				
			|||
                    } else { | 
				
			|||
                        return storm::builder::DdJaniModelBuilder<ddType, ValueType>::canHandle(modelDescription.asJaniModel()); | 
				
			|||
                    } | 
				
			|||
                case BuilderType::Jit: | 
				
			|||
                    return storm::builder::jit::ExplicitJitJaniModelBuilder<ValueType>::canHandle(modelDescription.asJaniModel()); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
         | 
				
			|||
 | 
				
			|||
         | 
				
			|||
        template bool canHandle<double>(BuilderType const& builderType, storm::storage::SymbolicModelDescription const& modelDescription); | 
				
			|||
        template bool canHandle<storm::RationalNumber>(BuilderType const& builderType, storm::storage::SymbolicModelDescription const& modelDescription); | 
				
			|||
         | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue