|
|
@ -3,6 +3,7 @@ |
|
|
|
#include "storm-config.h"
|
|
|
|
|
|
|
|
#include "storm/api/builder.h"
|
|
|
|
#include "storm-conv/api/storm-conv.h"
|
|
|
|
#include "storm-parsers/api/model_descriptions.h"
|
|
|
|
#include "storm/api/properties.h"
|
|
|
|
#include "storm-parsers/api/properties.h"
|
|
|
@ -30,10 +31,46 @@ |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
enum class DtmcEngine {PrismSparse, JaniSparse, JitSparse, Hybrid, PrismDd, JaniDd}; |
|
|
|
|
|
|
|
class SparseGmmxxGmresIluEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
|
static storm::Environment createEnvironment() { |
|
|
|
storm::Environment env; |
|
|
|
env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Gmmxx); |
|
|
|
env.solver().gmmxx().setMethod(storm::solver::GmmxxLinearEquationSolverMethod::Gmres); |
|
|
|
env.solver().gmmxx().setPreconditioner(storm::solver::GmmxxLinearEquationSolverPreconditioner::Ilu); |
|
|
|
env.solver().gmmxx().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8)); |
|
|
|
return env; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class JaniSparseGmmxxGmresIluEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const DtmcEngine engine = DtmcEngine::JaniSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
|
static storm::Environment createEnvironment() { |
|
|
|
storm::Environment env; |
|
|
|
env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Gmmxx); |
|
|
|
env.solver().gmmxx().setMethod(storm::solver::GmmxxLinearEquationSolverMethod::Gmres); |
|
|
|
env.solver().gmmxx().setPreconditioner(storm::solver::GmmxxLinearEquationSolverPreconditioner::Ilu); |
|
|
|
env.solver().gmmxx().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8)); |
|
|
|
return env; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class JitSparseGmmxxGmresIluEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const DtmcEngine engine = DtmcEngine::JitSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -50,7 +87,7 @@ namespace { |
|
|
|
class SparseGmmxxGmresDiagEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -67,7 +104,7 @@ namespace { |
|
|
|
class SparseGmmxxBicgstabIluEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -84,7 +121,7 @@ namespace { |
|
|
|
class SparseEigenDGmresEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -101,7 +138,7 @@ namespace { |
|
|
|
class SparseEigenDoubleLUEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -116,7 +153,7 @@ namespace { |
|
|
|
class SparseEigenRationalLUEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = true; |
|
|
|
typedef storm::RationalNumber ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -131,7 +168,7 @@ namespace { |
|
|
|
class SparseRationalEliminationEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = true; |
|
|
|
typedef storm::RationalNumber ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -145,7 +182,7 @@ namespace { |
|
|
|
class SparseNativeJacobiEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -161,7 +198,7 @@ namespace { |
|
|
|
class SparseNativeWalkerChaeEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -178,7 +215,7 @@ namespace { |
|
|
|
class SparseNativeSorEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -194,7 +231,7 @@ namespace { |
|
|
|
class SparseNativePowerEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -210,7 +247,7 @@ namespace { |
|
|
|
class SparseNativeSoundValueIterationEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -227,7 +264,7 @@ namespace { |
|
|
|
class SparseNativeIntervalIterationEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -245,7 +282,7 @@ namespace { |
|
|
|
class SparseNativeRationalSearchEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = true; |
|
|
|
typedef storm::RationalNumber ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -260,7 +297,7 @@ namespace { |
|
|
|
class SparseTopologicalEigenLUEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; // unused for sparse models
|
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Sparse; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismSparse; |
|
|
|
static const bool isExact = true; |
|
|
|
typedef storm::RationalNumber ValueType; |
|
|
|
typedef storm::models::sparse::Dtmc<ValueType> ModelType; |
|
|
@ -276,7 +313,7 @@ namespace { |
|
|
|
class HybridSylvanGmmxxGmresEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Hybrid; |
|
|
|
static const DtmcEngine engine = DtmcEngine::Hybrid; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -292,7 +329,7 @@ namespace { |
|
|
|
class HybridCuddNativeJacobiEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::CUDD; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Hybrid; |
|
|
|
static const DtmcEngine engine = DtmcEngine::Hybrid; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -308,7 +345,7 @@ namespace { |
|
|
|
class HybridCuddNativeSoundValueIterationEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::CUDD; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Hybrid; |
|
|
|
static const DtmcEngine engine = DtmcEngine::Hybrid; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -325,7 +362,7 @@ namespace { |
|
|
|
class HybridSylvanNativeRationalSearchEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Hybrid; |
|
|
|
static const DtmcEngine engine = DtmcEngine::Hybrid; |
|
|
|
static const bool isExact = true; |
|
|
|
typedef storm::RationalNumber ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -340,7 +377,23 @@ namespace { |
|
|
|
class DdSylvanNativePowerEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Dd; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismDd; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
|
static storm::Environment createEnvironment() { |
|
|
|
storm::Environment env; |
|
|
|
env.solver().setLinearEquationSolverType(storm::solver::EquationSolverType::Native); |
|
|
|
env.solver().native().setMethod(storm::solver::NativeLinearEquationSolverMethod::Power); |
|
|
|
env.solver().native().setPrecision(storm::utility::convertNumber<storm::RationalNumber>(1e-8)); |
|
|
|
return env; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class JaniDdSylvanNativePowerEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; |
|
|
|
static const DtmcEngine engine = DtmcEngine::JaniDd; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -356,7 +409,7 @@ namespace { |
|
|
|
class DdCuddNativeJacobiEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::CUDD; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Dd; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismDd; |
|
|
|
static const bool isExact = false; |
|
|
|
typedef double ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -372,7 +425,7 @@ namespace { |
|
|
|
class DdSylvanRationalSearchEnvironment { |
|
|
|
public: |
|
|
|
static const storm::dd::DdType ddType = storm::dd::DdType::Sylvan; |
|
|
|
static const storm::settings::modules::CoreSettings::Engine engine = storm::settings::modules::CoreSettings::Engine::Dd; |
|
|
|
static const DtmcEngine engine = DtmcEngine::PrismDd; |
|
|
|
static const bool isExact = true; |
|
|
|
typedef storm::RationalNumber ValueType; |
|
|
|
typedef storm::models::symbolic::Dtmc<ddType, ValueType> ModelType; |
|
|
@ -404,8 +457,18 @@ namespace { |
|
|
|
std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result; |
|
|
|
storm::prism::Program program = storm::api::parseProgram(pathToPrismFile); |
|
|
|
program = storm::utility::prism::preprocess(program, constantDefinitionString); |
|
|
|
result.second = storm::api::extractFormulasFromProperties(storm::api::parsePropertiesForPrismProgram(formulasAsString, program)); |
|
|
|
result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<MT>(); |
|
|
|
if (TestType::engine == DtmcEngine::PrismSparse) { |
|
|
|
result.second = storm::api::extractFormulasFromProperties(storm::api::parsePropertiesForPrismProgram(formulasAsString, program)); |
|
|
|
result.first = storm::api::buildSparseModel<ValueType>(program, result.second)->template as<MT>(); |
|
|
|
} else if (TestType::engine == DtmcEngine::JaniSparse || TestType::engine == DtmcEngine::JitSparse) { |
|
|
|
storm::converter::PrismToJaniConverterOptions options; |
|
|
|
options.allVariablesGlobal = true; |
|
|
|
options.janiOptions.standardCompliant = true; |
|
|
|
options.janiOptions.exportFlattened = true; |
|
|
|
auto janiData = storm::api::convertPrismToJani(program, storm::api::parsePropertiesForPrismProgram(formulasAsString, program)); |
|
|
|
result.second = storm::api::extractFormulasFromProperties(janiData.second); |
|
|
|
result.first = storm::api::buildSparseModel<ValueType>(janiData.first, result.second, TestType::engine == DtmcEngine::JitSparse)->template as<MT>(); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
@ -415,8 +478,18 @@ namespace { |
|
|
|
std::pair<std::shared_ptr<MT>, std::vector<std::shared_ptr<storm::logic::Formula const>>> result; |
|
|
|
storm::prism::Program program = storm::api::parseProgram(pathToPrismFile); |
|
|
|
program = storm::utility::prism::preprocess(program, constantDefinitionString); |
|
|
|
result.second = storm::api::extractFormulasFromProperties(storm::api::parsePropertiesForPrismProgram(formulasAsString, program)); |
|
|
|
result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(program, result.second)->template as<MT>(); |
|
|
|
if (TestType::engine == DtmcEngine::Hybrid || TestType::engine == DtmcEngine::PrismDd) { |
|
|
|
result.second = storm::api::extractFormulasFromProperties(storm::api::parsePropertiesForPrismProgram(formulasAsString, program)); |
|
|
|
result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(program, result.second)->template as<MT>(); |
|
|
|
} else if (TestType::engine == DtmcEngine::JaniDd) { |
|
|
|
storm::converter::PrismToJaniConverterOptions options; |
|
|
|
options.allVariablesGlobal = true; |
|
|
|
options.janiOptions.standardCompliant = true; |
|
|
|
options.janiOptions.exportFlattened = true; |
|
|
|
auto janiData = storm::api::convertPrismToJani(program, storm::api::parsePropertiesForPrismProgram(formulasAsString, program)); |
|
|
|
result.second = storm::api::extractFormulasFromProperties(janiData.second); |
|
|
|
result.first = storm::api::buildSymbolicModel<TestType::ddType, ValueType>(janiData.first, result.second)->template as<MT>(); |
|
|
|
} |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
@ -431,7 +504,7 @@ namespace { |
|
|
|
template <typename MT = typename TestType::ModelType> |
|
|
|
typename std::enable_if<std::is_same<MT, SparseModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type |
|
|
|
createModelChecker(std::shared_ptr<MT> const& model) const { |
|
|
|
if (TestType::engine == storm::settings::modules::CoreSettings::Engine::Sparse) { |
|
|
|
if (TestType::engine == DtmcEngine::PrismSparse || TestType::engine == DtmcEngine::JaniSparse || TestType::engine == DtmcEngine::JitSparse) { |
|
|
|
return std::make_shared<storm::modelchecker::SparseDtmcPrctlModelChecker<SparseModelType>>(*model); |
|
|
|
} |
|
|
|
} |
|
|
@ -439,9 +512,9 @@ namespace { |
|
|
|
template <typename MT = typename TestType::ModelType> |
|
|
|
typename std::enable_if<std::is_same<MT, SymbolicModelType>::value, std::shared_ptr<storm::modelchecker::AbstractModelChecker<MT>>>::type |
|
|
|
createModelChecker(std::shared_ptr<MT> const& model) const { |
|
|
|
if (TestType::engine == storm::settings::modules::CoreSettings::Engine::Hybrid) { |
|
|
|
if (TestType::engine == DtmcEngine::Hybrid) { |
|
|
|
return std::make_shared<storm::modelchecker::HybridDtmcPrctlModelChecker<SymbolicModelType>>(*model); |
|
|
|
} else if (TestType::engine == storm::settings::modules::CoreSettings::Engine::Dd) { |
|
|
|
} else if (TestType::engine == DtmcEngine::PrismDd || TestType::engine == DtmcEngine::JaniDd) { |
|
|
|
return std::make_shared<storm::modelchecker::SymbolicDtmcPrctlModelChecker<SymbolicModelType>>(*model); |
|
|
|
} |
|
|
|
} |
|
|
@ -472,6 +545,8 @@ namespace { |
|
|
|
|
|
|
|
typedef ::testing::Types< |
|
|
|
SparseGmmxxGmresIluEnvironment, |
|
|
|
JaniSparseGmmxxGmresIluEnvironment, |
|
|
|
JitSparseGmmxxGmresIluEnvironment, |
|
|
|
SparseGmmxxGmresDiagEnvironment, |
|
|
|
SparseGmmxxBicgstabIluEnvironment, |
|
|
|
SparseEigenDGmresEnvironment, |
|
|
@ -491,6 +566,7 @@ namespace { |
|
|
|
HybridCuddNativeSoundValueIterationEnvironment, |
|
|
|
HybridSylvanNativeRationalSearchEnvironment, |
|
|
|
DdSylvanNativePowerEnvironment, |
|
|
|
JaniDdSylvanNativePowerEnvironment, |
|
|
|
DdCuddNativeJacobiEnvironment, |
|
|
|
DdSylvanRationalSearchEnvironment |
|
|
|
> TestingTypes; |
|
|
|