7 changed files with 615 additions and 3 deletions
			
			
		- 
					37src/storm-pars-cli/storm-pars.cpp
- 
					171src/storm-pars/analysis/Lattice.cpp
- 
					94src/storm-pars/analysis/Lattice.h
- 
					249src/storm-pars/analysis/Transformer.cpp
- 
					55src/storm-pars/analysis/Transformer.h
- 
					4src/storm-pars/settings/modules/ParametricSettings.cpp
- 
					2src/storm-pars/settings/modules/ParametricSettings.h
| @ -0,0 +1,171 @@ | |||
| //
 | |||
| // Created by Jip Spel on 24.07.18.
 | |||
| //
 | |||
| 
 | |||
| #include <iostream>
 | |||
| #include "Lattice.h"
 | |||
| namespace storm { | |||
|     namespace analysis { | |||
|         Lattice::Lattice(Node *topNode, Node *bottomNode, uint_fast64_t numberOfStates) { | |||
|             Node *top = new Node(); | |||
|             top->states = topNode->states; | |||
|             Node *bottom = new Node(); | |||
|             bottom->states = bottomNode->states; | |||
|             top->below.push_back(bottom); | |||
|             bottom->above.push_back(top); | |||
|             nodes = std::vector<Node *>({top, bottom}); | |||
| //            addedStates.insert(addedStates.end(), top->states.begin(), top->states.end());
 | |||
| //            addedStates.insert(addedStates.end(), bottom->states.begin(), bottom->states.end());
 | |||
|             this->numberOfStates = numberOfStates; | |||
|         } | |||
| 
 | |||
|         void Lattice::addBetween(uint_fast64_t state, Node *above, Node *below) { | |||
|             Node *newNode = new Node(); | |||
|             newNode->states = storm::storage::BitVector(numberOfStates); | |||
|             newNode->states.set(state); | |||
|             newNode->above = std::vector<Node *>({above}); | |||
|             newNode->below = std::vector<Node *>({below}); | |||
|             remove(&(below->above), above); | |||
|             remove(&(above->below), below); | |||
|             (below->above).push_back(newNode); | |||
|             above->below.push_back(newNode); | |||
|             nodes.push_back(newNode); | |||
| //            addedStates.push_back(state);
 | |||
|         } | |||
| 
 | |||
|         void Lattice::addToNode(uint_fast64_t state, Node *node) { | |||
|             node->states.set(state); | |||
| //            addedStates.push_back(state);
 | |||
|         } | |||
| 
 | |||
|         int Lattice::compare(uint_fast64_t state1, uint_fast64_t state2) { | |||
|             Node *node1 = getNode(state1); | |||
|             Node *node2 = getNode(state2); | |||
| 
 | |||
|             if (node1 == node2) { | |||
|                 return 0; | |||
|             } | |||
| 
 | |||
|             if (above(node1, node2)) { | |||
|                 return 1; | |||
|             } | |||
| 
 | |||
|             if (below(node1, node2)) { | |||
|                 return 2; | |||
|             } | |||
| 
 | |||
|             return -1; | |||
|         } | |||
| 
 | |||
|         Lattice::Node *Lattice::getNode(uint_fast64_t stateNumber) { | |||
|             Node *node; | |||
|             for (auto itr = nodes.begin(); itr != nodes.end(); ++itr) { | |||
|                 storm::storage::BitVector states = (*itr)->states; | |||
| 
 | |||
|                 if (states[stateNumber]) return (*itr); | |||
|             } | |||
|             return node; | |||
|         } | |||
| 
 | |||
|         void Lattice::toString(std::ostream &out) { | |||
|             for (auto itr = nodes.begin(); itr != nodes.end(); ++itr) { | |||
|                 Node *node = *itr; | |||
|                 out << "Node: {"; | |||
|                 uint_fast64_t index = node->states.getNextSetIndex(0); | |||
|                 while (index < numberOfStates) { | |||
|                     out << index; | |||
|                     index = node->states.getNextSetIndex(index+1); | |||
|                     if (index < numberOfStates) { | |||
|                         out << ", "; | |||
|                     } | |||
|                 } | |||
|                 out << "}" << std::endl; | |||
|                 out << "  Address: " << node << std::endl; | |||
|                 out << "    Above: {"; | |||
|                 for (auto itr2 = node->above.begin(); itr2 != node->above.end(); ++itr2) { | |||
|                     Node *above = *itr2; | |||
|                     out << "{"; | |||
|                     index = above->states.getNextSetIndex(0); | |||
|                     while (index < numberOfStates) { | |||
|                         out << index; | |||
|                         index = above->states.getNextSetIndex(index+1); | |||
|                         if (index < numberOfStates) { | |||
|                             out << ", "; | |||
|                         } | |||
|                     } | |||
| 
 | |||
|                     out << "}"; | |||
|                     if (itr2 + 1 != node->above.end()) { | |||
|                         out << ", "; | |||
|                     } | |||
|                 } | |||
|                 out << "}" << std::endl; | |||
| 
 | |||
|                 out << "    Below: {"; | |||
|                 for (auto itr2 = node->below.begin(); itr2 != node->below.end(); ++itr2) { | |||
|                     Node *below = *itr2; | |||
|                     out << "{"; | |||
|                     index = below->states.getNextSetIndex(0); | |||
|                     while (index < numberOfStates) { | |||
|                         out << index; | |||
|                         index = below->states.getNextSetIndex(index+1); | |||
|                         if (index < numberOfStates) { | |||
|                             out << ", "; | |||
|                         } | |||
|                     } | |||
| 
 | |||
|                     out << "}"; | |||
|                     if (itr2 + 1 != node->below.end()) { | |||
|                         out << ", "; | |||
|                     } | |||
|                 } | |||
|                 out << "}" << std::endl; | |||
|             } | |||
|         } | |||
| 
 | |||
|         bool Lattice::above(Node *node1, Node *node2) { | |||
|             if (node1->below.empty()) { | |||
|                 return false; | |||
|             } | |||
| 
 | |||
|             if (std::find(node1->below.begin(), node1->below.end(), node2) != node1->below.end()) { | |||
|                 return true; | |||
|             } | |||
| 
 | |||
|             bool result = false; | |||
|             for (auto itr = node1->below.begin(); node1->below.end() != itr; ++itr) { | |||
|                 result |= above(*itr, node2); | |||
|             } | |||
|             return result; | |||
|         } | |||
| 
 | |||
|         bool Lattice::below(Node *node1, Node *node2) { | |||
|             if (node1->above.empty()) { | |||
|                 return false; | |||
|             } | |||
| 
 | |||
|             if (std::find(node1->above.begin(), node1->above.end(), node2) != node1->above.end()) { | |||
|                 return true; | |||
|             } | |||
| 
 | |||
|             bool result = false; | |||
|             for (auto itr = node1->above.begin(); node1->above.end() != itr; ++itr) { | |||
|                 result |= below(*itr, node2); | |||
|             } | |||
|             return result; | |||
|         } | |||
| 
 | |||
|         void Lattice::remove(std::vector<Node *> *nodes, Node *node) { | |||
|             auto index = std::find(nodes->begin(), nodes->end(), node); | |||
|             if (index != nodes->end()) { | |||
|                 nodes->erase(index); | |||
|             } | |||
|         }; | |||
| 
 | |||
|         void Lattice::setStates(std::vector<uint_fast64_t> states, Node *node) { | |||
|             for (auto itr = states.begin(); itr < states.end(); ++itr) { | |||
|                 node->states.set(*itr); | |||
|             } | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,94 @@ | |||
| // | |||
| // Created by Jip Spel on 24.07.18. | |||
| // | |||
| 
 | |||
| #ifndef LATTICE_LATTICE_H | |||
| #define LATTICE_LATTICE_H | |||
| 
 | |||
| #include <iostream> | |||
| #include <vector> | |||
| 
 | |||
| #include "storm/storage/BitVector.h" | |||
| 
 | |||
| namespace storm { | |||
|             namespace analysis { | |||
|                 class Lattice { | |||
| 
 | |||
|                 public: | |||
|                     struct Node { | |||
|                         storm::storage::BitVector states; | |||
|                         std::vector<Node *> above; | |||
|                         std::vector<Node *> below; | |||
|                     }; | |||
| 
 | |||
|                     /*! | |||
|                      * Constructs a lattice with the given top node and bottom node. | |||
|                      * | |||
|                      * @param topNode The top node of the resulting lattice. | |||
|                      * @param bottomNode The bottom node of the resulting lattice. | |||
|                      */ | |||
|                     Lattice(Node *topNode, Node *bottomNode, uint_fast64_t numberOfStates); | |||
| 
 | |||
|                     /*! | |||
|                      * Adds a node with the given state below node1 and above node2. | |||
|                      * @param state The given state. | |||
|                      * @param node1 The pointer to the node below which a new node is added. | |||
|                      * @param node2 The pointer to the node above which a new node is added. | |||
|                      */ | |||
|                     void addBetween(uint_fast64_t state, Node *node1, Node *node2); | |||
| 
 | |||
|                     /*! | |||
|                      * Adds state to the states of the given node. | |||
|                      * @param state The state which is added. | |||
|                      * @param node The pointer to the node to which state is added. | |||
|                      */ | |||
|                     void addToNode(uint_fast64_t state, Node *node); | |||
| 
 | |||
|                     /*! | |||
|                      * Compares the level of the nodes of the states. | |||
|                      * Behaviour unknown when one or more of the states doesnot occur at any Node in the Lattice. | |||
|                      * @param state1 The first state. | |||
|                      * @param state2 The second state. | |||
|                      * @return 0 if the nodes are on the same level; | |||
|                      * 1 if the node of the first state is closer to top then the node of the second state; | |||
|                      * 2 if the node of the second state is closer to top then the node of the first state; | |||
|                      * -1 if it is unclear from the structure of the lattice how the nodes relate. | |||
|                      */ | |||
|                     int compare(uint_fast64_t state1, uint_fast64_t state2); | |||
| 
 | |||
|                     /*! | |||
|                      * Retrieves the pointer to a Node at which the state occurs. | |||
|                      * Behaviour unknown when state does not exists at any Node in the Lattice. | |||
|                      * | |||
|                      * @param state The number of the state. | |||
|                      * | |||
|                      * @return The pointer to the node of the state. | |||
|                      */ | |||
|                     Node *getNode(uint_fast64_t state); | |||
| 
 | |||
|                     /*! | |||
|                      * Prints a string representation of the lattice to std::cout. | |||
|                      * | |||
|                      * @param out The stream to output to. | |||
|                      */ | |||
|                     void toString(std::ostream &out); | |||
| 
 | |||
| //                    std::vector<uint_fast64_t> addedStates; | |||
| 
 | |||
|                 private: | |||
|                     std::vector<Node *> nodes; | |||
| 
 | |||
|                     uint_fast64_t numberOfStates; | |||
| 
 | |||
|                     bool above(Node *, Node *); | |||
| 
 | |||
|                     bool below(Node *, Node *); | |||
| 
 | |||
|                     void remove(std::vector<Node *> *nodes, Node *node); | |||
| 
 | |||
|                     void setStates(std::vector<uint_fast64_t>  states, Node *node); | |||
| 
 | |||
|                 }; | |||
|             } | |||
| } | |||
| #endif //LATTICE_LATTICE_H | |||
| @ -0,0 +1,249 @@ | |||
| //
 | |||
| // Created by Jip Spel on 26.07.18.
 | |||
| //
 | |||
| 
 | |||
| #include "Transformer.h"
 | |||
| namespace storm { | |||
|     namespace analysis { | |||
|         Lattice *Transformer::toLattice(storm::storage::SparseMatrix<storm::RationalFunction> matrix, | |||
|                                         storm::storage::BitVector const &initialStates, | |||
|                                         storm::storage::BitVector topStates, | |||
|                                         storm::storage::BitVector bottomStates, uint_fast64_t numberOfStates) { | |||
|             // Transform the transition matrix into a vector containing the states with the state to which the transition goes.
 | |||
|             std::vector<State*> stateVector = toStateVector(matrix, initialStates); | |||
| 
 | |||
|             // Start creating the Lattice.
 | |||
|             Lattice::Node top = {topStates}; | |||
|             Lattice::Node bottom = {bottomStates}; | |||
|             Lattice *lattice = new Lattice(&top, &bottom, numberOfStates); | |||
|             storm::storage::BitVector oldStates(numberOfStates); | |||
|             // Create a copy of the states already present in the lattice.
 | |||
|             storm::storage::BitVector seenStates = topStates|=bottomStates; | |||
| 
 | |||
|             matrix.printAsMatlabMatrix(std::cout); | |||
| 
 | |||
|             while (oldStates != seenStates) { | |||
|                 // As long as new states are discovered, continue.
 | |||
|                 oldStates = storm::storage::BitVector(seenStates); | |||
| 
 | |||
|                 for (auto itr = stateVector.begin(); itr != stateVector.end(); ++itr) { | |||
|                     // Iterate over all states
 | |||
|                     State *currentState = *itr; | |||
| 
 | |||
|                     if (!seenStates[currentState->stateNumber] | |||
|                         && seenStates[currentState->successor1] | |||
|                         && seenStates[currentState->successor2]) { | |||
| 
 | |||
|                         // Check if the current state number has not been added, but its successors have been added.
 | |||
|                         if (currentState->successor1 == currentState->successor2) { | |||
|                             // If there is only one successor, the state should be added to the same Node as its successor
 | |||
|                             lattice->addToNode(currentState->stateNumber, lattice->getNode(currentState->successor1)); | |||
|                             // Add stateNumber to the set with seen states.
 | |||
|                             seenStates.set(currentState->stateNumber); | |||
|                         } else { | |||
|                             // Otherwise, check how the two states compare, and add if the comparison is possible.
 | |||
|                             uint_fast64_t successor1 = currentState->successor1; | |||
|                             uint_fast64_t successor2 = currentState->successor2; | |||
|                             int compareResult = lattice->compare(successor1, successor2); | |||
|                             if (compareResult == 1) { | |||
|                                 //TODO dit in een aparte methode doen
 | |||
|                                 Lattice::Node *above = lattice->getNode(successor1); | |||
|                                 Lattice::Node *below = lattice->getNode(successor2); | |||
|                                 std::vector<Lattice::Node *> states1 = above->below; | |||
|                                 std::vector<Lattice::Node *> states2 = below->above; | |||
|                                 bool added = false; | |||
|                                 for (auto itr1 = states1.begin(); itr1 < states1.end(); ++itr1) { | |||
|                                     for (auto itr2 = states2.begin(); itr2 < states2.end(); ++itr2) { | |||
|                                         if ((*itr1)->states == (*itr2)->states) { | |||
|                                             storm::RationalFunction prob1 = getProbability(currentState->stateNumber, successor1, matrix); | |||
|                                             storm::RationalFunction prob2 = getProbability(currentState->stateNumber, successor2, matrix); | |||
|                                             if (prob1 != storm::RationalFunction(1) | |||
|                                                 && prob2 != storm::RationalFunction(1) | |||
|                                                 && getProbability((*itr1)->states, above->states, matrix) == prob1 | |||
|                                                 && getProbability((*itr1)->states, below->states, matrix) == prob2) { | |||
| 
 | |||
|                                                 std::cout << "Van: " << currentState-> stateNumber << " naar: " << successor1 << std::endl; | |||
|                                                 std::cout << prob1 << std::endl; | |||
|                                                 std::cout << "Van: " << currentState-> stateNumber << " naar: " << successor2 << std::endl; | |||
|                                                 std::cout << prob2 << std::endl; | |||
| 
 | |||
|                                                 lattice->addToNode(currentState->stateNumber, (*itr1)); | |||
|                                                 seenStates.set(currentState->stateNumber); | |||
|                                                 added = true; | |||
|                                             } | |||
|                                         } | |||
| 
 | |||
|                                     } | |||
|                                 } | |||
| 
 | |||
|                                 if (!added) { | |||
|                                     // successor 1 is closer to top than successor 2
 | |||
|                                     lattice->addBetween(currentState->stateNumber, lattice->getNode(successor1), | |||
|                                                         lattice->getNode(successor2)); | |||
|                                     // Add stateNumber to the set with seen states.
 | |||
|                                     seenStates.set(currentState->stateNumber); | |||
|                                 } | |||
|                             } else if (compareResult == 2) { | |||
|                                 //TODO dit in een aparte methode doen
 | |||
|                                 // als er in de below van successor 2 en de above van succesor 1 een overlap is met een state, dan moet je kijken naar de kans
 | |||
|                                 Lattice::Node *above = lattice->getNode(successor2); | |||
|                                 Lattice::Node *below = lattice->getNode(successor1); | |||
|                                 std::vector<Lattice::Node *> states1 = above->below; | |||
|                                 std::vector<Lattice::Node *> states2 = below->above; | |||
|                                 bool added = false; | |||
|                                 for (auto itr1 = states1.begin(); itr1 < states1.end(); ++itr1) { | |||
|                                     for (auto itr2 = states2.begin(); itr2 < states2.end(); ++itr2) { | |||
|                                         if ((*itr1)->states == (*itr2)->states) { | |||
|                                             storm::RationalFunction prob1 = getProbability(currentState->stateNumber, successor2, matrix); | |||
|                                             storm::RationalFunction prob2 = getProbability(currentState->stateNumber, successor1, matrix); | |||
|                                             if (prob1 != storm::RationalFunction(1) | |||
|                                                 && prob2 != storm::RationalFunction(1) | |||
|                                                 && getProbability((*itr1)->states, above->states, matrix) == prob1 | |||
|                                                 && getProbability((*itr1)->states, below->states, matrix) == prob2) { | |||
| 
 | |||
|                                                 std::cout << "Van: " << currentState-> stateNumber << " naar: " << successor2 << std::endl; | |||
|                                                 std::cout << prob1 << std::endl; | |||
|                                                 std::cout << "Van: " << currentState-> stateNumber << " naar: " << successor1 << std::endl; | |||
|                                                 std::cout << prob2 << std::endl; | |||
| 
 | |||
|                                                 lattice->addToNode(currentState->stateNumber, (*itr1)); | |||
|                                                 seenStates.set(currentState->stateNumber); | |||
|                                                 added = true; | |||
|                                             } | |||
|                                         } | |||
|                                     } | |||
|                                 } | |||
| 
 | |||
|                                 if (!added) { | |||
|                                     // successor 2 is closer to top than successor 1
 | |||
|                                     lattice->addBetween(currentState->stateNumber, lattice->getNode(successor2), | |||
|                                                         lattice->getNode(successor1)); | |||
|                                     // Add stateNumber to the set with seen states.
 | |||
|                                     seenStates.set(currentState->stateNumber); | |||
|                                 } | |||
| 
 | |||
| 
 | |||
| 
 | |||
| 
 | |||
|                             } else if (compareResult == 0) { | |||
|                                 // the successors are at the same level
 | |||
|                                 lattice->addToNode(currentState->stateNumber, lattice->getNode(successor1)); | |||
|                                 // Add stateNumber to the set with seen states.
 | |||
|                                 seenStates.set(currentState->stateNumber); | |||
|                             } else { | |||
|                                 // TODO: what to do?
 | |||
|                                 STORM_LOG_DEBUG("Failed to add" << currentState->stateNumber << "\n"); | |||
|                             } | |||
| 
 | |||
|                         } | |||
|                     } | |||
|                 } | |||
| 
 | |||
|             } | |||
| 
 | |||
|             return lattice; | |||
|         } | |||
| 
 | |||
|         std::vector<Transformer::State *> | |||
|         Transformer::toStateVector(storm::storage::SparseMatrix<storm::RationalFunction> transitionMatrix, | |||
|                                    storm::storage::BitVector const &initialStates) { | |||
|             std::vector < State *> states = std::vector<State *>({}); | |||
|             std::vector <uint_fast64_t> stack(initialStates.begin(), initialStates.end()); | |||
|             std::vector <uint_fast64_t> seenStates(initialStates.begin(), initialStates.end()); | |||
|             uint_fast64_t currentState; | |||
| 
 | |||
|             while (!stack.empty()) { | |||
|                 currentState = stack.back(); | |||
|                 stack.pop_back(); | |||
|                 std::vector <uint_fast64_t> successorStates(0, 2); | |||
| 
 | |||
|                 // Assume there are at most 2 successors
 | |||
|                 for (auto const &successor : transitionMatrix.getRowGroup(currentState)) { | |||
|                     if (!storm::utility::isZero(successor.getValue())) { | |||
|                         // Only explore the state if the transition was actually there.
 | |||
|                         uint_fast64_t successorNumber = successor.getColumn(); | |||
|                         if (std::find(seenStates.begin(), seenStates.end(), successorNumber) == seenStates.end()) { | |||
|                             stack.push_back(successorNumber); | |||
|                             seenStates.push_back(successorNumber); | |||
|                         } | |||
|                         successorStates.push_back(successorNumber); | |||
|                     } | |||
|                 } | |||
| 
 | |||
|                 State *state = new State(); | |||
|                 state->stateNumber = currentState; | |||
|                 state->successor1 = successorStates.back(); | |||
|                 successorStates.pop_back(); | |||
|                 if (!successorStates.empty()) { | |||
|                     state->successor2 = successorStates.back(); | |||
|                     successorStates.pop_back(); | |||
|                 } else { | |||
|                     state->successor2 = state->successor1; | |||
|                 } | |||
|                 states.push_back(state); | |||
|             } | |||
|             return states; | |||
|         } | |||
| 
 | |||
|         void Transformer::print(storm::storage::BitVector vector, std::string message) { | |||
|             uint_fast64_t index = vector.getNextSetIndex(0); | |||
|             std::cout << message <<": {"; | |||
|             while (index < vector.size()) { | |||
|                 std::cout << index; | |||
|                 index = vector.getNextSetIndex(index+1); | |||
|                 if (index < vector.size()) { | |||
|                     std::cout << ", "; | |||
|                 } | |||
|             } | |||
|             std::cout << "}" << std::endl; | |||
|         } | |||
| 
 | |||
|         std::vector<uint_fast64_t> Transformer::getNumbers(storm::storage::BitVector vector) { | |||
|             std::vector<uint_fast64_t> result = std::vector<uint_fast64_t>({}); | |||
|             uint_fast64_t index = vector.getNextSetIndex(0); | |||
|             while (index < vector.size()) { | |||
|                 result.push_back(index); | |||
|                 index = vector.getNextSetIndex(index+1); | |||
| 
 | |||
|             } | |||
|             return result; | |||
|         } | |||
| 
 | |||
|         storm::RationalFunction Transformer::getProbability(storm::storage::BitVector state, storm::storage::BitVector successor, storm::storage::SparseMatrix<storm::RationalFunction>  matrix) { | |||
|             std::vector<uint_fast64_t> successorNumbers = getNumbers(successor); | |||
|             storm::RationalFunction result = storm::RationalFunction(1); | |||
|             for (auto itr = successorNumbers.begin(); itr < successorNumbers.end() && result == storm::RationalFunction(1); ++itr) { | |||
|                 result = getProbability(state, (*itr), matrix); | |||
|             } | |||
|             return result; | |||
|         } | |||
| 
 | |||
|         storm::RationalFunction Transformer::getProbability(storm::storage::BitVector state, uint_fast64_t successor, storm::storage::SparseMatrix<storm::RationalFunction>  matrix) { | |||
|             std::vector<uint_fast64_t> stateNumbers = getNumbers(state); | |||
|             storm::RationalFunction result = storm::RationalFunction(1); | |||
|             for (auto itr = stateNumbers.begin(); itr < stateNumbers.end() && result == storm::RationalFunction(1); ++itr) { | |||
|                 result = getProbability((*itr), successor, matrix); | |||
|             } | |||
|             return result; | |||
|         } | |||
| 
 | |||
|         storm::RationalFunction Transformer::getProbability(uint_fast64_t state, uint_fast64_t successor, storm::storage::SparseMatrix<storm::RationalFunction>  matrix) { | |||
|             storm::RationalFunction result = storm::RationalFunction(1); | |||
|             // Iterate over all row groups.
 | |||
|             auto row = matrix.getRow(state); | |||
| 
 | |||
|             for (auto itr = row.begin(); itr < row.end() && result == storm::RationalFunction(1); ++itr) { | |||
|                 if ((*itr).getColumn() == successor) { | |||
|                     std::cout << "Tralala" << std::endl; | |||
|                     // TODO: nog checken dat ie wel met state te doen heeft
 | |||
|                     result = (*itr).getValue(); | |||
|                     std::cout << "Van: " << state << " naar: " << successor << std::endl; | |||
|                     std::cout << result << std::endl; | |||
|                 } | |||
| 
 | |||
|             } | |||
| 
 | |||
|             return result; | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,55 @@ | |||
| // | |||
| // Created by Jip Spel on 26.07.18. | |||
| // | |||
| 
 | |||
| #ifndef LATTICE_BUILDER_H | |||
| #define LATTICE_BUILDER_H | |||
| 
 | |||
| #include "storm/storage/BitVector.h" | |||
| #include "storm/storage/SparseMatrix.h" | |||
| #include "Lattice.h" | |||
| namespace storm { | |||
|     namespace analysis { | |||
|         class Transformer { | |||
|         public: | |||
|             struct State { | |||
|                 uint_fast64_t stateNumber; | |||
|                 uint_fast64_t successor1; | |||
|                 uint_fast64_t successor2; | |||
|             }; | |||
| 
 | |||
|             /*! | |||
|              * Returns the pointer to the Lattice constructed from the given transitionMatrix, | |||
|              * BitVector of initialStates, vector with the top states and vector with the bottom states. | |||
|              * Assumes that every state has at least one and at most two outgoing transitions. | |||
|              * | |||
|              * @param matrix The transition matrix. | |||
|              * @param initialStates The BitVector containing the initialStates. | |||
|              * @param topStates Vector containing the numbers of the top states. | |||
|              * @param bottomStates Vector containing the numbers of the bottom states. | |||
|              * | |||
|              * @return The lattice ordering of the states. | |||
|              */ | |||
|             static Lattice *toLattice(storm::storage::SparseMatrix<storm::RationalFunction> matrix, | |||
|                                       storm::storage::BitVector const &initialStates, | |||
|                                       storm::storage::BitVector topStates, | |||
|                                       storm::storage::BitVector bottomStates, uint_fast64_t numberOfStates); | |||
| 
 | |||
|         private: | |||
|             static std::vector<Transformer::State *> | |||
|             toStateVector(storm::storage::SparseMatrix<storm::RationalFunction> transitionMatrix, | |||
|                           storm::storage::BitVector const &initialStates); | |||
| 
 | |||
|             static void print(storm::storage::BitVector vector, std::string message); | |||
| 
 | |||
|             static std::vector<uint_fast64_t> getNumbers(storm::storage::BitVector vector); | |||
| 
 | |||
|             static storm::RationalFunction getProbability(storm::storage::BitVector state, storm::storage::BitVector successor, storm::storage::SparseMatrix<storm::RationalFunction> matrix); | |||
| 
 | |||
|             static storm::RationalFunction getProbability(storm::storage::BitVector state, uint_fast64_t successor, storm::storage::SparseMatrix<storm::RationalFunction> matrix); | |||
| 
 | |||
|             static storm::RationalFunction getProbability(uint_fast64_t state, uint_fast64_t successor, storm::storage::SparseMatrix<storm::RationalFunction> matrix); | |||
|             }; | |||
|     } | |||
| } | |||
| #endif //LATTICE_BUILDER_H | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue