Jip Spel
6 years ago
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