Tim Quatmann
5 years ago
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-pars) |
|||
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