You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.6 KiB
43 lines
1.6 KiB
#include "src/storage/gspn/Marking.h"
|
|
|
|
namespace storm {
|
|
namespace gspn {
|
|
Marking::Marking(uint_fast64_t numberOfPlaces, uint_fast64_t maxNumberOfTokens) {
|
|
this->numberOfPlaces = numberOfPlaces;
|
|
this->maxNumberOfTokens = maxNumberOfTokens;
|
|
|
|
this->numberOfBits = std::floor(std::log2(maxNumberOfTokens)) + 1;
|
|
this->marking = storm::storage::BitVector(numberOfBits * numberOfPlaces);
|
|
}
|
|
|
|
uint_fast64_t Marking::getNumberOfPlaces() {
|
|
return this->numberOfPlaces;
|
|
}
|
|
|
|
uint_fast64_t Marking::getMaxNumberOfTokens() {
|
|
return this->maxNumberOfTokens;
|
|
}
|
|
|
|
void Marking::setNumberOfTokensAt(uint_fast64_t place, uint_fast64_t numberOfTokens) {
|
|
//check range
|
|
for (uint_fast64_t i = getNumberOfPlaces() * numberOfBits; i <(getNumberOfPlaces() * numberOfBits) + numberOfBits; ++i) {
|
|
if (numberOfTokens % 2 == 0) {
|
|
marking.set(i, false);
|
|
} else {
|
|
marking.set(i, true);
|
|
}
|
|
numberOfTokens /= 2;
|
|
}
|
|
}
|
|
|
|
uint_fast64_t Marking::getNumberOfTokensAt(uint_fast64_t place) {
|
|
uint_fast64_t tokens = 0;
|
|
for (uint_fast64_t i = getNumberOfPlaces() * numberOfBits, mult = 0; i <(getNumberOfPlaces() * numberOfBits) + numberOfBits; ++i, ++mult) {
|
|
if (marking.get(i)) {
|
|
tokens += std::pow(2, mult);
|
|
}
|
|
}
|
|
return tokens;
|
|
}
|
|
}
|
|
}
|