|
@ -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,68 +69,67 @@ 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) { |
|
|
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 << "}" << "\n"; |
|
|
|
|
|
out << " Address: " << node << "\n"; |
|
|
|
|
|
out << " Above: {"; |
|
|
|
|
|
for (auto itr2 = node->above.begin(); itr2 != node->above.end(); ++itr2) { |
|
|
|
|
|
Node *above = *itr2; |
|
|
|
|
|
out << "{"; |
|
|
|
|
|
index = above->states.getNextSetIndex(0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (std::find(printedNodes.begin(), printedNodes.end(), (*itr)) == printedNodes.end()) { |
|
|
|
|
|
Node *node = *itr; |
|
|
|
|
|
printedNodes.push_back(*itr); |
|
|
|
|
|
out << "Node: {"; |
|
|
|
|
|
uint_fast64_t index = node->states.getNextSetIndex(0); |
|
|
while (index < numberOfStates) { |
|
|
while (index < numberOfStates) { |
|
|
out << index; |
|
|
out << index; |
|
|
index = above->states.getNextSetIndex(index+1); |
|
|
|
|
|
|
|
|
index = node->states.getNextSetIndex(index + 1); |
|
|
if (index < numberOfStates) { |
|
|
if (index < numberOfStates) { |
|
|
out << ", "; |
|
|
out << ", "; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
out << "}" << "\n"; |
|
|
|
|
|
out << " Address: " << node << "\n"; |
|
|
|
|
|
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 << "}" << "\n"; |
|
|
|
|
|
|
|
|
|
|
|
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 << "}"; |
|
|
|
|
|
if (itr2 + 1 != node->above.end()) { |
|
|
out << ", "; |
|
|
out << ", "; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
out << "}" << "\n"; |
|
|
|
|
|
|
|
|
|
|
|
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 << "}"; |
|
|
|
|
|
if (itr2 + 1 != node->below.end()) { |
|
|
|
|
|
out << ", "; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
out << "}" << "\n"; |
|
|
} |
|
|
} |
|
|
out << "}" << "\n"; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|