|  | @ -31,6 +31,8 @@ | 
		
	
		
			
				|  |  | #include "src/utility/ErrorHandling.h"
 |  |  | #include "src/utility/ErrorHandling.h"
 | 
		
	
		
			
				|  |  | #include "src/formula/Prctl.h"
 |  |  | #include "src/formula/Prctl.h"
 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | #include "src/parser/PrctlFileParser.h"
 | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | #include "log4cplus/logger.h"
 |  |  | #include "log4cplus/logger.h"
 | 
		
	
		
			
				|  |  | #include "log4cplus/loggingmacros.h"
 |  |  | #include "log4cplus/loggingmacros.h"
 | 
		
	
		
			
				|  |  | #include "log4cplus/consoleappender.h"
 |  |  | #include "log4cplus/consoleappender.h"
 | 
		
	
	
		
			
				|  | @ -108,10 +110,6 @@ bool parseOptions(const int argc, const char* argv[]) { | 
		
	
		
			
				|  |  | 		std::cout << storm::settings::help; |  |  | 		std::cout << storm::settings::help; | 
		
	
		
			
				|  |  | 		return false; |  |  | 		return false; | 
		
	
		
			
				|  |  | 	} |  |  | 	} | 
		
	
		
			
				|  |  | 	if (s->isSet("test-prctl")) { |  |  |  | 
		
	
		
			
				|  |  | 		storm::parser::PrctlParser parser(s->getString("test-prctl").c_str()); |  |  |  | 
		
	
		
			
				|  |  | 		return false; |  |  |  | 
		
	
		
			
				|  |  | 	} |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	if (s->isSet("verbose")) { |  |  | 	if (s->isSet("verbose")) { | 
		
	
		
			
				|  |  | 		logger.getAppender("mainConsoleAppender")->setThreshold(log4cplus::INFO_LOG_LEVEL); |  |  | 		logger.getAppender("mainConsoleAppender")->setThreshold(log4cplus::INFO_LOG_LEVEL); | 
		
	
	
		
			
				|  | @ -139,322 +137,100 @@ void cleanUp() { | 
		
	
		
			
				|  |  | 	// nothing here
 |  |  | 	// nothing here
 | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | void testCheckingDie(storm::models::Dtmc<double>& dtmc) { |  |  |  | 
		
	
		
			
				|  |  | 	storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>* mc = new storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>(dtmc); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* oneFormula = new storm::property::prctl::Ap<double>("one"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(oneFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	oneFormula = new storm::property::prctl::Ap<double>("two"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(oneFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	oneFormula = new storm::property::prctl::Ap<double>("three"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(oneFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* done = new storm::property::prctl::Ap<double>("done"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(done); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  | 	delete mc; |  |  |  | 
		
	
		
			
				|  |  | } |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | void testCheckingCrowds(storm::models::Dtmc<double>& dtmc) { |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* observe0Greater1Formula = new storm::property::prctl::Ap<double>("observe0Greater1"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(observe0Greater1Formula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>* mc = new storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>(dtmc); |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* observeIGreater1Formula = new storm::property::prctl::Ap<double>("observeIGreater1"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(observeIGreater1Formula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* observeOnlyTrueSenderFormula = new storm::property::prctl::Ap<double>("observeOnlyTrueSender"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(observeOnlyTrueSenderFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	delete mc; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | /*!
 | 
		
	
		
			
				|  |  |  |  |  |  * Factory style creation of new DTMC model checker | 
		
	
		
			
				|  |  |  |  |  |  * @param dtmc The Dtmc that the model checker will check | 
		
	
		
			
				|  |  |  |  |  |  * @return | 
		
	
		
			
				|  |  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  |  | storm::modelchecker::AbstractModelChecker<double>* createPrctlModelChecker(storm::models::Dtmc<double>& dtmc) { | 
		
	
		
			
				|  |  |  |  |  | 	storm::settings::Settings* s = storm::settings::instance(); | 
		
	
		
			
				|  |  |  |  |  | 	if (s->getString("matrixlib") == "gmm++") { | 
		
	
		
			
				|  |  |  |  |  | 		return new storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>(dtmc); | 
		
	
		
			
				|  |  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 	// The control flow should never reach this point, as there is a default setting for matrixlib (gmm++)
 | 
		
	
		
			
				|  |  |  |  |  | 	std::string message = "No matrix library suitable for DTMC model checking has been set"; | 
		
	
		
			
				|  |  |  |  |  | 	throw storm::exceptions::InvalidSettingsException() << message; | 
		
	
		
			
				|  |  |  |  |  | 	return nullptr; | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | void testCheckingSynchronousLeader(storm::models::Dtmc<double>& dtmc, uint_fast64_t n) { |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(electedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>* mc = new storm::modelchecker::GmmxxDtmcPrctlModelChecker<double>(dtmc); |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::BoundedUntil<double>* boundedUntilFormula = new storm::property::prctl::BoundedUntil<double>(new storm::property::prctl::Ap<double>("true"), electedFormula, n * 4); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedUntilFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(electedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	delete mc; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | /*!
 | 
		
	
		
			
				|  |  |  |  |  |  * Factory style creation of new MDP model checker | 
		
	
		
			
				|  |  |  |  |  |  * @param mdp The Dtmc that the model checker will check | 
		
	
		
			
				|  |  |  |  |  |  * @return | 
		
	
		
			
				|  |  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  |  | storm::modelchecker::AbstractModelChecker<double>* createPrctlModelChecker(storm::models::Mdp<double>& mdp) { | 
		
	
		
			
				|  |  |  |  |  | 	storm::settings::Settings* s = storm::settings::instance(); | 
		
	
		
			
				|  |  |  |  |  | 	if (s->getString("matrixlib") == "gmm++") { | 
		
	
		
			
				|  |  |  |  |  | 		return new storm::modelchecker::GmmxxMdpPrctlModelChecker<double>(mdp); | 
		
	
		
			
				|  |  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 	// The control flow should never reach this point, as there is a default setting for matrixlib (gmm++)
 | 
		
	
		
			
				|  |  |  |  |  | 	std::string message = "No matrix library suitable for MDP model checking has been set"; | 
		
	
		
			
				|  |  |  |  |  | 	throw storm::exceptions::InvalidSettingsException() << message; | 
		
	
		
			
				|  |  |  |  |  | 	return nullptr; | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | void testCheckingDice(storm::models::Mdp<double>& mdp) { |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* twoFormula = new storm::property::prctl::Ap<double>("two"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::modelchecker::GmmxxMdpPrctlModelChecker<double>* mc = new storm::modelchecker::GmmxxMdpPrctlModelChecker<double>(mdp); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("two"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("three"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("three"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("four"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("four"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("five"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("five"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("six"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	twoFormula = new storm::property::prctl::Ap<double>("six"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(twoFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* doneFormula = new storm::property::prctl::Ap<double>("done"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(doneFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	doneFormula = new storm::property::prctl::Ap<double>("done"); |  |  |  | 
		
	
		
			
				|  |  | 	reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(doneFormula); |  |  |  | 
		
	
		
			
				|  |  | 	rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | /*!
 | 
		
	
		
			
				|  |  |  |  |  |  * Calls the check method of a model checker for all PRCTL formulas in a given list. | 
		
	
		
			
				|  |  |  |  |  |  * | 
		
	
		
			
				|  |  |  |  |  |  * @param formulaList The list of PRCTL formulas | 
		
	
		
			
				|  |  |  |  |  |  * @param mc the model checker | 
		
	
		
			
				|  |  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  |  | void checkPrctlFormulasAgainstModel(std::list<storm::property::prctl::AbstractPrctlFormula<double>*>& formulaList, | 
		
	
		
			
				|  |  |  |  |  | 									storm::modelchecker::AbstractModelChecker<double> const& mc) { | 
		
	
		
			
				|  |  |  |  |  | 	for ( auto formula : formulaList ) { | 
		
	
		
			
				|  |  |  |  |  | 		mc.check(*formula); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	delete mc; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		//TODO: Should that be done here or in a second iteration through the list?
 | 
		
	
		
			
				|  |  |  |  |  | 		delete formula; | 
		
	
		
			
				|  |  |  |  |  | 	} | 
		
	
		
			
				|  |  |  |  |  | 	formulaList.clear(); | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | void testCheckingAsynchLeader(storm::models::Mdp<double>& mdp) { |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(electedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probMinFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::modelchecker::GmmxxMdpPrctlModelChecker<double>* mc = new storm::modelchecker::GmmxxMdpPrctlModelChecker<double>(mdp); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probMinFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probMinFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(electedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probMaxFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probMaxFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probMaxFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::BoundedEventually<double>* boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(electedFormula, 25); |  |  |  | 
		
	
		
			
				|  |  | 	probMinFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probMinFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probMinFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(electedFormula, 25); |  |  |  | 
		
	
		
			
				|  |  | 	probMaxFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probMaxFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probMaxFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(electedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, true); |  |  |  | 
		
	
		
			
				|  |  |  |  |  | /*!
 | 
		
	
		
			
				|  |  |  |  |  |  * Check method for DTMCs | 
		
	
		
			
				|  |  |  |  |  |  * @param dtmc Reference to the DTMC to check | 
		
	
		
			
				|  |  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  |  | void checkMdp(std::shared_ptr<storm::models::Mdp<double>> mdp) { | 
		
	
		
			
				|  |  |  |  |  | 	mdp->printModelInformationToStream(std::cout); | 
		
	
		
			
				|  |  |  |  |  | 	storm::settings::Settings* s = storm::settings::instance(); | 
		
	
		
			
				|  |  |  |  |  | 	if (s->isSet("prctl")) { | 
		
	
		
			
				|  |  |  |  |  | 		LOG4CPLUS_INFO(logger, "Parsing prctl file"+ s->getString("prctl")); | 
		
	
		
			
				|  |  |  |  |  | 		storm::parser::PrctlFileParser fileParser; | 
		
	
		
			
				|  |  |  |  |  | 		std::list<storm::property::prctl::AbstractPrctlFormula<double>*> formulaList = fileParser.parseFormulas(s->getString("prctl")); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		storm::modelchecker::AbstractModelChecker<double>* mc = createPrctlModelChecker(*mdp); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	electedFormula = new storm::property::prctl::Ap<double>("elected"); |  |  |  | 
		
	
		
			
				|  |  | 	reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(electedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, false); |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		checkPrctlFormulasAgainstModel(formulaList, *mc); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		delete mc; | 
		
	
		
			
				|  |  |  |  |  | 	} | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	delete mc; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 	if(s->isSet("csl")) { | 
		
	
		
			
				|  |  |  |  |  | 		LOG4CPLUS_ERROR(logger, "CSL properties cannot be checked on MDPs."); | 
		
	
		
			
				|  |  |  |  |  | 	} | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | void testCheckingConsensus(storm::models::Mdp<double>& mdp) { |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Eventually<double>* eventuallyFormula = new storm::property::prctl::Eventually<double>(finishedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ProbabilisticNoBoundOperator<double>* probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	storm::modelchecker::GmmxxMdpPrctlModelChecker<double>* mc = new storm::modelchecker::GmmxxMdpPrctlModelChecker<double>(mdp); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* allCoinsEqual0Formula = new storm::property::prctl::Ap<double>("all_coins_equal_0"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::And<double>* conjunctionFormula = new storm::property::prctl::And<double>(finishedFormula, allCoinsEqual0Formula); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(conjunctionFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* allCoinsEqual1Formula = new storm::property::prctl::Ap<double>("all_coins_equal_1"); |  |  |  | 
		
	
		
			
				|  |  | 	conjunctionFormula = new storm::property::prctl::And<double>(finishedFormula, allCoinsEqual1Formula); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(conjunctionFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Ap<double>* agree = new storm::property::prctl::Ap<double>("agree"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::Not<double>* notAgree = new storm::property::prctl::Not<double>(agree); |  |  |  | 
		
	
		
			
				|  |  | 	conjunctionFormula = new storm::property::prctl::And<double>(finishedFormula, notAgree); |  |  |  | 
		
	
		
			
				|  |  | 	eventuallyFormula = new storm::property::prctl::Eventually<double>(conjunctionFormula); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(eventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::BoundedEventually<double>* boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(finishedFormula, 50); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	boundedEventuallyFormula = new storm::property::prctl::BoundedEventually<double>(finishedFormula, 50); |  |  |  | 
		
	
		
			
				|  |  | 	probFormula = new storm::property::prctl::ProbabilisticNoBoundOperator<double>(boundedEventuallyFormula, false); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*probFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete probFormula; |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::ReachabilityReward<double>* reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(finishedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	storm::property::prctl::RewardNoBoundOperator<double>* rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, true); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | /*!
 | 
		
	
		
			
				|  |  |  |  |  |  * Check method for DTMCs | 
		
	
		
			
				|  |  |  |  |  |  * @param dtmc Reference to the DTMC to check | 
		
	
		
			
				|  |  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  |  | void checkDtmc(std::shared_ptr<storm::models::Dtmc<double>> dtmc) { | 
		
	
		
			
				|  |  |  |  |  | 	dtmc->printModelInformationToStream(std::cout); | 
		
	
		
			
				|  |  |  |  |  | 	storm::settings::Settings* s = storm::settings::instance(); | 
		
	
		
			
				|  |  |  |  |  | 	if (s->isSet("prctl")) { | 
		
	
		
			
				|  |  |  |  |  | 		LOG4CPLUS_INFO(logger, "Parsing prctl file"+ s->getString("prctl")); | 
		
	
		
			
				|  |  |  |  |  | 		storm::parser::PrctlFileParser fileParser; | 
		
	
		
			
				|  |  |  |  |  | 		std::list<storm::property::prctl::AbstractPrctlFormula<double>*> formulaList = fileParser.parseFormulas(s->getString("prctl")); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	finishedFormula = new storm::property::prctl::Ap<double>("finished"); |  |  |  | 
		
	
		
			
				|  |  | 	reachabilityRewardFormula = new storm::property::prctl::ReachabilityReward<double>(finishedFormula); |  |  |  | 
		
	
		
			
				|  |  | 	rewardFormula = new storm::property::prctl::RewardNoBoundOperator<double>(reachabilityRewardFormula, false); |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		storm::modelchecker::AbstractModelChecker<double>* mc = createPrctlModelChecker(*dtmc); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	mc->check(*rewardFormula); |  |  |  | 
		
	
		
			
				|  |  | 	delete rewardFormula; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		checkPrctlFormulasAgainstModel(formulaList, *mc); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	delete mc; |  |  |  | 
		
	
		
			
				|  |  | } |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		delete mc; | 
		
	
		
			
				|  |  |  |  |  | 	} | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | /*!
 |  |  |  | 
		
	
		
			
				|  |  |  * Simple testing procedure. |  |  |  | 
		
	
		
			
				|  |  |  */ |  |  |  | 
		
	
		
			
				|  |  | void testChecking() { |  |  |  | 
		
	
		
			
				|  |  | 	storm::settings::Settings* s = storm::settings::instance(); |  |  |  | 
		
	
		
			
				|  |  | 	storm::parser::AutoParser<double> parser(s->getString("trafile"), s->getString("labfile"), s->getString("staterew"), s->getString("transrew")); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 	if (parser.getType() == storm::models::DTMC) { |  |  |  | 
		
	
		
			
				|  |  | 		std::shared_ptr<storm::models::Dtmc<double>> dtmc = parser.getModel<storm::models::Dtmc<double>>(); |  |  |  | 
		
	
		
			
				|  |  | 		dtmc->printModelInformationToStream(std::cout); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 		// testCheckingDie(*dtmc);
 |  |  |  | 
		
	
		
			
				|  |  | 		// testCheckingCrowds(*dtmc);
 |  |  |  | 
		
	
		
			
				|  |  | 		// testCheckingSynchronousLeader(*dtmc, 6);
 |  |  |  | 
		
	
		
			
				|  |  | 	} else if (parser.getType() == storm::models::MDP) { |  |  |  | 
		
	
		
			
				|  |  | 		std::shared_ptr<storm::models::Mdp<double>> mdp = parser.getModel<storm::models::Mdp<double>>(); |  |  |  | 
		
	
		
			
				|  |  | 		mdp->printModelInformationToStream(std::cout); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  |         // testCheckingDice(*mdp);
 |  |  |  | 
		
	
		
			
				|  |  | 		// testCheckingAsynchLeader(*mdp);
 |  |  |  | 
		
	
		
			
				|  |  | 		// testCheckingConsensus(*mdp);
 |  |  |  | 
		
	
		
			
				|  |  | 	} else { |  |  |  | 
		
	
		
			
				|  |  | 		std::cout << "Input is neither a DTMC nor an MDP." << std::endl; |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 	if(s->isSet("csl")) { | 
		
	
		
			
				|  |  |  |  |  | 		LOG4CPLUS_ERROR(logger, "CSL properties cannot be checked on DTMCs."); | 
		
	
		
			
				|  |  | 	} |  |  | 	} | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
	
		
			
				|  | @ -468,16 +244,46 @@ int main(const int argc, const char* argv[]) { | 
		
	
		
			
				|  |  | 	printHeader(argc, argv); |  |  | 	printHeader(argc, argv); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	initializeLogger(); |  |  | 	initializeLogger(); | 
		
	
		
			
				|  |  | 	if (!parseOptions(argc, argv)) { |  |  |  | 
		
	
		
			
				|  |  | 		return 0; |  |  |  | 
		
	
		
			
				|  |  | 	} |  |  |  | 
		
	
		
			
				|  |  | 	setUp(); |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | 	setUp(); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 	try { |  |  | 	try { | 
		
	
		
			
				|  |  | 		LOG4CPLUS_INFO(logger, "StoRM was invoked."); |  |  | 		LOG4CPLUS_INFO(logger, "StoRM was invoked."); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 		testChecking(); |  |  |  | 
		
	
		
			
				|  |  |  |  |  | 		// Parse options
 | 
		
	
		
			
				|  |  |  |  |  | 		if (!parseOptions(argc, argv)) { | 
		
	
		
			
				|  |  |  |  |  | 			// If false is returned, the program execution is stopped here
 | 
		
	
		
			
				|  |  |  |  |  | 			// E.g. if the user asked to see the help text
 | 
		
	
		
			
				|  |  |  |  |  | 			return 0; | 
		
	
		
			
				|  |  |  |  |  | 		} | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | 		// Now, the settings are receivd and the model is parsed.
 | 
		
	
		
			
				|  |  |  |  |  | 		storm::settings::Settings* s = storm::settings::instance(); | 
		
	
		
			
				|  |  |  |  |  | 		storm::parser::AutoParser<double> parser(s->getString("trafile"), s->getString("labfile"), s->getString("staterew"), s->getString("transrew")); | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | 		LOG4CPLUS_DEBUG(logger, s->getString("matrixlib")); | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  | 		// Depending on the model type, the respective model checking procedure is chosen.
 | 
		
	
		
			
				|  |  |  |  |  | 		switch (parser.getType()) { | 
		
	
		
			
				|  |  |  |  |  | 		case storm::models::DTMC: | 
		
	
		
			
				|  |  |  |  |  | 			LOG4CPLUS_INFO(logger, "Model was detected as DTMC"); | 
		
	
		
			
				|  |  |  |  |  | 			checkDtmc(parser.getModel<storm::models::Dtmc<double>>()); | 
		
	
		
			
				|  |  |  |  |  | 			break; | 
		
	
		
			
				|  |  |  |  |  | 		case storm::models::MDP: | 
		
	
		
			
				|  |  |  |  |  | 			LOG4CPLUS_INFO(logger, "Model was detected as MDP"); | 
		
	
		
			
				|  |  |  |  |  | 			checkMdp(parser.getModel<storm::models::Mdp<double>>()); | 
		
	
		
			
				|  |  |  |  |  | 			break; | 
		
	
		
			
				|  |  |  |  |  | 		case storm::models::CTMC: | 
		
	
		
			
				|  |  |  |  |  | 		case storm::models::CTMDP: | 
		
	
		
			
				|  |  |  |  |  | 			// Continuous time model checking is not implemented yet
 | 
		
	
		
			
				|  |  |  |  |  | 			LOG4CPLUS_ERROR(logger, "The model type you selected is not supported in this version of storm."); | 
		
	
		
			
				|  |  |  |  |  | 			break; | 
		
	
		
			
				|  |  |  |  |  | 		case storm::models::Unknown: | 
		
	
		
			
				|  |  |  |  |  | 		default: | 
		
	
		
			
				|  |  |  |  |  | 			LOG4CPLUS_ERROR(logger, "The model type could not be determined correctly."); | 
		
	
		
			
				|  |  |  |  |  | 			break; | 
		
	
		
			
				|  |  |  |  |  | 		} | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 		cleanUp(); |  |  | 		cleanUp(); | 
		
	
	
		
			
				|  | 
 |