1#include "storm-config.h"
23#ifndef STORM_HAVE_CUDD
24 GTEST_SKIP() <<
"Library CUDD not available.";
34#ifndef STORM_HAVE_SYLVAN
35 GTEST_SKIP() <<
"Library Sylvan not available.";
42template<
typename TestType>
52 GTEST_SKIP() <<
"Library Z3 not available.";
54 TestType::checkLibraryAvailable();
62 GTEST_SKIP() <<
"Library Z3 not available.";
84 EXPECT_EQ(4409ull, statesWithProbability01.first.getNonZeroCount());
85 EXPECT_EQ(1316ull, statesWithProbability01.second.getNonZeroCount());
89 EXPECT_EQ(1091ull, statesWithProbability01.first.getNonZeroCount());
90 EXPECT_EQ(4802ull, statesWithProbability01.second.getNonZeroCount());
94 EXPECT_EQ(5829ull, statesWithProbability01.first.getNonZeroCount());
95 EXPECT_EQ(1032ull, statesWithProbability01.second.getNonZeroCount());
113 EXPECT_EQ(0ull, statesWithProbability01.first.getNonZeroCount());
114 EXPECT_EQ(364ull, statesWithProbability01.second.getNonZeroCount());
118 EXPECT_EQ(0ull, statesWithProbability01.first.getNonZeroCount());
119 EXPECT_EQ(364ull, statesWithProbability01.second.getNonZeroCount());
134 EXPECT_EQ(77ull, statesWithProbability01.first.getNonZeroCount());
135 EXPECT_EQ(149ull, statesWithProbability01.second.getNonZeroCount());
139 EXPECT_EQ(74ull, statesWithProbability01.first.getNonZeroCount());
140 EXPECT_EQ(198ull, statesWithProbability01.second.getNonZeroCount());
144 EXPECT_EQ(94ull, statesWithProbability01.first.getNonZeroCount());
145 EXPECT_EQ(33ull, statesWithProbability01.second.getNonZeroCount());
149 EXPECT_EQ(83ull, statesWithProbability01.first.getNonZeroCount());
150 EXPECT_EQ(35ull, statesWithProbability01.second.getNonZeroCount());
163 ASSERT_NO_THROW(statesWithProbability01 =
165 model->getStates(
"collision_max_backoff")));
166 EXPECT_EQ(993ull, statesWithProbability01.first.getNonZeroCount());
167 EXPECT_EQ(16ull, statesWithProbability01.second.getNonZeroCount());
169 ASSERT_NO_THROW(statesWithProbability01 =
171 model->getStates(
"collision_max_backoff")));
172 EXPECT_EQ(993ull, statesWithProbability01.first.getNonZeroCount());
173 EXPECT_EQ(16ull, statesWithProbability01.second.getNonZeroCount());
180 std::shared_ptr<storm::models::sparse::Model<double>> model =
185 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01;
189 model->getStates(
"observe0Greater1")));
190 EXPECT_EQ(4409ull, statesWithProbability01.first.getNumberOfSetBits());
191 EXPECT_EQ(1316ull, statesWithProbability01.second.getNumberOfSetBits());
195 model->getStates(
"observeIGreater1")));
196 EXPECT_EQ(1091ull, statesWithProbability01.first.getNumberOfSetBits());
197 EXPECT_EQ(4802ull, statesWithProbability01.second.getNumberOfSetBits());
201 model->getStates(
"observeOnlyTrueSender")));
202 EXPECT_EQ(5829ull, statesWithProbability01.first.getNumberOfSetBits());
203 EXPECT_EQ(1032ull, statesWithProbability01.second.getNumberOfSetBits());
209 std::shared_ptr<storm::models::sparse::Model<double>> model =
214 std::pair<storm::storage::BitVector, storm::storage::BitVector> statesWithProbability01;
216 ASSERT_NO_THROW(statesWithProbability01 =
219 EXPECT_EQ(0ull, statesWithProbability01.first.getNumberOfSetBits());
220 EXPECT_EQ(364ull, statesWithProbability01.second.getNumberOfSetBits());
222 ASSERT_NO_THROW(statesWithProbability01 =
225 EXPECT_EQ(0ull, statesWithProbability01.first.getNumberOfSetBits());
226 EXPECT_EQ(364ull, statesWithProbability01.second.getNumberOfSetBits());
236 model->getStates(
"all_coins_equal_0")));
237 EXPECT_EQ(77ull, statesWithProbability01.first.getNumberOfSetBits());
238 EXPECT_EQ(149ull, statesWithProbability01.second.getNumberOfSetBits());
242 model->getStates(
"all_coins_equal_0")));
243 EXPECT_EQ(74ull, statesWithProbability01.first.getNumberOfSetBits());
244 EXPECT_EQ(198ull, statesWithProbability01.second.getNumberOfSetBits());
248 model->getStates(
"all_coins_equal_1")));
249 EXPECT_EQ(94ull, statesWithProbability01.first.getNumberOfSetBits());
250 EXPECT_EQ(33ull, statesWithProbability01.second.getNumberOfSetBits());
254 model->getStates(
"all_coins_equal_1")));
255 EXPECT_EQ(83ull, statesWithProbability01.first.getNumberOfSetBits());
256 EXPECT_EQ(35ull, statesWithProbability01.second.getNumberOfSetBits());
266 model->getStates(
"collision_max_backoff")));
267 EXPECT_EQ(993ull, statesWithProbability01.first.getNumberOfSetBits());
268 EXPECT_EQ(16ull, statesWithProbability01.second.getNumberOfSetBits());
272 model->getStates(
"collision_max_backoff")));
273 EXPECT_EQ(993ull, statesWithProbability01.first.getNumberOfSetBits());
274 EXPECT_EQ(16ull, statesWithProbability01.second.getNumberOfSetBits());
281 uint64_t
const numberOfStates = 10;
283 auto newState = [&builder, &rowGroupIndices](uint64_t row) {
284 rowGroupIndices.push_back(row);
285 builder.newRowGroup(row);
288 builder.addNextValue(0, 1, 1.0);
290 builder.addNextValue(1, 2, 1.0);
292 builder.addNextValue(2, 3, 0.5);
293 builder.addNextValue(2, 6, 0.5);
294 builder.addNextValue(3, 2, 1.0);
296 builder.addNextValue(4, 4, 1.0);
297 builder.addNextValue(5, 6, 1.0);
299 builder.addNextValue(6, 5, 1.0);
301 builder.addNextValue(7, 5, 1.0);
303 builder.addNextValue(8, 6, 1.0);
305 builder.addNextValue(9, 8, 1.0);
307 builder.addNextValue(10, 9, 1.0);
309 builder.addNextValue(11, 6, 1.0);
310 rowGroupIndices.push_back(12);
311 return builder.build(12, numberOfStates, numberOfStates);
319TEST(GraphTestExplicitProb1E, SafetyAndReachabilityAlternation) {
320 std::vector<uint_fast64_t> rowGroupIndices;
321 auto matrix = buildProb1ETestModel(rowGroupIndices);
322 auto backwardTransitions = matrix.transpose(
true);
324 auto phiStates = ~asBitVector(10, {6});
325 auto psiStates = asBitVector(10, {5});
331 EXPECT_EQ(asBitVector(10, {3, 4, 5}), result);
335 EXPECT_EQ(asBitVector(10, {6, 7, 8, 9}), prob01.first);
336 EXPECT_EQ(result, prob01.second);
339TEST(GraphTestExplicitProb1E, ChoiceConstraint) {
340 std::vector<uint_fast64_t> rowGroupIndices;
341 auto matrix = buildProb1ETestModel(rowGroupIndices);
342 auto backwardTransitions = matrix.transpose(
true);
343 auto phiStates = ~asBitVector(10, {6});
344 auto psiStates = asBitVector(10, {5});
347 auto choiceConstraint = ~asBitVector(matrix.getRowCount(), {4});
349 EXPECT_EQ(asBitVector(10, {4, 5}), result);
352 choiceConstraint = ~asBitVector(matrix.getRowCount(), {3});
354 EXPECT_EQ(asBitVector(10, {3, 4, 5}), result);
357TEST(GraphTestExplicitProb1E, PsiStatesOutsidePhiStates) {
358 std::vector<uint_fast64_t> rowGroupIndices;
359 auto matrix = buildProb1ETestModel(rowGroupIndices);
360 auto backwardTransitions = matrix.transpose(
true);
362 auto phiStates = ~asBitVector(10, {6});
363 auto psiStates = asBitVector(10, {6});
368 EXPECT_EQ(asBitVector(10, {0, 1, 2, 3, 6, 7, 8, 9}), result);
static void checkLibraryAvailable()
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
static const storm::dd::DdType DdType
static void checkLibraryAvailable()
std::shared_ptr< storm::models::symbolic::Model< Type, ValueType > > build(storm::Environment const &env, storm::prism::Program const &program, Options const &options=Options())
Translates the given program into a symbolic model (i.e.
std::shared_ptr< storm::models::sparse::Model< ValueType, RewardModelType > > build()
Convert the program given at construction time to an abstract model.
This class represents a discrete-time Markov chain.
This class represents a (discrete-time) Markov decision process.
This class represents a discrete-time Markov chain.
This class represents a discrete-time Markov decision process.
storm::dd::Bdd< Type > const & getReachableStates() const
Retrieves the reachable states of the model.
static storm::prism::Program parse(std::string const &filename, bool prismCompatability=false)
Parses the given file into the PRISM storage classes assuming it complies with the PRISM syntax.
A bit vector that is internally represented as a vector of 64-bit values.
A class that can be used to build a sparse matrix by adding value by value.
A class that holds a possibly non-square matrix in the compressed row storage format.
storm::prism::Program const & asPrismProgram() const
SymbolicModelDescription preprocess(std::string const &constantDefinitionString="") const
storm::builder::BuilderOptions NextStateGeneratorOptions
std::pair< storm::storage::BitVector, storm::storage::BitVector > performProb01(storm::models::sparse::DeterministicModel< T > const &model, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
Computes the sets of states that have probability 0 or 1, respectively, of satisfying phi until psi i...
std::pair< storm::storage::BitVector, storm::storage::BitVector > performProb01Max(storm::storage::SparseMatrix< T > const &transitionMatrix, std::vector< uint_fast64_t > const &nondeterministicChoiceIndices, storm::storage::SparseMatrix< T > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
std::pair< storm::storage::BitVector, storm::storage::BitVector > performProb01Min(storm::storage::SparseMatrix< T > const &transitionMatrix, std::vector< uint_fast64_t > const &nondeterministicChoiceIndices, storm::storage::SparseMatrix< T > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates)
storm::storage::BitVector performProb1E(storm::storage::SparseMatrix< T > const &transitionMatrix, std::vector< uint_fast64_t > const &nondeterministicChoiceIndices, storm::storage::SparseMatrix< T > const &backwardTransitions, storm::storage::BitVector const &phiStates, storm::storage::BitVector const &psiStates, boost::optional< storm::storage::BitVector > const &choiceConstraint)
Computes the sets of states that have probability 1 of satisfying phi until psi under at least one po...
TYPED_TEST(GraphTestAR, SymbolicProb01StochasticGameDieSmall)
TYPED_TEST_SUITE(GraphTestAR, TestingTypes,)
::testing::Types< Cudd, Sylvan > TestingTypes
TEST(GraphTestExplicitProb1E, SafetyAndReachabilityAlternation)
TEST_F(GraphTestExplicit, ExplicitProb01)