|
|
@ -10,8 +10,8 @@ |
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
// Helper function
|
|
|
|
double simulateDft(std::string const& file, double timebound, size_t noRuns) { |
|
|
|
// Helper functions
|
|
|
|
std::pair<double, double> simulateDft(std::string const& file, double timebound, size_t noRuns) { |
|
|
|
// Load, build and prepare DFT
|
|
|
|
storm::transformations::dft::DftTransformator<double> dftTransformator = storm::transformations::dft::DftTransformator<double>(); |
|
|
|
std::shared_ptr<storm::storage::DFT<double>> dft = dftTransformator.transformBinaryFDEPs(*(storm::api::loadDFTGalileoFile<double>(file))); |
|
|
@ -27,104 +27,162 @@ namespace { |
|
|
|
storm::storage::DFTStateGenerationInfo stateGenerationInfo(dft->buildStateGenerationInfo(symmetries)); |
|
|
|
|
|
|
|
// Init random number generator
|
|
|
|
//storm::utility::setLogLevel(l3pp::LogLevel::TRACE);
|
|
|
|
boost::mt19937 gen(5u); |
|
|
|
storm::dft::simulator::DFTTraceSimulator<double> simulator(*dft, stateGenerationInfo, gen); |
|
|
|
|
|
|
|
size_t count = 0;; |
|
|
|
bool res; |
|
|
|
size_t count = 0; |
|
|
|
size_t invalid = 0; |
|
|
|
storm::dft::simulator::SimulationResult res; |
|
|
|
for (size_t i=0; i<noRuns; ++i) { |
|
|
|
res = simulator.simulateCompleteTrace(timebound); |
|
|
|
if (res) { |
|
|
|
if (res == storm::dft::simulator::SimulationResult::SUCCESSFUL) { |
|
|
|
++count; |
|
|
|
} else if (res == storm::dft::simulator::SimulationResult::INVALID) { |
|
|
|
// Discard invalid traces
|
|
|
|
++invalid; |
|
|
|
} |
|
|
|
} |
|
|
|
return std::make_pair(count, invalid); |
|
|
|
} |
|
|
|
|
|
|
|
double simulateDftProb(std::string const& file, double timebound, size_t noRuns) { |
|
|
|
size_t count; |
|
|
|
size_t invalid; |
|
|
|
std::tie(count, invalid) = simulateDft(file, timebound, noRuns); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
return (double) count / noRuns; |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, AndUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/and.dft", 2, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/and.dft", 2, 10000); |
|
|
|
EXPECT_NEAR(result, 0.3995764009, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, OrUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/or.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/or.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.6321205588, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, VotingUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/voting.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/voting.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.4511883639, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/voting2.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/voting2.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.8173164759, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/voting3.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/voting3.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.3496529873, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/voting4.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/voting4.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.693568287, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, PandUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/pand.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/pand.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.03087312562, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, PorUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/por.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/por.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.2753355179, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, FdepUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/fdep.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/fdep.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.7768698399, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/fdep2.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/fdep2.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.3934693403, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/fdep3.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/fdep3.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.329679954, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/fdep4.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/fdep4.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.601280086, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/fdep5.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/fdep5.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.1548181217, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/fdep6.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/fdep6.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.9985116987, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, PdepUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/pdep.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/pdep.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.2017690905, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/pdep2.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/pdep2.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.2401091405, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/pdep3.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/pdep3.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.2259856274, 0.01); |
|
|
|
// Examle pdep4 contains non-determinism which is not handled in simulation
|
|
|
|
//result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/pdep4.dft", 1, 10000);
|
|
|
|
// Example pdep4 contains non-determinism which is not handled in simulation
|
|
|
|
//result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/pdep4.dft", 1, 10000);
|
|
|
|
//EXPECT_NEAR(result, 0.008122157897, 0.01);
|
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, SpareUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.1118530638, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare2.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare2.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.2905027469, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare3.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare3.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.4660673246, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare4.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare4.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.01273070783, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare5.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare5.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.2017690905, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare6.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare6.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.4693712702, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare7.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare7.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.06108774525, 0.01); |
|
|
|
result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/spare8.dft", 1, 10000); |
|
|
|
result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/spare8.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.02686144489, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, SeqUnreliability) { |
|
|
|
size_t count; |
|
|
|
size_t invalid; |
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/seq.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
double result = (double) count / 10000; |
|
|
|
EXPECT_NEAR(result, 0.09020401043, 0.01); |
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/seq2.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
result = (double) count / 10000; |
|
|
|
EXPECT_NEAR(result, 0.01438767797, 0.01); |
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/seq3.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
result = (double) count / 10000; |
|
|
|
EXPECT_NEAR(result, 0.01438767797, 0.01); |
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/seq4.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
result = (double) count / 10000; |
|
|
|
EXPECT_NEAR(result, 0.01438767797, 0.01); |
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/seq5.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
result = (double) count / 10000; |
|
|
|
EXPECT_FLOAT_EQ(result, 0); |
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/seq6.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
result = (double) count / 10000; |
|
|
|
EXPECT_NEAR(result, 2.499875004e-09, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, MutexUnreliability) { |
|
|
|
size_t count; |
|
|
|
size_t invalid; |
|
|
|
// Invalid states are currently not supported
|
|
|
|
EXPECT_THROW(simulateDft(STORM_TEST_RESOURCES_DIR "/dft/mutex.dft", 1, 10000), storm::exceptions::NotSupportedException); |
|
|
|
//EXPECT_GE(invalid, 0);
|
|
|
|
//double result = (double) count / (10000 - invalid);
|
|
|
|
//EXPECT_NEAR(result, 0.8646647168, 0.01);
|
|
|
|
EXPECT_THROW(simulateDft(STORM_TEST_RESOURCES_DIR "/dft/mutex2.dft", 1, 10000), storm::exceptions::NotSupportedException); |
|
|
|
//EXPECT_EQ(invalid, 10000);
|
|
|
|
//EXPECT_EQ(count, 0);
|
|
|
|
std::tie(count, invalid) = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/mutex3.dft", 1, 10000); |
|
|
|
EXPECT_EQ(invalid, 0); |
|
|
|
EXPECT_EQ(count, 0); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, SymmetryUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/symmetry6.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/symmetry6.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.3421934224, 0.01); |
|
|
|
} |
|
|
|
|
|
|
|
TEST(DftSimulatorTest, HecsUnreliability) { |
|
|
|
double result = simulateDft(STORM_TEST_RESOURCES_DIR "/dft/hecs_2_2.dft", 1, 10000); |
|
|
|
double result = simulateDftProb(STORM_TEST_RESOURCES_DIR "/dft/hecs_2_2.dft", 1, 10000); |
|
|
|
EXPECT_NEAR(result, 0.00021997582, 0.001); |
|
|
|
} |
|
|
|
|
|
|
|