| 
					
					
						
							
						
					
					
				 | 
				@ -8,17 +8,28 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				    namespace analysis { | 
				 | 
				 | 
				    namespace analysis { | 
			
		
		
	
		
			
				 | 
				 | 
				        Lattice::Lattice(storm::storage::BitVector topStates, | 
				 | 
				 | 
				        Lattice::Lattice(storm::storage::BitVector topStates, | 
			
		
		
	
		
			
				 | 
				 | 
				                         storm::storage::BitVector bottomStates, uint_fast64_t numberOfStates) { | 
				 | 
				 | 
				                         storm::storage::BitVector bottomStates, uint_fast64_t numberOfStates) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				            Node *top = new Node(); | 
				 | 
				 | 
				            Node *top = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				            top->states = topStates; | 
				 | 
				 | 
				            top->states = topStates; | 
			
		
		
	
		
			
				 | 
				 | 
				            Node *bottom = new Node(); | 
				 | 
				 | 
				            Node *bottom = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				            bottom->states = bottomStates; | 
				 | 
				 | 
				            bottom->states = bottomStates; | 
			
		
		
	
		
			
				 | 
				 | 
				            top->below.push_back(bottom); | 
				 | 
				 | 
				            top->below.push_back(bottom); | 
			
		
		
	
		
			
				 | 
				 | 
				            bottom->above.push_back(top); | 
				 | 
				 | 
				            bottom->above.push_back(top); | 
			
		
		
	
		
			
				 | 
				 | 
				            nodes = std::vector<Node *>({top, bottom}); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            nodes = std::vector<Node *>(numberOfStates); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto i = topStates.getNextSetIndex(0); i < numberOfStates; i = topStates.getNextSetIndex(i+1)) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                nodes.at(i) = top; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            for (auto i = bottomStates.getNextSetIndex(0); i < numberOfStates; i = bottomStates.getNextSetIndex(i+1)) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                nodes.at(i) = bottom; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				            this->numberOfStates = numberOfStates; | 
				 | 
				 | 
				            this->numberOfStates = numberOfStates; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        void Lattice::addBetween(uint_fast64_t state, Node *above, Node *below) { | 
				 | 
				 | 
				        void Lattice::addBetween(uint_fast64_t state, Node *above, Node *below) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            std::cout << "Adding: " << state << std::endl; | 
			
		
		
	
		
			
				 | 
				 | 
				            Node *newNode = new Node(); | 
				 | 
				 | 
				            Node *newNode = new Node(); | 
			
		
		
	
		
			
				 | 
				 | 
				            newNode->states = storm::storage::BitVector(numberOfStates); | 
				 | 
				 | 
				            newNode->states = storm::storage::BitVector(numberOfStates); | 
			
		
		
	
		
			
				 | 
				 | 
				            newNode->states.set(state); | 
				 | 
				 | 
				            newNode->states.set(state); | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -28,11 +39,12 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				            remove(&(above->below), below); | 
				 | 
				 | 
				            remove(&(above->below), below); | 
			
		
		
	
		
			
				 | 
				 | 
				            (below->above).push_back(newNode); | 
				 | 
				 | 
				            (below->above).push_back(newNode); | 
			
		
		
	
		
			
				 | 
				 | 
				            above->below.push_back(newNode); | 
				 | 
				 | 
				            above->below.push_back(newNode); | 
			
		
		
	
		
			
				 | 
				 | 
				            nodes.push_back(newNode); | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            nodes.at(state) = newNode; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        void Lattice::addToNode(uint_fast64_t state, Node *node) { | 
				 | 
				 | 
				        void Lattice::addToNode(uint_fast64_t state, Node *node) { | 
			
		
		
	
		
			
				 | 
				 | 
				            node->states.set(state); | 
				 | 
				 | 
				            node->states.set(state); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            nodes.at(state) = node; | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        int Lattice::compare(uint_fast64_t state1, uint_fast64_t state2) { | 
				 | 
				 | 
				        int Lattice::compare(uint_fast64_t state1, uint_fast64_t state2) { | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -57,18 +69,16 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        Lattice::Node *Lattice::getNode(uint_fast64_t stateNumber) { | 
				 | 
				 | 
				        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; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            return nodes.at(stateNumber); | 
			
		
		
	
		
			
				 | 
				 | 
				        } | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        void Lattice::toString(std::ostream &out) { | 
				 | 
				 | 
				        void Lattice::toString(std::ostream &out) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            std::vector<Node*> printedNodes = std::vector<Node*>({}); | 
			
		
		
	
		
			
				 | 
				 | 
				            for (auto itr = nodes.begin(); itr != nodes.end(); ++itr) { | 
				 | 
				 | 
				            for (auto itr = nodes.begin(); itr != nodes.end(); ++itr) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                if (std::find(printedNodes.begin(), printedNodes.end(), (*itr)) == printedNodes.end()) { | 
			
		
		
	
		
			
				 | 
				 | 
				                    Node *node = *itr; | 
				 | 
				 | 
				                    Node *node = *itr; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    printedNodes.push_back(*itr); | 
			
		
		
	
		
			
				 | 
				 | 
				                    out << "Node: {"; | 
				 | 
				 | 
				                    out << "Node: {"; | 
			
		
		
	
		
			
				 | 
				 | 
				                    uint_fast64_t index = node->states.getNextSetIndex(0); | 
				 | 
				 | 
				                    uint_fast64_t index = node->states.getNextSetIndex(0); | 
			
		
		
	
		
			
				 | 
				 | 
				                    while (index < numberOfStates) { | 
				 | 
				 | 
				                    while (index < numberOfStates) { | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -121,6 +131,7 @@ namespace storm { | 
			
		
		
	
		
			
				 | 
				 | 
				                    out << "}" << "\n"; | 
				 | 
				 | 
				                    out << "}" << "\n"; | 
			
		
		
	
		
			
				 | 
				 | 
				                } | 
				 | 
				 | 
				                } | 
			
		
		
	
		
			
				 | 
				 | 
				            } | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				        bool Lattice::above(Node *node1, Node *node2) { | 
				 | 
				 | 
				        bool Lattice::above(Node *node1, Node *node2) { | 
			
		
		
	
		
			
				 | 
				 | 
				            bool result = !node1->below.empty() && std::find(node1->below.begin(), node1->below.end(), node2) != node1->below.end(); | 
				 | 
				 | 
				            bool result = !node1->below.empty() && std::find(node1->below.begin(), node1->below.end(), node2) != node1->below.end(); | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |