16 changed files with 577 additions and 577 deletions
-
36src/storm-pars/analysis/AssumptionChecker.cpp
-
16src/storm-pars/analysis/AssumptionChecker.h
-
8src/storm-pars/analysis/AssumptionMaker.cpp
-
12src/storm-pars/analysis/AssumptionMaker.h
-
83src/storm-pars/analysis/LatticeExtender.h
-
100src/storm-pars/analysis/MonotonicityChecker.cpp
-
20src/storm-pars/analysis/MonotonicityChecker.h
-
70src/storm-pars/analysis/Order.cpp
-
74src/storm-pars/analysis/Order.h
-
212src/storm-pars/analysis/OrderExtender.cpp
-
83src/storm-pars/analysis/OrderExtender.h
-
50src/test/storm-pars/analysis/AssumptionCheckerTest.cpp
-
20src/test/storm-pars/analysis/AssumptionMakerTest.cpp
-
170src/test/storm-pars/analysis/LatticeTest.cpp
-
30src/test/storm-pars/analysis/OrderExtenderTest.cpp
-
170src/test/storm-pars/analysis/OrderTest.cpp
@ -1,83 +0,0 @@ |
|||||
#ifndef STORM_LATTICEEXTENDER_H |
|
||||
#define STORM_LATTICEEXTENDER_H |
|
||||
|
|
||||
#include <storm/logic/Formula.h> |
|
||||
#include "storm/models/sparse/Dtmc.h" |
|
||||
#include "storm-pars/analysis/Lattice.h" |
|
||||
#include "storm/api/storm.h" |
|
||||
#include "storm-pars/storage/ParameterRegion.h" |
|
||||
#include "storm/storage/StronglyConnectedComponentDecomposition.h" |
|
||||
#include "storm/storage/StronglyConnectedComponent.h" |
|
||||
|
|
||||
|
|
||||
|
|
||||
namespace storm { |
|
||||
namespace analysis { |
|
||||
|
|
||||
|
|
||||
template<typename ValueType> |
|
||||
class LatticeExtender { |
|
||||
|
|
||||
public: |
|
||||
/*! |
|
||||
* Constructs LatticeExtender which can extend a lattice |
|
||||
* |
|
||||
* @param model The model for which the lattice should be extended. |
|
||||
*/ |
|
||||
LatticeExtender(std::shared_ptr<storm::models::sparse::Model<ValueType>> model); |
|
||||
|
|
||||
/*! |
|
||||
* Creates a lattice based on the given formula. |
|
||||
* |
|
||||
* @param formulas The formulas based on which the lattice is created, only the first is used. |
|
||||
* @return A triple with a pointer to the lattice and two states of which the current place in the lattice |
|
||||
* is unknown but needed. When the states have as number the number of states, no states are |
|
||||
* unplaced but needed. |
|
||||
*/ |
|
||||
std::tuple<storm::analysis::Lattice*, uint_fast64_t, uint_fast64_t> toLattice(std::vector<std::shared_ptr<storm::logic::Formula const>> formulas); |
|
||||
|
|
||||
/*! |
|
||||
* Creates a lattice based on the given extremal values. |
|
||||
* |
|
||||
* @return A triple with a pointer to the lattice and two states of which the current place in the lattice |
|
||||
* is unknown but needed. When the states have as number the number of states, no states are |
|
||||
* unplaced but needed. |
|
||||
*/ |
|
||||
std::tuple<storm::analysis::Lattice*, uint_fast64_t, uint_fast64_t> toLattice(std::vector<std::shared_ptr<storm::logic::Formula const>> formulas, std::vector<double> minValues, std::vector<double> maxValues); |
|
||||
|
|
||||
|
|
||||
/*! |
|
||||
* Extends the lattice based on the given assumption. |
|
||||
* |
|
||||
* @param lattice The lattice. |
|
||||
* @param assumption The assumption on states. |
|
||||
* @return A triple with a pointer to the lattice and two states of which the current place in the lattice |
|
||||
* is unknown but needed. When the states have as number the number of states, no states are |
|
||||
* unplaced but needed. |
|
||||
*/ |
|
||||
std::tuple<storm::analysis::Lattice*, uint_fast64_t, uint_fast64_t> extendLattice(storm::analysis::Lattice* lattice, std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption = nullptr); |
|
||||
|
|
||||
|
|
||||
private: |
|
||||
std::shared_ptr<storm::models::sparse::Model<ValueType>> model; |
|
||||
|
|
||||
std::map<uint_fast64_t, storm::storage::BitVector*> stateMap; |
|
||||
|
|
||||
bool acyclic; |
|
||||
|
|
||||
bool assumptionSeen; |
|
||||
|
|
||||
storm::storage::StronglyConnectedComponentDecomposition<ValueType> sccs; |
|
||||
|
|
||||
storm::storage::SparseMatrix<ValueType> matrix; |
|
||||
|
|
||||
void handleAssumption(Lattice* lattice, std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption); |
|
||||
|
|
||||
std::tuple<Lattice*, uint_fast64_t, uint_fast64_t> extendAllSuccAdded(Lattice* lattice, uint_fast64_t const & stateNumber, storm::storage::BitVector* successors); |
|
||||
|
|
||||
std::tuple<bool, uint_fast64_t, uint_fast64_t> allSuccAdded(Lattice* lattice, uint_fast64_t stateNumber); |
|
||||
}; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
#endif //STORM_LATTICEEXTENDER_H |
|
@ -0,0 +1,83 @@ |
|||||
|
#ifndef STORM_LATTICEEXTENDER_H |
||||
|
#define STORM_LATTICEEXTENDER_H |
||||
|
|
||||
|
#include <storm/logic/Formula.h> |
||||
|
#include "storm/models/sparse/Dtmc.h" |
||||
|
#include "storm-pars/analysis/Order.h" |
||||
|
#include "storm/api/storm.h" |
||||
|
#include "storm-pars/storage/ParameterRegion.h" |
||||
|
#include "storm/storage/StronglyConnectedComponentDecomposition.h" |
||||
|
#include "storm/storage/StronglyConnectedComponent.h" |
||||
|
|
||||
|
|
||||
|
|
||||
|
namespace storm { |
||||
|
namespace analysis { |
||||
|
|
||||
|
|
||||
|
template<typename ValueType> |
||||
|
class OrderExtender { |
||||
|
|
||||
|
public: |
||||
|
/*! |
||||
|
* Constructs OrderExtender which can extend an order |
||||
|
* |
||||
|
* @param model The model for which the order should be extended. |
||||
|
*/ |
||||
|
OrderExtender(std::shared_ptr<storm::models::sparse::Model<ValueType>> model); |
||||
|
|
||||
|
/*! |
||||
|
* Creates an order based on the given formula. |
||||
|
* |
||||
|
* @param formulas The formulas based on which the order is created, only the first is used. |
||||
|
* @return A triple with a pointer to the order and two states of which the current place in the order |
||||
|
* is unknown but needed. When the states have as number the number of states, no states are |
||||
|
* unplaced but needed. |
||||
|
*/ |
||||
|
std::tuple<storm::analysis::Order*, uint_fast64_t, uint_fast64_t> toOrder(std::vector<std::shared_ptr<storm::logic::Formula const>> formulas); |
||||
|
|
||||
|
/*! |
||||
|
* Creates an order based on the given extremal values. |
||||
|
* |
||||
|
* @return A triple with a pointer to the order and two states of which the current place in the order |
||||
|
* is unknown but needed. When the states have as number the number of states, no states are |
||||
|
* unplaced but needed. |
||||
|
*/ |
||||
|
std::tuple<storm::analysis::Order*, uint_fast64_t, uint_fast64_t> toOrder(std::vector<std::shared_ptr<storm::logic::Formula const>> formulas, std::vector<double> minValues, std::vector<double> maxValues); |
||||
|
|
||||
|
|
||||
|
/*! |
||||
|
* Extends the order based on the given assumption. |
||||
|
* |
||||
|
* @param order The order. |
||||
|
* @param assumption The assumption on states. |
||||
|
* @return A triple with a pointer to the order and two states of which the current place in the order |
||||
|
* is unknown but needed. When the states have as number the number of states, no states are |
||||
|
* unplaced but needed. |
||||
|
*/ |
||||
|
std::tuple<storm::analysis::Order*, uint_fast64_t, uint_fast64_t> extendOrder(storm::analysis::Order* order, std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption = nullptr); |
||||
|
|
||||
|
|
||||
|
private: |
||||
|
std::shared_ptr<storm::models::sparse::Model<ValueType>> model; |
||||
|
|
||||
|
std::map<uint_fast64_t, storm::storage::BitVector*> stateMap; |
||||
|
|
||||
|
bool acyclic; |
||||
|
|
||||
|
bool assumptionSeen; |
||||
|
|
||||
|
storm::storage::StronglyConnectedComponentDecomposition<ValueType> sccs; |
||||
|
|
||||
|
storm::storage::SparseMatrix<ValueType> matrix; |
||||
|
|
||||
|
void handleAssumption(Order* order, std::shared_ptr<storm::expressions::BinaryRelationExpression> assumption); |
||||
|
|
||||
|
std::tuple<Order*, uint_fast64_t, uint_fast64_t> extendAllSuccAdded(Order* order, uint_fast64_t const & stateNumber, storm::storage::BitVector* successors); |
||||
|
|
||||
|
std::tuple<bool, uint_fast64_t, uint_fast64_t> allSuccAdded(Order* order, uint_fast64_t stateNumber); |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
#endif //STORM_ORDEREXTENDER_H |
@ -1,170 +0,0 @@ |
|||||
#include "gtest/gtest.h"
|
|
||||
#include "storm-config.h"
|
|
||||
#include "test/storm_gtest.h"
|
|
||||
#include "storm-pars/analysis/Lattice.h"
|
|
||||
#include "storm/storage/BitVector.h"
|
|
||||
|
|
||||
TEST(LatticeTest, Simple) { |
|
||||
auto numberOfStates = 7; |
|
||||
auto above = storm::storage::BitVector(numberOfStates); |
|
||||
above.set(0); |
|
||||
auto below = storm::storage::BitVector(numberOfStates); |
|
||||
below.set(1); |
|
||||
auto initialMiddle = storm::storage::BitVector(numberOfStates); |
|
||||
|
|
||||
auto lattice = storm::analysis::Lattice(&above, &below, &initialMiddle, numberOfStates, nullptr); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,0)); |
|
||||
EXPECT_EQ(nullptr, lattice.getNode(2)); |
|
||||
|
|
||||
lattice.add(2); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(2,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(2,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,2)); |
|
||||
|
|
||||
lattice.add(3); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(2,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(3,2)); |
|
||||
|
|
||||
lattice.addToNode(4, lattice.getNode(2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::SAME, lattice.compare(2,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::SAME, lattice.compare(4,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(4,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(4,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(4,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(3,4)); |
|
||||
|
|
||||
lattice.addBetween(5, lattice.getNode(0), lattice.getNode(3)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(5,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(5,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(3,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(5,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(5,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(2,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(5,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(4,5)); |
|
||||
|
|
||||
lattice.addBetween(6, lattice.getNode(5), lattice.getNode(3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(6,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(6,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(6,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(2,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(6,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(3,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(6,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, lattice.compare(6,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(6,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(5,6)); |
|
||||
|
|
||||
lattice.addRelationNodes(lattice.getNode(6), lattice.getNode(4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(6,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(4,6)); |
|
||||
|
|
||||
} |
|
||||
|
|
||||
TEST(LatticeTest, copy_lattice) { |
|
||||
auto numberOfStates = 7; |
|
||||
auto above = storm::storage::BitVector(numberOfStates); |
|
||||
above.set(0); |
|
||||
auto below = storm::storage::BitVector(numberOfStates); |
|
||||
below.set(1); |
|
||||
auto initialMiddle = storm::storage::BitVector(numberOfStates); |
|
||||
|
|
||||
auto lattice = storm::analysis::Lattice(&above, &below, &initialMiddle, numberOfStates, nullptr); |
|
||||
lattice.add(2); |
|
||||
lattice.add(3); |
|
||||
lattice.addToNode(4, lattice.getNode(2)); |
|
||||
lattice.addBetween(5, lattice.getNode(0), lattice.getNode(3)); |
|
||||
lattice.addBetween(6, lattice.getNode(5), lattice.getNode(3)); |
|
||||
|
|
||||
|
|
||||
|
|
||||
auto latticeCopy = storm::analysis::Lattice(lattice); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(0,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(1,0)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(0,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(2,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(2,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(1,2)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(2,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(3,2)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::SAME, latticeCopy.compare(2,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::SAME, latticeCopy.compare(4,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(0,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(4,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(4,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(1,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(4,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(3,4)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(5,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(0,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(5,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(3,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(5,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(1,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(5,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(5,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(5,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::UNKNOWN, latticeCopy.compare(5,4)); |
|
||||
|
|
||||
lattice.addRelationNodes(lattice.getNode(6), lattice.getNode(4)); |
|
||||
latticeCopy = storm::analysis::Lattice(lattice); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(6,0)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(0,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(6,1)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(1,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(6,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(2,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(6,3)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(3,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(6,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(4,6)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, latticeCopy.compare(6,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, latticeCopy.compare(5,6)); |
|
||||
} |
|
||||
|
|
||||
TEST(LatticeTest, merge_nodes) { |
|
||||
auto numberOfStates = 7; |
|
||||
auto above = storm::storage::BitVector(numberOfStates); |
|
||||
above.set(0); |
|
||||
auto below = storm::storage::BitVector(numberOfStates); |
|
||||
below.set(1); |
|
||||
auto initialMiddle = storm::storage::BitVector(numberOfStates); |
|
||||
|
|
||||
auto lattice = storm::analysis::Lattice(&above, &below, &initialMiddle, numberOfStates, nullptr); |
|
||||
lattice.add(2); |
|
||||
lattice.add(3); |
|
||||
lattice.addToNode(4, lattice.getNode(2)); |
|
||||
lattice.addBetween(5, lattice.getNode(0), lattice.getNode(3)); |
|
||||
lattice.addBetween(6, lattice.getNode(5), lattice.getNode(3)); |
|
||||
|
|
||||
lattice.mergeNodes(lattice.getNode(4), lattice.getNode(5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::SAME, lattice.compare(2,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::SAME, lattice.compare(2,5)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::ABOVE, lattice.compare(0,4)); |
|
||||
|
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(6,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(6,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(6,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(3,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(3,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(3,5)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,2)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,4)); |
|
||||
EXPECT_EQ(storm::analysis::Lattice::NodeComparison::BELOW, lattice.compare(1,5)); |
|
||||
} |
|
@ -0,0 +1,170 @@ |
|||||
|
#include "gtest/gtest.h"
|
||||
|
#include "storm-config.h"
|
||||
|
#include "test/storm_gtest.h"
|
||||
|
#include "storm-pars/analysis/Order.h"
|
||||
|
#include "storm/storage/BitVector.h"
|
||||
|
|
||||
|
TEST(OrderTest, Simple) { |
||||
|
auto numberOfStates = 7; |
||||
|
auto above = storm::storage::BitVector(numberOfStates); |
||||
|
above.set(0); |
||||
|
auto below = storm::storage::BitVector(numberOfStates); |
||||
|
below.set(1); |
||||
|
auto initialMiddle = storm::storage::BitVector(numberOfStates); |
||||
|
|
||||
|
auto order = storm::analysis::Order(&above, &below, &initialMiddle, numberOfStates, nullptr); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,0)); |
||||
|
EXPECT_EQ(nullptr, order.getNode(2)); |
||||
|
|
||||
|
order.add(2); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(2,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(2,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,2)); |
||||
|
|
||||
|
order.add(3); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(2,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(3,2)); |
||||
|
|
||||
|
order.addToNode(4, order.getNode(2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::SAME, order.compare(2,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::SAME, order.compare(4,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(4,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(4,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(4,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(3,4)); |
||||
|
|
||||
|
order.addBetween(5, order.getNode(0), order.getNode(3)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(5,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(5,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(3,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(5,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(5,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(2,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(5,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(4,5)); |
||||
|
|
||||
|
order.addBetween(6, order.getNode(5), order.getNode(3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(6,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(6,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(6,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(2,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(6,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(3,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(6,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, order.compare(6,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(6,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(5,6)); |
||||
|
|
||||
|
order.addRelationNodes(order.getNode(6), order.getNode(4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(6,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(4,6)); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
TEST(OrderTest, copy_order) { |
||||
|
auto numberOfStates = 7; |
||||
|
auto above = storm::storage::BitVector(numberOfStates); |
||||
|
above.set(0); |
||||
|
auto below = storm::storage::BitVector(numberOfStates); |
||||
|
below.set(1); |
||||
|
auto initialMiddle = storm::storage::BitVector(numberOfStates); |
||||
|
|
||||
|
auto order = storm::analysis::Order(&above, &below, &initialMiddle, numberOfStates, nullptr); |
||||
|
order.add(2); |
||||
|
order.add(3); |
||||
|
order.addToNode(4, order.getNode(2)); |
||||
|
order.addBetween(5, order.getNode(0), order.getNode(3)); |
||||
|
order.addBetween(6, order.getNode(5), order.getNode(3)); |
||||
|
|
||||
|
|
||||
|
|
||||
|
auto orderCopy = storm::analysis::Order(order); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(0,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(1,0)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(0,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(2,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(2,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(1,2)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(2,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(3,2)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::SAME, orderCopy.compare(2,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::SAME, orderCopy.compare(4,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(0,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(4,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(4,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(1,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(4,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(3,4)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(5,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(0,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(5,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(3,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(5,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(1,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(5,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(5,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(5,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::UNKNOWN, orderCopy.compare(5,4)); |
||||
|
|
||||
|
order.addRelationNodes(order.getNode(6), order.getNode(4)); |
||||
|
orderCopy = storm::analysis::Order(order); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(6,0)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(0,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(6,1)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(1,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(6,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(2,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(6,3)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(3,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(6,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(4,6)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, orderCopy.compare(6,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, orderCopy.compare(5,6)); |
||||
|
} |
||||
|
|
||||
|
TEST(OrderTest, merge_nodes) { |
||||
|
auto numberOfStates = 7; |
||||
|
auto above = storm::storage::BitVector(numberOfStates); |
||||
|
above.set(0); |
||||
|
auto below = storm::storage::BitVector(numberOfStates); |
||||
|
below.set(1); |
||||
|
auto initialMiddle = storm::storage::BitVector(numberOfStates); |
||||
|
|
||||
|
auto order = storm::analysis::Order(&above, &below, &initialMiddle, numberOfStates, nullptr); |
||||
|
order.add(2); |
||||
|
order.add(3); |
||||
|
order.addToNode(4, order.getNode(2)); |
||||
|
order.addBetween(5, order.getNode(0), order.getNode(3)); |
||||
|
order.addBetween(6, order.getNode(5), order.getNode(3)); |
||||
|
|
||||
|
order.mergeNodes(order.getNode(4), order.getNode(5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::SAME, order.compare(2,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::SAME, order.compare(2,5)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::ABOVE, order.compare(0,4)); |
||||
|
|
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(6,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(6,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(6,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(3,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(3,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(3,5)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,2)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,4)); |
||||
|
EXPECT_EQ(storm::analysis::Order::NodeComparison::BELOW, order.compare(1,5)); |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue