| 
					
					
						
							
						
					
					
				 | 
				@ -29,6 +29,53 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            this->addedStates.operator|=(bottomStates); | 
				 | 
				 | 
				            this->addedStates.operator|=(bottomStates); | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        Lattice::Lattice(Lattice* lattice) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            top = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            top->states = storm::storage::BitVector(lattice->getTop()->states); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            bottom = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            bottom->states = storm::storage::BitVector(lattice->getBottom()->states); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            numberOfStates = top->states.size(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            nodes = std::vector<Node *>(numberOfStates); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            addedStates = storm::storage::BitVector(numberOfStates); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            addedStates.operator|=(top->states); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            addedStates.operator|=(bottom->states); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto i = top->states.getNextSetIndex(0); i < numberOfStates; i = top->states.getNextSetIndex(i+1)) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                nodes.at(i) = top; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto i =  bottom->states.getNextSetIndex(0); i < numberOfStates; i =  bottom->states.getNextSetIndex(i+1)) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                nodes.at(i) = bottom; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            // Create all nodes
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto itr = lattice->getNodes().begin(); itr != lattice->getNodes().end(); ++itr) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                Node* oldNode = (*itr); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                if (oldNode != nullptr) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    Node *newNode = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    newNode->states = storm::storage::BitVector(oldNode->states); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    for (auto i = newNode->states.getNextSetIndex(0); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                         i < numberOfStates; i = newNode->states.getNextSetIndex(i + 1)) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        addedStates.set(i); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        nodes.at(i) = newNode; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            // Create transitions
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto itr = lattice->getNodes().begin(); itr != lattice->getNodes().end(); ++itr) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                Node* oldNode = (*itr); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                if (oldNode != nullptr) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    auto state = (*itr)->states.getNextSetIndex(0); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    for (auto itr2 = (*itr)->below.begin(); itr2 != (*itr)->below.end(); ++itr2) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        auto stateBelow = (*itr2)->states.getNextSetIndex(0); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        addRelationNodes(getNode((state)), getNode((stateBelow))); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        void Lattice::addBetween(uint_fast64_t state, Node *above, Node *below) { | 
				 | 
				 | 
				        void Lattice::addBetween(uint_fast64_t state, Node *above, Node *below) { | 
			
		
		
	
		
			
				 | 
				 | 
				            Node *newNode = new Node(); | 
				 | 
				 | 
				            Node *newNode = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				            newNode->states = storm::storage::BitVector(numberOfStates); | 
				 | 
				 | 
				            newNode->states = storm::storage::BitVector(numberOfStates); | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -102,6 +149,11 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            return bottom; | 
				 | 
				 | 
				            return bottom; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        std::vector<Lattice::Node*> Lattice::getNodes() { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            return nodes; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        storm::storage::BitVector Lattice::getAddedStates() { | 
				 | 
				 | 
				        storm::storage::BitVector Lattice::getAddedStates() { | 
			
		
		
	
		
			
				 | 
				 | 
				            return addedStates; | 
				 | 
				 | 
				            return addedStates; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -203,44 +255,16 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				        out << "}" << std::endl; | 
				 | 
				 | 
				        out << "}" << std::endl; | 
			
		
		
	
		
			
				 | 
				 | 
				    } | 
				 | 
				 | 
				    } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        Lattice* Lattice::deepCopy() { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            Lattice* result = new Lattice(top->states, bottom->states, numberOfStates); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            // Create all nodes
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            for (auto itr = nodes.begin(); itr != nodes.end(); ++itr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                Node* oldNode = (*itr); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                if (oldNode != nullptr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    Node *newNode = new Node(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    newNode->states = storm::storage::BitVector(oldNode->states); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    for (auto i = newNode->states.getNextSetIndex(0); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                         i < numberOfStates; i = newNode->states.getNextSetIndex(i + 1)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        result->addedStates.set(i); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        result->nodes.at(i) = newNode; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				            // Create transitions
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            for (auto itr = nodes.begin(); itr != nodes.end(); ++itr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                if (*itr != nullptr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    auto state = (*itr)->states.getNextSetIndex(0); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    for (auto itr2 = (*itr)->below.begin(); itr2 != (*itr)->below.end(); ++itr2) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        auto stateBelow = (*itr2)->states.getNextSetIndex(0); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        result->addRelationNodes(result->getNode((state)), result->getNode((stateBelow))); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        bool Lattice::above(Node *node1, Node *node2, std::set<Node *>* seenNodes) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            bool result = !node1->below.empty() && std::find(node1->below.begin(), node1->below.end(), node2) != node1->below.end(); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto itr = node1->below.begin(); !result && node1->below.end() != itr; ++itr) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                if (std::find(seenNodes->begin(), seenNodes->end(), (*itr)) == seenNodes->end()) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    seenNodes->insert(*itr); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    result |= above(*itr, node2, seenNodes); | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				            return result; | 
				 | 
				 | 
				            return result; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        bool Lattice::above(Node *node1, Node *node2, std::set<Node *>* seenNodes) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        bool result = !node1->below.empty() && std::find(node1->below.begin(), node1->below.end(), node2) != node1->below.end(); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        for (auto itr = node1->below.begin(); !result && node1->below.end() != itr; ++itr) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            if (std::find(seenNodes->begin(), seenNodes->end(), (*itr)) == seenNodes->end()) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                seenNodes->insert(*itr); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                result |= above(*itr, node2, seenNodes); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				        return result; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				    } | 
				 | 
				 | 
				    } | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				} | 
			
		
		
	
		
			
				 | 
				 | 
				} | 
				 | 
				 | 
				 |