|
|
@ -29,17 +29,9 @@ namespace storm { |
|
|
|
|
|
|
|
top->statesAbove = storm::storage::BitVector(numberOfStates); |
|
|
|
setStatesBelow(top, bottomStates, false); |
|
|
|
assert(top->statesAbove.size() == numberOfStates); |
|
|
|
assert(top->statesBelow.size() == numberOfStates); |
|
|
|
assert(top->statesAbove.getNumberOfSetBits() == 0); |
|
|
|
assert(top->statesBelow.getNumberOfSetBits() == bottomStates.getNumberOfSetBits()); |
|
|
|
|
|
|
|
bottom->statesBelow = storm::storage::BitVector(numberOfStates); |
|
|
|
setStatesAbove(bottom, topStates, false); |
|
|
|
assert(bottom->statesAbove.size() == numberOfStates); |
|
|
|
assert(bottom->statesBelow.size() == numberOfStates); |
|
|
|
assert(bottom->statesBelow.getNumberOfSetBits() == 0); |
|
|
|
assert(bottom->statesAbove.getNumberOfSetBits() == topStates.getNumberOfSetBits()); |
|
|
|
|
|
|
|
this->numberOfStates = numberOfStates; |
|
|
|
this->addedStates = storm::storage::BitVector(numberOfStates); |
|
|
@ -71,6 +63,7 @@ namespace storm { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
assert(addedStates == lattice->getAddedStates()); |
|
|
|
|
|
|
|
// set all states above and below
|
|
|
@ -87,14 +80,6 @@ namespace storm { |
|
|
|
top->statesAbove = storm::storage::BitVector(numberOfStates); |
|
|
|
setStatesBelow(top, lattice->getTop()->statesBelow, false); |
|
|
|
} |
|
|
|
|
|
|
|
// To check if everything went well
|
|
|
|
if (oldNode!= nullptr) { |
|
|
|
Node *newNode = getNode(oldNode->states.getNextSetIndex(0)); |
|
|
|
assert((newNode->statesAbove & newNode->statesBelow).getNumberOfSetBits() == 0); |
|
|
|
assert(newNode->statesAbove == oldNode->statesAbove); |
|
|
|
assert(newNode->statesBelow == oldNode->statesBelow); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -119,14 +104,17 @@ namespace storm { |
|
|
|
for (auto i = above->statesAbove.getNextSetIndex(0); i < above->statesAbove.size(); i = above->statesAbove.getNextSetIndex(i + 1)) { |
|
|
|
setStatesBelow(getNode(i), state, true); |
|
|
|
} |
|
|
|
|
|
|
|
addedStates.set(state); |
|
|
|
} |
|
|
|
|
|
|
|
void Lattice::addToNode(uint_fast64_t state, Node *node) { |
|
|
|
assert(!addedStates[state]); |
|
|
|
|
|
|
|
node->states.set(state); |
|
|
|
nodes.at(state) = node; |
|
|
|
addedStates.set(state); |
|
|
|
|
|
|
|
for (auto i = node->statesBelow.getNextSetIndex(0); i < node->statesBelow.size(); i = node->statesBelow.getNextSetIndex(i + 1)) { |
|
|
|
setStatesAbove(getNode(i), state, true); |
|
|
|
} |
|
|
@ -320,66 +308,50 @@ namespace storm { |
|
|
|
} |
|
|
|
|
|
|
|
bool Lattice::above(Node *node1, Node *node2) { |
|
|
|
bool check = node1->statesBelow.get(node2->states.getNextSetIndex(0)); |
|
|
|
for (auto i = node2->states.getNextSetIndex(0); i < node2->states.size(); i = node2->states.getNextSetIndex(i+1)) { |
|
|
|
if (check) { |
|
|
|
assert(node1->statesBelow.get(i)); |
|
|
|
} else { |
|
|
|
assert(!node1->statesBelow.get(i)); |
|
|
|
} |
|
|
|
} |
|
|
|
for (auto i = node1->states.getNextSetIndex(0); i < node1->states.size(); i = node1->states.getNextSetIndex(i+1)) { |
|
|
|
if (check) { |
|
|
|
assert(node2->statesAbove.get(i)); |
|
|
|
} else { |
|
|
|
assert(!node2->statesAbove.get(i)); |
|
|
|
} |
|
|
|
} |
|
|
|
return node1->statesBelow.get(node2->states.getNextSetIndex(0)); |
|
|
|
} |
|
|
|
|
|
|
|
void Lattice::setStatesAbove(Lattice::Node *node, uint_fast64_t state, bool alreadyInitialized) { |
|
|
|
assert (!node->states.get(state)); |
|
|
|
|
|
|
|
if (!alreadyInitialized) { |
|
|
|
node->statesAbove = storm::storage::BitVector(numberOfStates); |
|
|
|
} |
|
|
|
|
|
|
|
node->statesAbove.set(state); |
|
|
|
} |
|
|
|
|
|
|
|
void Lattice::setStatesBelow(Lattice::Node *node, uint_fast64_t state, bool alreadyInitialized) { |
|
|
|
assert (!node->states.get(state)); |
|
|
|
|
|
|
|
if (!alreadyInitialized) { |
|
|
|
node->statesBelow = storm::storage::BitVector(numberOfStates); |
|
|
|
} |
|
|
|
|
|
|
|
node->statesBelow.set(state); |
|
|
|
} |
|
|
|
|
|
|
|
void Lattice::setStatesAbove(Lattice::Node *node, storm::storage::BitVector states, bool alreadyInitialized) { |
|
|
|
assert((states.getNumberOfSetBits() - (node->states & states).getNumberOfSetBits()) != 0); |
|
|
|
|
|
|
|
auto complement = storm::storage::BitVector(node->states); |
|
|
|
complement.complement(); |
|
|
|
if (alreadyInitialized) { |
|
|
|
node->statesAbove |= states; |
|
|
|
node->statesAbove |= (states & complement); |
|
|
|
} else { |
|
|
|
node->statesAbove = storm::storage::BitVector(states); |
|
|
|
} |
|
|
|
for (auto i = states.getNextSetIndex(0); i < states.size(); i = states.getNextSetIndex(i + 1)) { |
|
|
|
if (node->states.get(i)) { |
|
|
|
node->statesAbove.set(i, false); |
|
|
|
} |
|
|
|
node->statesAbove = (storm::storage::BitVector(states) & complement); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Lattice::setStatesBelow(Lattice::Node *node, storm::storage::BitVector states, bool alreadyInitialized) { |
|
|
|
assert((states.getNumberOfSetBits() - (node->states & states).getNumberOfSetBits()) != 0); |
|
|
|
|
|
|
|
auto complement = storm::storage::BitVector(node->states); |
|
|
|
complement.complement(); |
|
|
|
if (alreadyInitialized) { |
|
|
|
node->statesBelow |= states; |
|
|
|
node->statesBelow |= (states & complement); |
|
|
|
} else { |
|
|
|
node->statesBelow = storm::storage::BitVector(states); |
|
|
|
} |
|
|
|
for (auto i = states.getNextSetIndex(0); i < states.size(); i = states.getNextSetIndex(i + 1)) { |
|
|
|
if (node->states.get(i)) { |
|
|
|
node->statesBelow.set(i, false); |
|
|
|
} |
|
|
|
node->statesBelow = (storm::storage::BitVector(states) & complement); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|