15 changed files with 231 additions and 68 deletions
			
			
		- 
					2src/counterexamples/MILPMinimalLabelSetGenerator.h
- 
					2src/counterexamples/PathBasedSubsystemGenerator.h
- 
					2src/formula/actions/FormulaAction.h
- 
					6src/formula/actions/RangeAction.h
- 
					4src/formula/actions/SortAction.h
- 
					4src/formula/prctl/Next.h
- 
					28src/formula/prctl/PrctlFilter.h
- 
					30src/formula/prctl/ProbabilisticBoundOperator.h
- 
					30src/formula/prctl/RewardBoundOperator.h
- 
					4src/modelchecker/prctl/AbstractModelChecker.h
- 
					4src/modelchecker/prctl/SparseMdpPrctlModelChecker.h
- 
					27src/parser/PrctlParser.cpp
- 
					0test/functional/modelchecker/ActionTest.cpp
- 
					83test/functional/modelchecker/FilterTest.cpp
- 
					73test/functional/parser/PrctlParserTest.cpp
| @ -0,0 +1,83 @@ | |||
| /*
 | |||
|  * FilterTest.cpp | |||
|  * | |||
|  *  Created on: Aug 6, 2014 | |||
|  *      Author: Manuel Sascha Weiand | |||
|  */ | |||
| 
 | |||
| #include "gtest/gtest.h"
 | |||
| #include "storm-config.h"
 | |||
| #include "src/models/Dtmc.h"
 | |||
| #include "src/parser/DeterministicModelParser.h"
 | |||
| #include "src/modelchecker/prctl/SparseDtmcPrctlModelChecker.h"
 | |||
| #include "src/solver/GmmxxLinearEquationSolver.h"
 | |||
| #include "src/formula/prctl/PrctlFilter.h"
 | |||
| #include "src/formula/csl/CslFilter.h"
 | |||
| #include "src/formula/ltl/LtlFilter.h"
 | |||
| #include "src/parser/PrctlParser.h"
 | |||
| 
 | |||
| #include <regex>
 | |||
| 
 | |||
| typedef typename storm::property::prctl::PrctlFilter<double>::Result Result; | |||
| 
 | |||
| TEST(PrctlFilterTest, generalFunctionality) { | |||
| 	// Test filter queries of increasing complexity.
 | |||
| 
 | |||
| 	// Setup model and modelchecker.
 | |||
| 	storm::models::Dtmc<double> model = storm::parser::DeterministicModelParser::parseDtmc(STORM_CPP_TESTS_BASE_PATH "/functional/parser/tra_files/dtmc_actionTest.tra", STORM_CPP_TESTS_BASE_PATH "/functional/parser/lab_files/dtmc_actionTest.lab"); | |||
| 	storm::modelchecker::prctl::SparseDtmcPrctlModelChecker<double> mc(model, new storm::solver::GmmxxLinearEquationSolver<double>()); | |||
| 
 | |||
| 	// Find the best valued state to finally reach a 'b' state.
 | |||
| 	std::string input = "filter[sort(value, descending); range(0,0)](F b)"; | |||
| 	std::shared_ptr<storm::property::prctl::PrctlFilter<double>> formula(nullptr); | |||
| 	ASSERT_NO_THROW( | |||
| 				formula = storm::parser::PrctlParser::parsePrctlFormula(input) | |||
| 	); | |||
| 
 | |||
| 	// Here we test if the check method gives the correct result.
 | |||
| 	// To capture the output, redirect cout and test the written buffer content.
 | |||
| 	std::stringstream buffer; | |||
| 	std::streambuf *sbuf = std::cout.rdbuf(); | |||
| 	std::cout.rdbuf(buffer.rdbuf()); | |||
| 
 | |||
| 	formula->check(mc); | |||
| 
 | |||
| 	std::string output = buffer.str(); | |||
| 	ASSERT_NE(std::string::npos, output.find("\t6: 1")); | |||
| 
 | |||
| 	// Reset cout to the original buffer.
 | |||
| 	std::cout.rdbuf(sbuf); | |||
| 
 | |||
| 	// The remaining queries use evaluate directly as its easier to work with in a test environment.
 | |||
| 	// Get the probability to reach a b state for all states but those that cannot reach a 'b' state or are 'b' states themselves.
 | |||
| 	// Sorted by value; highest first.
 | |||
| 	input = "filter[formula(P<=0(F b) | b); invert; sort(value, desc)](F b)"; | |||
| 	ASSERT_NO_THROW( | |||
| 				formula = storm::parser::PrctlParser::parsePrctlFormula(input) | |||
| 	); | |||
| 
 | |||
| 	Result result = formula->evaluate(mc); | |||
| 
 | |||
| 	// Test the selection.
 | |||
| 	ASSERT_EQ(5, result.selection.getNumberOfSetBits()); | |||
| 	ASSERT_TRUE(result.selection[0]); | |||
| 	ASSERT_TRUE(result.selection[1]); | |||
| 	ASSERT_TRUE(result.selection[2]); | |||
| 	ASSERT_TRUE(result.selection[3]); | |||
| 	ASSERT_TRUE(result.selection[4]); | |||
| 	ASSERT_FALSE(result.selection[5]); | |||
| 	ASSERT_FALSE(result.selection[6]); | |||
| 	ASSERT_FALSE(result.selection[7]); | |||
| 
 | |||
| 	// Test the sorting.
 | |||
| 	ASSERT_EQ(3, result.stateMap[0]); | |||
| 	ASSERT_EQ(4, result.stateMap[1]); | |||
| 	ASSERT_EQ(1, result.stateMap[2]); | |||
| 	ASSERT_EQ(0, result.stateMap[3]); | |||
| 	ASSERT_EQ(2, result.stateMap[4]); | |||
| 	ASSERT_EQ(5, result.stateMap[5]); | |||
| 	ASSERT_EQ(6, result.stateMap[6]); | |||
| 	ASSERT_EQ(7, result.stateMap[7]); | |||
| } | |||
| 
 | |||
| 
 | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue