Storm
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
DftBETest.cpp
Go to the documentation of this file.
1#include "storm-config.h"
2#include "test/storm_gtest.h"
3
4#include <boost/math/distributions/weibull.hpp>
5
7
8namespace {
9
10TEST(DftBETest, FailureConstant) {
12 EXPECT_TRUE(be.failed());
13 EXPECT_TRUE(be.canFail());
14
15 EXPECT_EQ(1, be.getUnreliability(0));
16 EXPECT_EQ(1, be.getUnreliability(10));
17
19 EXPECT_FALSE(be2.failed());
20 EXPECT_FALSE(be2.canFail());
21
22 EXPECT_EQ(0, be2.getUnreliability(0));
23 EXPECT_EQ(0, be2.getUnreliability(8));
24}
25
26TEST(DftBETest, FailureProbability) {
28
29 EXPECT_TRUE(be.canFail());
30 EXPECT_EQ(0.2, be.passiveFailureProbability());
31
32 EXPECT_EQ(0.4, be.getUnreliability(0.4));
33 EXPECT_EQ(0.4, be.getUnreliability(0.5));
34 EXPECT_EQ(0.4, be.getUnreliability(1));
35 EXPECT_EQ(0.4, be.getUnreliability(5));
36}
37
38TEST(DftBETest, FailureExponential) {
40
41 EXPECT_TRUE(be.canFail());
42 EXPECT_EQ(1.5, be.passiveFailureRate());
43
44 EXPECT_EQ(0, be.getUnreliability(0));
45 EXPECT_NEAR(0.7768698399, be.getUnreliability(0.5), 1e-10);
46 EXPECT_NEAR(0.9502129316, be.getUnreliability(1), 1e-10);
47 EXPECT_NEAR(0.9975212478, be.getUnreliability(2), 1e-10);
48}
49
50TEST(DftBETest, FailureErlang) {
51 // Single phase
53
54 EXPECT_TRUE(be.canFail());
55 EXPECT_EQ(3, be.passiveFailureRate());
56
57 EXPECT_EQ(0, be.getUnreliability(0));
58 EXPECT_NEAR(0.7768698399, be.getUnreliability(0.5), 1e-10);
59 EXPECT_NEAR(0.9502129316, be.getUnreliability(1), 1e-10);
60 EXPECT_NEAR(0.9975212478, be.getUnreliability(2), 1e-10);
61
62 // Multiple phases
64
65 EXPECT_TRUE(be2.canFail());
66 EXPECT_EQ(3, be2.passiveFailureRate());
67
68 EXPECT_EQ(0, be2.getUnreliability(0));
69 EXPECT_NEAR(0.0656424544, be2.getUnreliability(0.5), 1e-10);
70 EXPECT_NEAR(0.3527681112, be2.getUnreliability(1), 1e-10);
71 EXPECT_NEAR(0.6577040442, be2.getUnreliability(1.5), 1e-10);
72 EXPECT_NEAR(0.8487961172, be2.getUnreliability(2), 1e-10);
73 EXPECT_NEAR(0.9997886215, be2.getUnreliability(5), 1e-10);
74}
75
76TEST(DftBETest, FailureWeibullExponential) {
77 // Reduces to exponential distribution
78 storm::dft::storage::elements::BEWeibull<double> be(0, "TestBE", 1, 1.0 / 3.0);
79
80 EXPECT_TRUE(be.canFail());
81
82 EXPECT_EQ(0, be.getUnreliability(0));
83 EXPECT_NEAR(0.7768698399, be.getUnreliability(0.5), 1e-10);
84 EXPECT_NEAR(0.9502129316, be.getUnreliability(1), 1e-10);
85 EXPECT_NEAR(0.9975212478, be.getUnreliability(2), 1e-10);
86
87 // Compare with boost results
88 boost::math::weibull_distribution<double> dist(1, 1.0 / 3.0);
89 for (double t = 0; t <= 5.0; t += 0.25) {
90 EXPECT_NEAR(boost::math::cdf(dist, t), be.getUnreliability(t), 1e-10);
91 }
92
93 // Increasing failure rate
95
96 EXPECT_TRUE(be2.canFail());
97
98 EXPECT_EQ(0, be2.getUnreliability(0));
99 EXPECT_NEAR(0.0605869372, be2.getUnreliability(0.5), 1e-10);
100 EXPECT_NEAR(0.2211992169, be2.getUnreliability(1), 1e-10);
101 EXPECT_NEAR(0.6321205588, be2.getUnreliability(2), 1e-10);
102 EXPECT_NEAR(0.9980695458, be2.getUnreliability(5), 1e-10);
103
104 // Compare with boost results
105 boost::math::weibull_distribution<double> dist2(2, 2);
106 for (double t = 0; t <= 5.0; t += 0.25) {
107 EXPECT_NEAR(boost::math::cdf(dist2, t), be2.getUnreliability(t), 1e-10);
108 }
109
110 // Decreasing faiure rate
112
113 EXPECT_TRUE(be3.canFail());
114
115 EXPECT_EQ(0, be3.getUnreliability(0));
116 EXPECT_NEAR(0.4369287910, be3.getUnreliability(0.5), 1e-10);
117 EXPECT_NEAR(0.5313308906, be3.getUnreliability(1), 1e-10);
118 EXPECT_NEAR(0.6321205588, be3.getUnreliability(2), 1e-10);
119 EXPECT_NEAR(0.7637110612, be3.getUnreliability(5), 1e-10);
120
121 // Compare with boost results
122 boost::math::weibull_distribution<double> dist3(0.4, 2);
123 for (double t = 0; t <= 5.0; t += 0.25) {
124 EXPECT_NEAR(boost::math::cdf(dist3, t), be3.getUnreliability(t), 1e-10);
125 }
126}
127
128TEST(DftBETest, FailureLogNormal) {
129 // First distribution
131
132 EXPECT_TRUE(be.canFail());
133
134 EXPECT_EQ(0, be.getUnreliability(0));
135 EXPECT_NEAR(0.0828285190, be.getUnreliability(0.5), 1e-10);
136 EXPECT_NEAR(0.5, be.getUnreliability(1), 1e-10);
137 EXPECT_NEAR(0.9171714810, be.getUnreliability(2), 1e-10);
138 EXPECT_NEAR(0.9993565290, be.getUnreliability(5), 1e-10);
139
140 // Second distribution
142
143 EXPECT_TRUE(be2.canFail());
144
145 EXPECT_EQ(0, be2.getUnreliability(0));
146 EXPECT_NEAR(6.32491e-12, be2.getUnreliability(0.5), 1e-17);
147 EXPECT_NEAR(3.167124183e-5, be2.getUnreliability(1), 1e-14);
148 EXPECT_NEAR(0.1098340249, be2.getUnreliability(2), 1e-10);
149 EXPECT_NEAR(0.9926105382, be2.getUnreliability(5), 1e-10);
150}
151
152TEST(DftBETest, FailureSamples) {
153 // Weibull distribution with shape 5 and scale 1
154 std::map<double, double> samples = {{0.0, 0.0},
155 {0.25, 0.0009760858180243304},
156 {0.5, 0.03076676552365587},
157 {0.75, 0.21124907114638225},
158 {1.0, 0.6321205588285577},
159 {1.25, 0.9527242505937095},
160 {1.5, 0.9994964109502631},
161 {1.75, 0.999999925546118},
162 {2.0, 0.9999999999999873}};
164
165 EXPECT_TRUE(be.canFail());
166
167 // Compare with boost results
168 boost::math::weibull_distribution<double> dist(5, 1);
169 for (double t = 0; t <= 2.0; t += 0.25) {
170 EXPECT_NEAR(boost::math::cdf(dist, t), be.getUnreliability(t), 1e-10);
171 }
172}
173
174} // namespace
TEST(OrderTest, Simple)
Definition OrderTest.cpp:8
BE which is either constant failed or constant failsafe.
Definition BEConst.h:14
BE with Erlang failure distribution.
Definition BEErlang.h:13
BE with exponential failure distribution.
BE with log-normal failure distribution.
Definition BELogNormal.h:13
BE with constant (Bernoulli) failure probability distribution.
BE where the failure distribution is defined by samples.
Definition BESamples.h:16
BE with Weibull failure distribution.
Definition BEWeibull.h:13