1#include "storm-config.h"
10struct DftAnalysisConfig {
16class NoOptimizationsConfig {
20 static DftAnalysisConfig createConfig() {
21 return DftAnalysisConfig{
false,
false,
false};
25class DontCareOnlyConfig {
29 static DftAnalysisConfig createConfig() {
30 return DftAnalysisConfig{
false,
false,
true};
34class ModularisationOnlyConfig {
38 static DftAnalysisConfig createConfig() {
39 return DftAnalysisConfig{
false,
true,
false};
43class SymmetryReductionOnlyConfig {
47 static DftAnalysisConfig createConfig() {
48 return DftAnalysisConfig{
true,
false,
false};
52class ModularisationConfig {
56 static DftAnalysisConfig createConfig() {
57 return DftAnalysisConfig{
false,
true,
true};
61class SymmetryReductionConfig {
65 static DftAnalysisConfig createConfig() {
66 return DftAnalysisConfig{
true,
false,
true};
70class AllOptimizationsConfig {
74 static DftAnalysisConfig createConfig() {
75 return DftAnalysisConfig{
true,
true,
true};
80template<
typename TestType>
81class DftModelCheckerTest :
public ::testing::Test {
83 typedef typename TestType::ValueType
ValueType;
85 DftModelCheckerTest() : config(TestType::createConfig()) {}
87 DftAnalysisConfig
const& getConfig()
const {
91 double analyze(std::string
const& file, std::string
const& property) {
93 std::shared_ptr<storm::dft::storage::DFT<double>> dft =
94 storm::dft::api::prepareForMarkovAnalysis<double>(*(storm::dft::api::loadDFTGalileoFile<double>(file)));
101 std::vector<std::string> relevantNames;
103 relevantNames.push_back(
"all");
109 storm::dft::api::analyzeDFT<double>(*dft, properties, config.useSR, config.useMod, relevantEvents,
false);
110 return boost::get<double>(results[0]);
113 double analyzeMTTF(std::string
const& file) {
114 std::string
property =
"Tmin=? [F \"failed\"]";
115 return analyze(file, property);
118 double analyzeReliability(std::string
const& file,
double bound) {
119 std::string
property =
"Pmin=? [F<=" + std::to_string(bound) +
" \"failed\"]";
120 return analyze(file, property);
123 double analyzeReachability(std::string
const& file) {
124 std::string
property =
"Pmin=? [F \"failed\"]";
125 return analyze(file, property);
132 double precisionReliability() {
137 DftAnalysisConfig config;
140typedef ::testing::Types<NoOptimizationsConfig, DontCareOnlyConfig, ModularisationOnlyConfig, SymmetryReductionOnlyConfig, ModularisationConfig,
141 SymmetryReductionConfig, AllOptimizationsConfig>
147 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/and.dft");
148 EXPECT_NEAR(result, 3, this->precision());
152 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/or.dft");
153 EXPECT_NEAR(result, 1, this->precision());
157 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting.dft");
158 EXPECT_NEAR(result, 5 / 3.0, this->precision());
159 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting2.dft");
160 EXPECT_NEAR(result, 10 / 17.0, this->precision());
161 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting3.dft");
162 EXPECT_NEAR(result, 2685 / 1547.0, this->precision());
163 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting4.dft");
164 EXPECT_NEAR(result, 5 / 6.0, this->precision());
168 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pand.dft");
169 EXPECT_EQ(result, storm::utility::infinity<double>());
173 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/por.dft");
174 EXPECT_EQ(result, storm::utility::infinity<double>());
178 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep2.dft");
179 EXPECT_NEAR(result, 2, this->precision());
180 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep3.dft");
181 EXPECT_NEAR(result, 5 / 2.0, this->precision());
183 if (this->getConfig().useMod) {
184 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep.dft"), storm::exceptions::NotSupportedException);
185 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep4.dft"), storm::exceptions::NotSupportedException);
186 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep5.dft"), storm::exceptions::NotSupportedException);
188 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep.dft");
189 EXPECT_NEAR(result, 2 / 3.0, this->precision());
190 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep4.dft");
191 EXPECT_NEAR(result, 1, this->precision());
192 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep5.dft");
193 EXPECT_NEAR(result, 3, this->precision());
198 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep.dft");
199 EXPECT_NEAR(result, 8 / 3.0, this->precision());
200 if (this->getConfig().useMod && !this->getConfig().useDC) {
201 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep2.dft"), storm::exceptions::NotSupportedException);
203 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep2.dft");
204 EXPECT_NEAR(result, 38 / 15.0, this->precision());
206 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep3.dft");
207 EXPECT_NEAR(result, 67 / 24.0, this->precision());
209 if (this->getConfig().useMod) {
210 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep4.dft"), storm::exceptions::NotSupportedException);
212 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep4.dft");
213 EXPECT_EQ(result, storm::utility::infinity<double>());
218 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare.dft");
219 EXPECT_NEAR(result, 46 / 13.0, this->precision());
220 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare2.dft");
221 EXPECT_NEAR(result, 43 / 23.0, this->precision());
222 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare3.dft");
223 EXPECT_NEAR(result, 14 / 11.0, this->precision());
224 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare4.dft");
225 EXPECT_NEAR(result, 18836 / 3887.0, this->precision());
226 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare5.dft");
227 EXPECT_NEAR(result, 8 / 3.0, this->precision());
228 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare6.dft");
229 EXPECT_NEAR(result, 7 / 5.0, this->precision());
230 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare7.dft");
231 EXPECT_NEAR(result, 551 / 150.0, this->precision());
232 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare8.dft");
233 EXPECT_NEAR(result, 249 / 52.0, this->precision());
234 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare_dc.dft");
235 EXPECT_NEAR(result, 78311 / 182700.0, this->precision());
236 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/modules3.dft");
237 EXPECT_NEAR(result, 7 / 6.0, this->precision());
241 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq.dft");
242 EXPECT_NEAR(result, 4, this->precision());
243 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq2.dft");
244 EXPECT_NEAR(result, 6, this->precision());
245 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq3.dft");
246 EXPECT_NEAR(result, 6, this->precision());
247 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq4.dft");
248 EXPECT_NEAR(result, 6, this->precision());
249 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq5.dft");
250 EXPECT_EQ(result, storm::utility::infinity<double>());
251 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq6.dft");
252 EXPECT_NEAR(result, 30000, this->precision());
254 if (this->getConfig().useMod) {
255 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft"), storm::exceptions::NotSupportedException);
257 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft");
258 EXPECT_EQ(result, storm::utility::infinity<double>());
260 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft", 1.0);
261 EXPECT_NEAR(result, 0.08, this->precision());
262 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft");
263 EXPECT_NEAR(result, 0.08, this->precision());
264 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq8.dft");
265 EXPECT_NEAR(result, 11 / 8.0, this->precision());
269 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex.dft");
270 EXPECT_NEAR(result, 1 / 2.0, this->precision());
271 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex.dft", 1.0);
272 EXPECT_NEAR(result, 0.8646647168, this->precisionReliability());
273 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex.dft");
274 EXPECT_NEAR(result, 1, this->precision());
276 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex2.dft");
277 EXPECT_EQ(result, storm::utility::infinity<double>());
278 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex2.dft", 1.0);
279 EXPECT_NEAR(result, 0, this->precision());
280 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex2.dft");
281 EXPECT_NEAR(result, 0, this->precision());
283 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex3.dft");
284 EXPECT_EQ(result, storm::utility::infinity<double>());
285 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex3.dft", 1.0);
286 EXPECT_NEAR(result, 0, this->precision());
287 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex3.dft");
288 EXPECT_NEAR(result, 0, this->precision());
290 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex4.dft");
291 EXPECT_EQ(result, storm::utility::infinity<double>());
292 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex4.dft", 1.0);
293 EXPECT_NEAR(result, 0.5842978146, this->precisionReliability());
294 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex4.dft");
295 EXPECT_NEAR(result, 5 / 8.0, this->precision());
299 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/symmetry6.dft");
300 EXPECT_NEAR(result, 2804183 / 2042040.0, this->precision());
301 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/symmetry6.dft", 1.0);
302 EXPECT_NEAR(result, 0.3421934224, this->precisionReliability());
304 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep_symmetry.dft");
305 EXPECT_NEAR(result, 6553 / 5376.0, this->precision());
306 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/pdep_symmetry.dft", 1.0);
307 EXPECT_NEAR(result, 0.4223514414, this->precisionReliability());
310TYPED_TEST(DftModelCheckerTest, HecsReliability) {
311 if (!this->getConfig().useDC) {
316 double result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/hecs_2_2.dft", 1.0);
317 EXPECT_NEAR(result, 0.00021997582, this->precisionReliability());
std::vector< boost::variant< ValueType, approximation_result > > dft_results
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
std::pair< bool, std::string > isWellFormed(storm::dft::storage::DFT< ValueType > const &dft, bool validForMarkovianAnalysis=true)
Check whether the DFT is well-formed.
storm::dft::utility::RelevantEvents computeRelevantEvents(std::vector< std::shared_ptr< storm::logic::Formula const > > const &properties, std::vector< std::string > const &additionalRelevantEventNames)
Get relevant event ids from given relevant event names and labels in properties.
SFTBDDChecker::ValueType ValueType
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)