1#include "storm-config.h"
17class NoOptimizationsConfig {
19 typedef double ValueType;
25 static storm::dft::DftEnvironment createEnvironment() {
26 storm::dft::DftEnvironment env;
34class DontCareOnlyConfig {
36 typedef double ValueType;
42 static storm::dft::DftEnvironment createEnvironment() {
43 storm::dft::DftEnvironment env;
51class ModularisationOnlyConfig {
53 typedef double ValueType;
59 static storm::dft::DftEnvironment createEnvironment() {
60 storm::dft::DftEnvironment env;
68class SymmetryReductionOnlyConfig {
70 typedef double ValueType;
76 static storm::dft::DftEnvironment createEnvironment() {
77 storm::dft::DftEnvironment env;
85class ModularisationConfig {
87 typedef double ValueType;
93 static storm::dft::DftEnvironment createEnvironment() {
94 storm::dft::DftEnvironment env;
102class SymmetryReductionConfig {
104 typedef double ValueType;
106 static bool useDC() {
110 static storm::dft::DftEnvironment createEnvironment() {
111 storm::dft::DftEnvironment env;
119class AllOptimizationsConfig {
121 typedef double ValueType;
123 static bool useDC() {
127 static storm::dft::DftEnvironment createEnvironment() {
128 storm::dft::DftEnvironment env;
137template<
typename TestType>
138class DftModelCheckerTest :
public ::testing::Test {
140 typedef typename TestType::ValueType ValueType;
142 DftModelCheckerTest() : _environment(TestType::createEnvironment()), _useDC(TestType::useDC()) {}
144 storm::dft::DftEnvironment
const& env()
const {
152 double analyze(std::string
const& file, std::string
const& property)
const {
154 std::shared_ptr<storm::dft::storage::DFT<double>> dft =
162 std::vector<std::string> relevantNames;
164 relevantNames.push_back(
"all");
171 return boost::get<typename storm::dft::modelchecker::DFTModelChecker<double>::ExtendedValueType>(results[0]);
174 double analyzeMTTF(std::string
const& file)
const {
175 std::string
property =
"Tmin=? [F \"failed\"]";
176 return analyze(file, property);
179 double analyzeReliability(std::string
const& file,
double bound)
const {
180 std::string
property =
"Pmin=? [F<=" + std::to_string(bound) +
" \"failed\"]";
181 return analyze(file, property);
184 double analyzeReachability(std::string
const& file)
const {
185 std::string
property =
"Pmin=? [F \"failed\"]";
186 return analyze(file, property);
189 double precision()
const {
193 double precisionReliability()
const {
198 storm::dft::DftEnvironment _environment;
202typedef ::testing::Types<NoOptimizationsConfig, DontCareOnlyConfig, ModularisationOnlyConfig, SymmetryReductionOnlyConfig, ModularisationConfig,
203 SymmetryReductionConfig, AllOptimizationsConfig>
209 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/and.dft");
210 EXPECT_NEAR(result, 3, this->precision());
214 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/or.dft");
215 EXPECT_NEAR(result, 1, this->precision());
219 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting.dft");
220 EXPECT_NEAR(result, 5 / 3.0, this->precision());
221 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting2.dft");
222 EXPECT_NEAR(result, 10 / 17.0, this->precision());
223 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting3.dft");
224 EXPECT_NEAR(result, 2685 / 1547.0, this->precision());
225 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/voting4.dft");
226 EXPECT_NEAR(result, 5 / 6.0, this->precision());
230 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pand.dft");
235 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/por.dft");
240 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep2.dft");
241 EXPECT_NEAR(result, 2, this->precision());
242 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep3.dft");
243 EXPECT_NEAR(result, 5 / 2.0, this->precision());
244 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep7.dft");
245 EXPECT_NEAR(result, 5 / 12.0, this->precision());
247 if (this->env().analysis().isUseModularisation()) {
248 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep.dft"), storm::exceptions::NotSupportedException);
249 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep4.dft"), storm::exceptions::NotSupportedException);
250 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep5.dft"), storm::exceptions::NotSupportedException);
251 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep6.dft"), storm::exceptions::NotSupportedException);
253 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep.dft");
254 EXPECT_NEAR(result, 2 / 3.0, this->precision());
255 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep4.dft");
256 EXPECT_NEAR(result, 1, this->precision());
257 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep5.dft");
258 EXPECT_NEAR(result, 3, this->precision());
259 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/fdep6.dft");
260 EXPECT_NEAR(result, 9 / 56.0, this->precision());
265 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep.dft");
266 EXPECT_NEAR(result, 8 / 3.0, this->precision());
267 if (this->env().analysis().isUseModularisation() && !this->useDC()) {
268 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep2.dft"), storm::exceptions::NotSupportedException);
270 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep2.dft");
271 EXPECT_NEAR(result, 38 / 15.0, this->precision());
273 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep3.dft");
274 EXPECT_NEAR(result, 67 / 24.0, this->precision());
276 if (this->env().analysis().isUseModularisation()) {
277 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep4.dft"), storm::exceptions::NotSupportedException);
279 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep4.dft");
285 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare.dft");
286 EXPECT_NEAR(result, 46 / 13.0, this->precision());
287 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare2.dft");
288 EXPECT_NEAR(result, 43 / 23.0, this->precision());
289 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare3.dft");
290 EXPECT_NEAR(result, 14 / 11.0, this->precision());
291 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare4.dft");
292 EXPECT_NEAR(result, 18836 / 3887.0, this->precision());
293 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare5.dft");
294 EXPECT_NEAR(result, 8 / 3.0, this->precision());
295 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare6.dft");
296 EXPECT_NEAR(result, 7 / 5.0, this->precision());
297 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare7.dft");
298 EXPECT_NEAR(result, 551 / 150.0, this->precision());
299 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare8.dft");
300 EXPECT_NEAR(result, 249 / 52.0, this->precision());
301 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare_dc.dft");
302 EXPECT_NEAR(result, 78311 / 182700.0, this->precision());
303 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/modules3.dft");
304 EXPECT_NEAR(result, 7 / 6.0, this->precision());
306 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/spare_contains_spare.dft");
307 EXPECT_NEAR(result, 1, this->precision());
311 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq.dft");
312 EXPECT_NEAR(result, 4, this->precision());
313 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq2.dft");
314 EXPECT_NEAR(result, 6, this->precision());
315 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq3.dft");
316 EXPECT_NEAR(result, 6, this->precision());
317 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq4.dft");
318 EXPECT_NEAR(result, 6, this->precision());
319 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq5.dft");
321 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq6.dft");
322 EXPECT_NEAR(result, 30000, this->precision());
324 if (this->env().analysis().isUseModularisation()) {
325 STORM_SILENT_EXPECT_THROW(this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft"), storm::exceptions::NotSupportedException);
327 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft");
330 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft", 1.0);
331 EXPECT_NEAR(result, 0.08, this->precision());
332 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/seq7.dft");
333 EXPECT_NEAR(result, 0.08, this->precision());
334 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/seq8.dft");
335 EXPECT_NEAR(result, 11 / 8.0, this->precision());
339 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex.dft");
340 EXPECT_NEAR(result, 1 / 2.0, this->precision());
341 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex.dft", 1.0);
342 EXPECT_NEAR(result, 0.8646647168, this->precisionReliability());
343 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex.dft");
344 EXPECT_NEAR(result, 1, this->precision());
346 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex2.dft");
348 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex2.dft", 1.0);
349 EXPECT_NEAR(result, 0, this->precision());
350 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex2.dft");
351 EXPECT_NEAR(result, 0, this->precision());
353 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex3.dft");
355 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex3.dft", 1.0);
356 EXPECT_NEAR(result, 0, this->precision());
357 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex3.dft");
358 EXPECT_NEAR(result, 0, this->precision());
360 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/mutex4.dft");
362 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/mutex4.dft", 1.0);
363 EXPECT_NEAR(result, 0.5842978146, this->precisionReliability());
364 result = this->analyzeReachability(STORM_TEST_RESOURCES_DIR
"/dft/mutex4.dft");
365 EXPECT_NEAR(result, 5 / 8.0, this->precision());
369 double result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/symmetry6.dft");
370 EXPECT_NEAR(result, 2804183 / 2042040.0, this->precision());
371 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/symmetry6.dft", 1.0);
372 EXPECT_NEAR(result, 0.3421934224, this->precisionReliability());
374 result = this->analyzeMTTF(STORM_TEST_RESOURCES_DIR
"/dft/pdep_symmetry.dft");
375 EXPECT_NEAR(result, 6553 / 5376.0, this->precision());
376 result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/pdep_symmetry.dft", 1.0);
377 EXPECT_NEAR(result, 0.4223514414, this->precisionReliability());
380TYPED_TEST(DftModelCheckerTest, HecsReliability) {
381 if (!this->useDC()) {
386 double result = this->analyzeReliability(STORM_TEST_RESOURCES_DIR
"/dft/hecs_2_2.dft", 1.0);
387 EXPECT_NEAR(result, 0.00021997582, this->precisionReliability());
void setUseModularisation(bool value)
AnalysisEnvironment & analysis()
ModelBuilderEnvironment & modelBuilder()
void setUseSymmetryReduction(bool value)
void setAllowDCForRelevantEvents(bool value)
std::vector< boost::variant< ExtendedValueType, approximation_result > > dft_results
std::vector< std::shared_ptr< storm::logic::Formula const > > extractFormulasFromProperties(std::vector< storm::jani::Property > const &properties)
std::vector< storm::jani::Property > parseProperties(storm::parser::FormulaParser &formulaParser, std::string const &inputString, boost::optional< std::set< std::string > > const &propertyFilter)
std::shared_ptr< storm::dft::storage::DFT< ValueType > > prepareForMarkovAnalysis(storm::dft::storage::DFT< ValueType > const &dft)
Apply transformations to make DFT feasible for Markovian analysis.
std::shared_ptr< storm::dft::storage::DFT< ValueType > > loadDFTGalileoFile(std::string const &file)
Load DFT from Galileo file.
storm::dft::utility::RelevantEvents computeRelevantEvents(std::vector< std::shared_ptr< storm::logic::Formula const > > const &properties, std::vector< std::string > const &additionalRelevantEventNames, bool addLabelsClaiming)
Get relevant event ids from given relevant event names and labels in properties.
std::pair< bool, std::string > isWellFormed(storm::dft::storage::DFT< ValueType > const &dft, bool validForMarkovianAnalysis)
Check whether the DFT is well-formed.
storm::dft::modelchecker::DFTModelChecker< ValueType >::dft_results analyzeDFT(storm::dft::DftEnvironment const &env, storm::dft::storage::DFT< ValueType > const &dft, std::vector< std::shared_ptr< storm::logic::Formula const > > const &properties, storm::dft::utility::RelevantEvents const &relevantEvents, bool printOutput, typename storm::dft::modelchecker::DFTModelChecker< ValueType >::ModelExportCallback const &exportCallback)
Compute the exact or approximate analysis result of the given DFT according to the given properties.
ExtendedValueType< ValueType > positiveInfinity()
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)