1#include <gmm/gmm_std.h>
6#include "storm-config.h"
26 double probabilityAtTimeboundOne;
28 std::vector<double> birnbaum;
29 std::vector<double> CIF;
30 std::vector<double> DIF;
31 std::vector<double> RAW;
32 std::vector<double> RRW;
34 friend std::ostream &
operator<<(std::ostream &os, SftTestData
const &data) {
35 auto printVector = [&os](std::vector<double>
const &arr) {
37 for (
auto const &i : arr) {
46 os <<
"{\"" << data.testname <<
'"';
47 os <<
", \"" << data.filepath <<
'"';
48 os <<
", \"" << data.bddHash <<
'"';
49 os <<
", " << data.probabilityAtTimeboundOne;
50 os <<
", " << data.mttf;
51 printVector(data.birnbaum);
52 printVector(data.CIF);
53 printVector(data.DIF);
54 printVector(data.RAW);
55 printVector(data.RRW);
61class SftBddTest :
public testing::TestWithParam<SftTestData> {
63 void SetUp()
override {
64 auto const ¶m{TestWithParam::GetParam()};
65 auto dft{storm::dft::api::loadDFTGalileoFile<double>(param.filepath)};
66 checker = std::make_shared<storm::dft::modelchecker::SFTBDDChecker>(dft);
69 std::shared_ptr<storm::dft::modelchecker::SFTBDDChecker> checker;
72TEST_P(SftBddTest, bddHash) {
73 auto const ¶m{TestWithParam::GetParam()};
74 EXPECT_EQ(checker->getTransformator()->transformTopLevel().GetShaHash(), param.bddHash);
77TEST_P(SftBddTest, ProbabilityAtTimeOne) {
78 auto const ¶m{TestWithParam::GetParam()};
79 EXPECT_NEAR(checker->getProbabilityAtTimebound(1), param.probabilityAtTimeboundOne, 1e-6);
82TEST_P(SftBddTest, MTTF) {
83 auto const ¶m{TestWithParam::GetParam()};
88template<
typename T1,
typename T2>
89void expectVectorNear(T1
const &v1, T2
const &v2,
double const precision = 1e-6) {
90 ASSERT_EQ(v1.size(), v2.size());
91 for (
size_t i{0};
i < v1.size(); ++
i) {
92 if (!std::isinf(v1[i])) {
93 EXPECT_NEAR(v1[i], v2[i], precision);
95 EXPECT_EQ(v1[i], v2[i]);
100TEST_P(SftBddTest, Birnbaum) {
101 auto const ¶m{TestWithParam::GetParam()};
102 expectVectorNear(checker->getAllBirnbaumFactorsAtTimebound(1), param.birnbaum);
105TEST_P(SftBddTest, CIF) {
106 auto const ¶m{TestWithParam::GetParam()};
107 expectVectorNear(checker->getAllCIFsAtTimebound(1), param.CIF);
110TEST_P(SftBddTest, DIF) {
111 auto const ¶m{TestWithParam::GetParam()};
112 expectVectorNear(checker->getAllDIFsAtTimebound(1), param.DIF);
115TEST_P(SftBddTest, RAW) {
116 auto const ¶m{TestWithParam::GetParam()};
117 expectVectorNear(checker->getAllRAWsAtTimebound(1), param.RAW);
120TEST_P(SftBddTest, RRW) {
121 auto const ¶m{TestWithParam::GetParam()};
122 expectVectorNear(checker->getAllRRWsAtTimebound(1), param.RRW);
125static std::vector<SftTestData> sftTestData{
128 STORM_TEST_RESOURCES_DIR
"/dft/bdd/AndTest.dft",
129 "07251c962e40a962c342b8673fd18b45a1461ebd917f83f6720aa106cf277f9f",
136 {INFINITY, INFINITY},
140 STORM_TEST_RESOURCES_DIR
"/dft/bdd/OrTest.dft",
141 "c5cf2304417926961c3e1ce1d876fc2886ece1365fd946bfd3e1abd71401696d",
145 {0.3333333333, 0.3333333333},
146 {0.666667, 0.666667},
147 {1.333333333, 1.333333333},
152 STORM_TEST_RESOURCES_DIR
"/dft/bdd/AndOrTest.dft",
153 "fc1e9a418e3c207e81ffa7fde7768f027b6996732c4216c1ed5de6861dbc86ae",
156 {0.375, 0.375, 0.375, 0.375},
157 {0.3333333333, 0.3333333333, 0.3333333333, 0.3333333333},
158 {0.666667, 0.666667, 0.666667, 0.666667},
159 {1.333333333, 1.333333333, 1.333333333, 1.333333333},
160 {1.5, 1.5, 1.5, 1.5},
164 STORM_TEST_RESOURCES_DIR
"/dft/bdd/VotTest.dft",
165 "c005a8d6ad70cc497e1efa3733b0dc52e94c465572d3f1fc5de4983ddd178094",
168 {0.375, 0.375, 0.375, 0.375},
169 {0.27272727, 0.27272727, 0.27272727, 0.27272727},
170 {0.636364, 0.636364, 0.636364, 0.636364},
171 {1.27272727, 1.27272727, 1.27272727, 1.27272727},
172 {1.375, 1.375, 1.375, 1.375},
176 STORM_TEST_RESOURCES_DIR
"/dft/bdd/ImportanceTest.dft",
177 "38221c1eb557dd6f15cf33faf61e18c4e426fab2fb909c56ac0d5f4ff0be499f",
180 {0.531011, 0.368041, 0.224763, 0.0596235, 0.0543206, 0.0810368, 0},
181 {1, 0.693094, 0.153453, 0.112283, 0.09231, 0.192934, 0},
182 {1, 0.846547, 0.306906, 0.556142, 0.501849, 0.703097, 0.5},
183 {2, 1.693094106, 1.693094106, 1.112283035, 1.112283035, 1.112283035, 1},
184 {INFINITY, 3.25832778, 1.18127, 1.126485175, 1.1016977, 1.23905588, 1},
187INSTANTIATE_TEST_SUITE_P(SFTs, SftBddTest, testing::ValuesIn(sftTestData), [](
auto const &info) {
return info.param.testname; });
189TEST(TestBdd, AndOrRelevantEvents) {
190 auto dft = storm::dft::api::loadDFTGalileoFile<double>(STORM_TEST_RESOURCES_DIR
"/dft/bdd/AndOrTest.dft");
191 auto manager = std::make_shared<storm::dft::storage::SylvanBddManager>();
195 auto const result = transformer.transformRelevantEvents();
197 EXPECT_EQ(result.size(), 4ul);
199 EXPECT_EQ(result.at(
"F").GetShaHash(),
"fc1e9a418e3c207e81ffa7fde7768f027b6996732c4216c1ed5de6861dbc86ae");
200 EXPECT_EQ(result.at(
"F1").GetShaHash(),
"c5cf2304417926961c3e1ce1d876fc2886ece1365fd946bfd3e1abd71401696d");
201 EXPECT_EQ(result.at(
"F2").GetShaHash(),
"a4f129fa27c6cd32625b088811d4b12f8059ae0547ee035c083deed9ef9d2c59");
202 EXPECT_EQ(result.at(
"x1").GetShaHash(),
"b0d991484e405a391b6d3d241fed9c00d4a2e5bf6f57300512394d819253893d");
205TEST(TestBdd, AndOrRelevantEventsChecked) {
206 auto dft = storm::dft::api::loadDFTGalileoFile<double>(STORM_TEST_RESOURCES_DIR
"/dft/bdd/AndOrTest.dft");
207 auto manager{std::make_shared<storm::dft::storage::SylvanBddManager>()};
209 auto transformator{std::make_shared<storm::dft::transformations::SftToBddTransformator<double>>(dft,
manager, relevantEvents)};
213 auto relevantEventsBdds = transformator->transformRelevantEvents();
215 EXPECT_NEAR(checker.getProbabilityAtTimebound(relevantEventsBdds[
"F"], 1), 0.5625, 1e-6);
217 EXPECT_NEAR(checker.getProbabilityAtTimebound(relevantEventsBdds[
"F1"], 1), 0.75, 1e-6);
218 EXPECT_NEAR(checker.getProbabilityAtTimebound(relevantEventsBdds[
"F2"], 1), 0.75, 1e-6);
220 EXPECT_NEAR(checker.getProbabilityAtTimebound(relevantEventsBdds[
"x1"], 1), 0.5, 1e-6);
223TEST(TestBdd, AndOrFormulaFail) {
224 auto dft = storm::dft::api::loadDFTGalileoFile<double>(STORM_TEST_RESOURCES_DIR
"/dft/bdd/AndOrTest.dft");
231TEST(TestBdd, AndOrFormula) {
232 auto dft = storm::dft::api::loadDFTGalileoFile<double>(STORM_TEST_RESOURCES_DIR
"/dft/bdd/AndOrTest.dft");
235 "P=? [F <= 1 \"F_failed\"];"
236 "P=? [F <= 1 \"F1_failed\" & \"F2_failed\"];"
237 "P=? [F = 1 !\"failed\"];"
238 "P=? [F = 1 !\"F1_failed\"];"
239 "P=? [F = 1 !\"F2_failed\"];"
240 "P=? [F <= 1 \"F1_failed\"];"
241 "P=? [F <= 1 \"F2_failed\"];"))};
244 auto const resultProbs{checker.
check()};
245 auto const result{checker.formulasToBdd()};
247 EXPECT_EQ(result.size(), 8ul);
249 EXPECT_EQ(resultProbs[0], resultProbs[1]);
250 EXPECT_EQ(resultProbs[1], resultProbs[2]);
251 EXPECT_NEAR(resultProbs[0], 0.5625, 1e-6);
253 EXPECT_NEAR(resultProbs[3], 1 - resultProbs[0], 1e-6);
255 EXPECT_EQ(resultProbs[6], resultProbs[7]);
256 EXPECT_NEAR(resultProbs[6], 0.75, 1e-6);
258 EXPECT_EQ(resultProbs[4], resultProbs[5]);
259 EXPECT_NEAR(resultProbs[4], 1 - resultProbs[6], 1e-6);
261 EXPECT_EQ(result[0], result[1]);
262 EXPECT_EQ(result[1], result[2]);
263 EXPECT_EQ(result[2], result[0]);
265 EXPECT_EQ(result[0].GetBDD(), result[1].GetBDD());
266 EXPECT_EQ(result[1].GetBDD(), result[2].GetBDD());
267 EXPECT_EQ(result[2].GetBDD(), result[0].GetBDD());
269 EXPECT_EQ(result[0].GetBDD(), (!result[3]).GetBDD());
270 EXPECT_NE(result[0].GetBDD(), result[3].GetBDD());
272 EXPECT_EQ(result[6].GetBDD(), (!result[4]).GetBDD());
273 EXPECT_NE(result[6].GetBDD(), result[4].GetBDD());
275 EXPECT_EQ(result[7].GetBDD(), (!result[5]).GetBDD());
276 EXPECT_NE(result[7].GetBDD(), result[5].GetBDD());
278 EXPECT_NE(result[3].GetBDD(), result[4].GetBDD());
280 EXPECT_EQ(result[0].GetShaHash(),
"fc1e9a418e3c207e81ffa7fde7768f027b6996732c4216c1ed5de6861dbc86ae");
281 EXPECT_EQ(result[1].GetShaHash(),
"fc1e9a418e3c207e81ffa7fde7768f027b6996732c4216c1ed5de6861dbc86ae");
282 EXPECT_EQ(result[2].GetShaHash(),
"fc1e9a418e3c207e81ffa7fde7768f027b6996732c4216c1ed5de6861dbc86ae");
283 EXPECT_EQ(result[3].GetShaHash(),
"fc1e9a418e3c207e81ffa7fde7768f027b6996732c4216c1ed5de6861dbc86ae");
284 EXPECT_EQ(result[4].GetShaHash(),
"c5cf2304417926961c3e1ce1d876fc2886ece1365fd946bfd3e1abd71401696d");
285 EXPECT_EQ(result[5].GetShaHash(),
"a4f129fa27c6cd32625b088811d4b12f8059ae0547ee035c083deed9ef9d2c59");
286 EXPECT_EQ(result[6].GetShaHash(),
"c5cf2304417926961c3e1ce1d876fc2886ece1365fd946bfd3e1abd71401696d");
287 EXPECT_EQ(result[7].GetShaHash(),
"a4f129fa27c6cd32625b088811d4b12f8059ae0547ee035c083deed9ef9d2c59");
Main class for the SFTBDDChecker.
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::ostream & operator<<(std::ostream &out, Counterexample const &counterexample)
double MTTFHelperVariableChange(std::shared_ptr< storm::dft::storage::DFT< double > > const dft, double const stepsize)
Tries to numerically approximate the mttf of the given dft by integrating 1 - cdf(dft) by changing th...
double MTTFHelperProceeding(std::shared_ptr< storm::dft::storage::DFT< double > > const dft, double const stepsize, double const precision)
Tries to numerically approximate the mttf of the given dft by integrating 1 - cdf(dft) with Simpson's...
SettingsManager const & manager()
Retrieves the settings manager.
#define STORM_SILENT_EXPECT_THROW(statement, expected_exception)