4 changed files with 208 additions and 0 deletions
			
			
		- 
					1src/test/CMakeLists.txt
- 
					23src/test/storm-pomdp/CMakeLists.txt
- 
					175src/test/storm-pomdp/modelchecker/ApproximatePOMDPModelcheckerTest.cpp
- 
					9src/test/storm-pomdp/storm-test.cpp
| @ -1,3 +1,4 @@ | |||||
| add_subdirectory(storm) | add_subdirectory(storm) | ||||
| add_subdirectory(storm-pars) | add_subdirectory(storm-pars) | ||||
| add_subdirectory(storm-dft) | add_subdirectory(storm-dft) | ||||
|  | add_subdirectory(storm-pomdp) | ||||
| @ -0,0 +1,23 @@ | |||||
|  | # Base path for test files | ||||
|  | set(STORM_TESTS_BASE_PATH "${PROJECT_SOURCE_DIR}/src/test/storm-pomdp") | ||||
|  | 
 | ||||
|  | # Test Sources | ||||
|  | file(GLOB_RECURSE ALL_FILES ${STORM_TESTS_BASE_PATH}/*.h ${STORM_TESTS_BASE_PATH}/*.cpp) | ||||
|  | 
 | ||||
|  | register_source_groups_from_filestructure("${ALL_FILES}" test) | ||||
|  | 
 | ||||
|  | # Note that the tests also need the source files, except for the main file | ||||
|  | include_directories(${GTEST_INCLUDE_DIR}) | ||||
|  | 
 | ||||
|  | foreach (testsuite modelchecker) | ||||
|  | 
 | ||||
|  | 	  file(GLOB_RECURSE TEST_${testsuite}_FILES ${STORM_TESTS_BASE_PATH}/${testsuite}/*.h ${STORM_TESTS_BASE_PATH}/${testsuite}/*.cpp) | ||||
|  |       add_executable (test-pomdp-${testsuite} ${TEST_${testsuite}_FILES} ${STORM_TESTS_BASE_PATH}/storm-test.cpp) | ||||
|  | 	  target_link_libraries(test-pomdp-${testsuite} storm-pomdp storm-parsers) | ||||
|  | 	  target_link_libraries(test-pomdp-${testsuite} ${STORM_TEST_LINK_LIBRARIES}) | ||||
|  | 
 | ||||
|  | 	  add_dependencies(test-pomdp-${testsuite} test-resources) | ||||
|  | 	  add_test(NAME run-test-pomdp-${testsuite} COMMAND $<TARGET_FILE:test-pomdp-${testsuite}>) | ||||
|  |       add_dependencies(tests test-pomdp-${testsuite}) | ||||
|  | 	 | ||||
|  | endforeach () | ||||
| @ -0,0 +1,175 @@ | |||||
|  | #include "test/storm_gtest.h"
 | ||||
|  | #include "storm-config.h"
 | ||||
|  | 
 | ||||
|  | #include "storm-pomdp/modelchecker/ApproximatePOMDPModelchecker.h"
 | ||||
|  | #include "storm/api/storm.h"
 | ||||
|  | #include "storm-parsers/api/storm-parsers.h"
 | ||||
|  | 
 | ||||
|  | #include "storm/environment/solver/MinMaxSolverEnvironment.h"
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | namespace { | ||||
|  |     enum class PreprocessingType { None }; | ||||
|  |     class CoarseDoubleVIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef double ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration); | ||||
|  |             env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) {}  // TODO
 | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; | ||||
|  |     }; | ||||
|  |      | ||||
|  |     class DefaultDoubleVIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef double ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration); | ||||
|  |             env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>&) { /* intentionally left empty */ } | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; | ||||
|  |     }; | ||||
|  |      | ||||
|  |     class PreprocessedDefaultDoubleVIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef double ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration); | ||||
|  |             env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) { /* intentionally left empty */ } | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; // TODO
 | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     class FineDoubleVIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef double ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration); | ||||
|  |             env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) {}  // TODO
 | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; | ||||
|  |     }; | ||||
|  | 
 | ||||
|  |     class RefineDoubleVIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef double ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::ValueIteration); | ||||
|  |             env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) {}  // TODO
 | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; | ||||
|  |     }; | ||||
|  |      | ||||
|  |     class DefaultDoubleOVIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef double ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::SoundValueIteration); | ||||
|  |             env.solver().minMax().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-6)); | ||||
|  |             env.solver().setForceSoundness(true); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) { /* intentionally left empty */ } | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; | ||||
|  |     }; | ||||
|  |      | ||||
|  |     class DefaultRationalPIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef storm::RationalNumber ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration); | ||||
|  |             env.solver().setForceExact(true); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) { /* intentionally left empty */ } | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; | ||||
|  |     }; | ||||
|  |      | ||||
|  |     class PreprocessedDefaultRationalPIEnvironment { | ||||
|  |     public: | ||||
|  |         typedef storm::RationalNumber ValueType; | ||||
|  |         static storm::Environment createEnvironment() { | ||||
|  |             storm::Environment env; | ||||
|  |             env.solver().minMax().setMethod(storm::solver::MinMaxMethod::PolicyIteration); | ||||
|  |             env.solver().setForceExact(true); | ||||
|  |             return env; | ||||
|  |         } | ||||
|  |         static void adaptOptions(storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType>& options) { /* intentionally left empty */ } | ||||
|  |         static PreprocessingType const preprocessingType = PreprocessingType::None; // TODO
 | ||||
|  |     }; | ||||
|  |      | ||||
|  |     template<typename TestType> | ||||
|  |     class BeliefExplorationTest : public ::testing::Test { | ||||
|  |     public: | ||||
|  |         typedef typename TestType::ValueType ValueType; | ||||
|  |         BeliefExplorationTest() : _environment(TestType::createEnvironment()) {} | ||||
|  |         storm::Environment const& env() const { return _environment; } | ||||
|  |         storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType> options() const { | ||||
|  |             storm::pomdp::modelchecker::ApproximatePOMDPModelCheckerOptions<ValueType> opt(true, true); // Always compute both bounds (lower and upper)
 | ||||
|  |             TestType::adaptOptions(opt); | ||||
|  |             return opt; | ||||
|  |         } | ||||
|  |         void preprocess(std::shared_ptr<storm::models::sparse::Pomdp<ValueType>>& model, std::shared_ptr<const storm::logic::Formula>& formula) { | ||||
|  |             switch(TestType::preprocessingType) { | ||||
|  |                 case PreprocessingType::None: | ||||
|  |                     // nothing to do
 | ||||
|  |                     break; | ||||
|  |                 default: | ||||
|  |                     FAIL() << "Unhandled preprocessing type."; | ||||
|  |             } | ||||
|  |         } | ||||
|  |     private: | ||||
|  |         storm::Environment _environment; | ||||
|  |     }; | ||||
|  |    | ||||
|  |     typedef ::testing::Types< | ||||
|  |             CoarseDoubleVIEnvironment, | ||||
|  |             DefaultDoubleVIEnvironment, | ||||
|  |             PreprocessedDefaultDoubleVIEnvironment, | ||||
|  |             FineDoubleVIEnvironment, | ||||
|  |             RefineDoubleVIEnvironment, | ||||
|  |             DefaultDoubleOVIEnvironment, | ||||
|  |             DefaultRationalPIEnvironment, | ||||
|  |             PreprocessedDefaultRationalPIEnvironment | ||||
|  |     > TestingTypes; | ||||
|  |      | ||||
|  |     TYPED_TEST_SUITE(BeliefExplorationTest, TestingTypes,); | ||||
|  |      | ||||
|  |     TYPED_TEST(BeliefExplorationTest, simple) { | ||||
|  |         typedef typename TestFixture::ValueType ValueType; | ||||
|  | 
 | ||||
|  |         std::string programFile = STORM_TEST_RESOURCES_DIR "/pomdp/simple.prism"; | ||||
|  |         std::string formulaAsString = "P=? [F \"goal\" ]"; | ||||
|  |         std::string constantsAsString = ""; //e.g. pL=0.9,TOACK=0.5
 | ||||
|  |      | ||||
|  |         // Program and formula
 | ||||
|  |         storm::prism::Program program = storm::api::parseProgram(programFile); | ||||
|  |         program = storm::utility::prism::preprocess(program, constantsAsString); | ||||
|  |         std::shared_ptr<const storm::logic::Formula> formula = storm::api::parsePropertiesForPrismProgram(formulaAsString, program).front().getRawFormula(); | ||||
|  |         std::shared_ptr<storm::models::sparse::Pomdp<ValueType>> model = storm::api::buildSparseModel<ValueType>(program, {formula})->template as<storm::models::sparse::Pomdp<ValueType>>(); | ||||
|  |         this->preprocess(model, formula); | ||||
|  |          | ||||
|  |         // Invoke model checking
 | ||||
|  |         storm::pomdp::modelchecker::ApproximatePOMDPModelchecker<storm::models::sparse::Pomdp<ValueType>> checker(*model, this->options()); | ||||
|  |         auto result = checker.check(*formula); | ||||
|  |         std::cout << "[" << result.lowerBound << "," << result.upperBound << std::endl; | ||||
|  |          | ||||
|  |     } | ||||
|  | } | ||||
| @ -0,0 +1,9 @@ | |||||
|  | #include "test/storm_gtest.h"
 | ||||
|  | #include "storm/settings/SettingsManager.h"
 | ||||
|  | 
 | ||||
|  | int main(int argc, char **argv) { | ||||
|  |   storm::settings::initializeAll("Storm-pomdp (Functional) Testing Suite", "test-pomdp"); | ||||
|  |   storm::test::initialize(); | ||||
|  |   ::testing::InitGoogleTest(&argc, argv); | ||||
|  |   return RUN_ALL_TESTS(); | ||||
|  | } | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue