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