1 changed files with 92 additions and 0 deletions
			
			
		| @ -0,0 +1,92 @@ | |||||
|  | //
 | ||||
|  | // Created by Jip Spel on 20.09.18.
 | ||||
|  | //
 | ||||
|  | 
 | ||||
|  | #include "gtest/gtest.h"
 | ||||
|  | #include "storm-config.h"
 | ||||
|  | #include "test/storm_gtest.h"
 | ||||
|  | #include "storm-pars/analysis/MonotonicityChecker.h"
 | ||||
|  | #include "storm/storage/expressions/BinaryRelationExpression.h"
 | ||||
|  | #include "storm/storage/SparseMatrix.h"
 | ||||
|  | #include "storm/adapters/RationalFunctionAdapter.h"
 | ||||
|  | 
 | ||||
|  | TEST(MonotonicityCheckerTest, Monotone) { | ||||
|  |     auto checker = storm::analysis::MonotonicityChecker<storm::RationalFunction>(); | ||||
|  |     // Build lattice
 | ||||
|  |     auto numberOfStates = 4; | ||||
|  |     auto above = storm::storage::BitVector(numberOfStates); | ||||
|  |     above.set(1); | ||||
|  |     auto below = storm::storage::BitVector(numberOfStates); | ||||
|  |     below.set(0); | ||||
|  |     auto lattice = storm::analysis::Lattice(above, below, numberOfStates); | ||||
|  |     lattice.add(2); | ||||
|  |     lattice.add(3); | ||||
|  |     // Build map
 | ||||
|  |     std::vector<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions; | ||||
|  |     std::map<storm::analysis::Lattice*, std::vector<std::shared_ptr<storm::expressions::BinaryRelationExpression>>> map; | ||||
|  |     map.insert(std::pair<storm::analysis::Lattice*, std::vector<std::shared_ptr<storm::expressions::BinaryRelationExpression>>>(&lattice, assumptions)); | ||||
|  | 
 | ||||
|  |     // Build matrix
 | ||||
|  |     auto builder = storm::storage::SparseMatrixBuilder<storm::RationalFunction>(numberOfStates, numberOfStates, 4); | ||||
|  |     std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>(); | ||||
|  |     carl::StringParser parser; | ||||
|  |     parser.setVariables({"p", "q"}); | ||||
|  |     auto func = storm::RationalFunction(storm::Polynomial(parser.template parseMultivariatePolynomial<storm::RationalFunctionCoefficient>("p"), cache)); | ||||
|  |     auto funcMin = storm::RationalFunction(storm::RationalFunction(1)-func); | ||||
|  |     builder.addNextValue(2, 1, func); | ||||
|  |     builder.addNextValue(2, 0, funcMin); | ||||
|  |     func = storm::RationalFunction(storm::Polynomial(parser.template parseMultivariatePolynomial<storm::RationalFunctionCoefficient>("q"), cache)); | ||||
|  |     funcMin = storm::RationalFunction(storm::RationalFunction(1)-func); | ||||
|  |     builder.addNextValue(3, 1, funcMin); | ||||
|  |     builder.addNextValue(3, 0, func); | ||||
|  |     storm::storage::SparseMatrix<storm::RationalFunction> matrix = builder.build(); | ||||
|  | 
 | ||||
|  |     std::map<storm::analysis::Lattice*, std::map<carl::Variable, std::pair<bool, bool>>> result = checker.checkMonotonicity(map, matrix); | ||||
|  |     ASSERT_EQ(1, result.size()); | ||||
|  |     ASSERT_EQ(2, result.begin()->second.size()); | ||||
|  |     auto entry1 = result.begin()->second.begin(); | ||||
|  |     auto entry2 = ++ (result.begin()->second.begin()); | ||||
|  |     ASSERT_EQ("p", entry1->first.name()); | ||||
|  |     EXPECT_TRUE(entry1->second.first); | ||||
|  |     EXPECT_FALSE(entry1->second.second); | ||||
|  |     EXPECT_FALSE(entry2->second.first); | ||||
|  |     EXPECT_TRUE(entry2->second.second); | ||||
|  | } | ||||
|  | 
 | ||||
|  | TEST(MonotonicityCheckerTest, NotMonotone) { | ||||
|  |     auto checker = storm::analysis::MonotonicityChecker<storm::RationalFunction>(); | ||||
|  |     // Build lattice
 | ||||
|  |     auto numberOfStates = 4; | ||||
|  |     auto above = storm::storage::BitVector(numberOfStates); | ||||
|  |     above.set(1); | ||||
|  |     auto below = storm::storage::BitVector(numberOfStates); | ||||
|  |     below.set(0); | ||||
|  |     auto lattice = storm::analysis::Lattice(above, below, numberOfStates); | ||||
|  |     lattice.add(2); | ||||
|  |     lattice.add(3); | ||||
|  |     // Build map
 | ||||
|  |     std::vector<std::shared_ptr<storm::expressions::BinaryRelationExpression>> assumptions; | ||||
|  |     std::map<storm::analysis::Lattice*, std::vector<std::shared_ptr<storm::expressions::BinaryRelationExpression>>> map; | ||||
|  |     map.insert(std::pair<storm::analysis::Lattice*, std::vector<std::shared_ptr<storm::expressions::BinaryRelationExpression>>>(&lattice, assumptions)); | ||||
|  | 
 | ||||
|  |     // Build matrix
 | ||||
|  |     auto builder = storm::storage::SparseMatrixBuilder<storm::RationalFunction>(numberOfStates, numberOfStates, 4); | ||||
|  |     std::shared_ptr<storm::RawPolynomialCache> cache = std::make_shared<storm::RawPolynomialCache>(); | ||||
|  |     carl::StringParser parser; | ||||
|  |     parser.setVariables({"p", "q"}); | ||||
|  |     auto func = storm::RationalFunction(storm::Polynomial(parser.template parseMultivariatePolynomial<storm::RationalFunctionCoefficient>("p"), cache)); | ||||
|  |     auto funcMin = storm::RationalFunction(storm::RationalFunction(1)-func); | ||||
|  |     builder.addNextValue(2, 1, func); | ||||
|  |     builder.addNextValue(2, 0, funcMin); | ||||
|  |     builder.addNextValue(3, 1, funcMin); | ||||
|  |     builder.addNextValue(3, 0, func); | ||||
|  |     auto matrix = builder.build(); | ||||
|  | 
 | ||||
|  |     auto result = checker.checkMonotonicity(map, matrix); | ||||
|  |     ASSERT_EQ(1, result.size()); | ||||
|  |     ASSERT_EQ(1, result.begin()->second.size()); | ||||
|  |     auto    entry1 = result.begin()->second.begin(); | ||||
|  |     ASSERT_EQ("p", entry1->first.name()); | ||||
|  |     EXPECT_FALSE(entry1->second.first); | ||||
|  |     EXPECT_FALSE(entry1->second.second); | ||||
|  | } | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue