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