1#include "storm-config.h"
14struct DftTracesConfig {
19class NoOptimizationsConfig {
23 static DftTracesConfig createConfig() {
24 return DftTracesConfig{
false,
false};
32 static DftTracesConfig createConfig() {
33 return DftTracesConfig{
true,
false};
37class SymmetryReductionConfig {
41 static DftTracesConfig createConfig() {
42 return DftTracesConfig{
false,
true};
46class AllOptimizationsConfig {
50 static DftTracesConfig createConfig() {
51 return DftTracesConfig{
true,
true};
56template<
typename TestType>
57class DftTraceGeneratorTest :
public ::testing::Test {
59 typedef typename TestType::ValueType
ValueType;
61 DftTraceGeneratorTest() : config(TestType::createConfig()) {}
63 DftTracesConfig
const& getConfig()
const {
69 std::shared_ptr<storm::dft::storage::DFT<double>> dft =
70 storm::dft::api::prepareForMarkovAnalysis<double>(*(storm::dft::api::loadDFTGalileoFile<double>(file)));
74 std::vector<std::string> relevantNames;
76 relevantNames.push_back(
"all");
79 dft->setRelevantEvents(relevantEvents,
false);
87 return std::make_pair(dft, stateGenerationInfo);
91 DftTracesConfig config;
94typedef ::testing::Types<NoOptimizationsConfig, DontCareConfig, SymmetryReductionConfig, AllOptimizationsConfig>
TestingTypes;
99 auto pair = this->prepareDFT(STORM_TEST_RESOURCES_DIR
"/dft/and.dft");
100 auto dft = pair.first;
101 EXPECT_EQ(this->getConfig().useSR && this->getConfig().useDC, pair.second.hasSymmetries());
105 auto state = generator.createInitialState();
106 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
108 bool changed = state->orderBySymmetry();
109 EXPECT_FALSE(changed);
112 auto iterFailable = state->getFailableElements().begin();
113 ASSERT_NE(iterFailable, state->getFailableElements().end());
115 ASSERT_NE(iterFailable, state->getFailableElements().end());
116 EXPECT_FALSE(iterFailable.isFailureDueToDependency());
118 auto nextBE = iterFailable.asBE(*dft);
119 EXPECT_EQ(nextBE->name(),
"C");
120 state = generator.createSuccessorState(state, nextBE);
121 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
122 changed = state->orderBySymmetry();
123 EXPECT_EQ(this->getConfig().useSR && this->getConfig().useDC, changed);
124 if (this->getConfig().useSR && this->getConfig().useDC) {
125 EXPECT_TRUE(state->hasFailed(0));
127 EXPECT_TRUE(state->hasFailed(1));
131 iterFailable = state->getFailableElements().begin();
132 ASSERT_NE(iterFailable, state->getFailableElements().end());
133 EXPECT_FALSE(iterFailable.isFailureDueToDependency());
135 nextBE = iterFailable.asBE(*dft);
136 if (this->getConfig().useSR && this->getConfig().useDC) {
139 EXPECT_EQ(nextBE->name(),
"C");
141 EXPECT_EQ(nextBE->name(),
"B");
143 state = generator.createSuccessorState(state, nextBE);
144 changed = state->orderBySymmetry();
145 EXPECT_FALSE(changed);
146 EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex()));
149TYPED_TEST(DftTraceGeneratorTest, RandomStepsAnd) {
150 auto pair = this->prepareDFT(STORM_TEST_RESOURCES_DIR
"/dft/and.dft");
151 auto dft = pair.first;
152 EXPECT_EQ(this->getConfig().useSR && this->getConfig().useDC, pair.second.hasSymmetries());
155 boost::mt19937 gen(5u);
158 auto state = simulator.getCurrentState();
159 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
164#if BOOST_VERSION > 106400
166 EXPECT_NEAR(simulator.getCurrentTime(), 0.522079, 1e-6);
168 state = simulator.getCurrentState();
169 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
171 res = simulator.randomStep();
173#if BOOST_VERSION > 106400
175 EXPECT_NEAR(simulator.getCurrentTime(), 0.522079 + 0.9497214, 1e-6);
177 state = simulator.getCurrentState();
178 EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex()));
182 auto pair = this->prepareDFT(STORM_TEST_RESOURCES_DIR
"/dft/and.dft");
183 auto dft = pair.first;
184 EXPECT_EQ(this->getConfig().useSR && this->getConfig().useDC, pair.second.hasSymmetries());
187 boost::mt19937 gen(5u);
190 auto state = simulator.getCurrentState();
191 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
196#if BOOST_VERSION > 106400
198 EXPECT_NEAR(simulator.getCurrentTime(), 0.522079, 1e-6);
200 auto stateStep1 = simulator.getCurrentState();
201 EXPECT_FALSE(stateStep1->hasFailed(dft->getTopLevelIndex()));
203 res = simulator.randomStep();
205#if BOOST_VERSION > 106400
207 EXPECT_NEAR(simulator.getCurrentTime(), 0.522079 + 0.9497214, 1e-6);
209 state = simulator.getCurrentState();
210 EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex()));
213 simulator.resetToState(stateStep1);
214 state = simulator.getCurrentState();
215 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
217 res = simulator.randomStep();
219#if BOOST_VERSION > 106400
221 EXPECT_NEAR(simulator.getCurrentTime(), 0.522079 + 0.9497214 + 2.4686932, 1e-6);
223 state = simulator.getCurrentState();
224 EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex()));
228 auto pair = this->prepareDFT(STORM_TEST_RESOURCES_DIR
"/dft/fdep.dft");
229 auto dft = pair.first;
232 boost::mt19937 gen(5u);
236 auto state = simulator.getCurrentState();
237 EXPECT_FALSE(state->hasFailed(dft->getTopLevelIndex()));
240 auto iterFailable = state->getFailableElements().begin();
241 ASSERT_NE(iterFailable, state->getFailableElements().end());
243 ASSERT_NE(iterFailable, state->getFailableElements().end());
245 ASSERT_NE(iterFailable, state->getFailableElements().end());
247 EXPECT_FALSE(iterFailable.isFailureDueToDependency());
248 auto nextBE = iterFailable.asBE(*dft);
249 EXPECT_EQ(nextBE->name(),
"B_Power");
253 state = simulator.getCurrentState();
254 EXPECT_TRUE(state->hasFailed(4));
257 iterFailable = state->getFailableElements().begin();
258 ASSERT_NE(iterFailable, state->getFailableElements().end());
260 ASSERT_NE(iterFailable, state->getFailableElements().end());
262 EXPECT_TRUE(iterFailable.isFailureDueToDependency());
263 auto dependency = iterFailable.asDependency(*dft);
264 EXPECT_EQ(dependency->dependentEvents().front()->name(),
"B");
266 res = simulator.step(iterFailable);
268 state = simulator.getCurrentState();
269 EXPECT_TRUE(state->hasFailed(dft->getTopLevelIndex()));
Next state generator for DFTs.
static storm::dft::storage::DftSymmetries findSymmetries(storm::dft::storage::DFT< ValueType > const &dft)
Find symmetries in the given DFT.
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
SimulationStepResult
Result of a single simulation step.
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes