89 STORM_LOG_ASSERT(newBucket < oldBucket,
"Will update item " << item->getId() <<
" from " << oldBucket <<
" to higher bucket " << newBucket);
90 if (newBucket < currentBucket) {
91 currentBucket = newBucket;
95 if (buckets[oldBucket].size() >= 2) {
99 for (; oldIndex < buckets[oldBucket].size(); ++oldIndex) {
100 if (buckets[oldBucket][oldIndex]->getId() == item->getId()) {
104 STORM_LOG_ASSERT(oldIndex < buckets[oldBucket].size(),
"Id " << item->getId() <<
" not found");
105 std::iter_swap(buckets[oldBucket].begin() + oldIndex, buckets[oldBucket].end() - 1);
107 buckets[oldBucket].pop_back();
109 buckets[newBucket].push_back(item);
110 if (newBucket == currentBucket) {
113 std::push_heap(buckets[currentBucket].begin(), buckets[currentBucket].end(), compare);
121template<
typename PriorityType>
123 if (!immediateBucket.empty()) {
124 PriorityTypePointer item = immediateBucket.back();
125 immediateBucket.pop_back();
129 std::pop_heap(buckets[currentBucket].begin(), buckets[currentBucket].end(), compare);
130 PriorityTypePointer item = buckets[currentBucket].back();
131 buckets[currentBucket].pop_back();
132 if (buckets[currentBucket].empty()) {
134 for (; currentBucket < nrBuckets; ++currentBucket) {
135 if (!buckets[currentBucket].empty()) {
136 nrUnsortedItems = buckets[currentBucket].size();
147template<
typename PriorityType>
149 STORM_LOG_ASSERT(priority >= lowerValue,
"Priority " << priority <<
" is too low");
152 double tmpBucket = std::log(priority - lowerValue) / logBase;
153 tmpBucket += buckets.size() / 2;
157 size_t newBucket =
static_cast<size_t>(tmpBucket);
159 if (newBucket >= nrBuckets) {
160 newBucket = nrBuckets - 1;
163 newBucket = nrBuckets - 1 - newBucket;
165 STORM_LOG_ASSERT(newBucket < nrBuckets,
"Priority " << priority <<
" is too high");
169template<
typename PriorityType>
171 out <<
"Bucket priority queue with size " << buckets.size() <<
", lower value: " << lowerValue <<
" and logBase: " << logBase <<
'\n';
172 out <<
"Immediate bucket: ";
173 for (
auto item : immediateBucket) {
174 out << item->getId() <<
", ";
177 out <<
"Current bucket (" << currentBucket <<
") has " << nrUnsortedItems <<
" unsorted items\n";
178 for (
size_t bucket = 0; bucket < buckets.size(); ++bucket) {
179 if (!buckets[bucket].empty()) {
180 out <<
"Bucket " << bucket <<
":\n";
181 for (
auto item : buckets[bucket]) {
182 out <<
"\t" << item->getId() <<
": " << item->getPriority() <<
'\n';
188template<
typename PriorityType>
190 out <<
"Bucket sizes: " << immediateBucket.size() <<
" | ";
191 for (
size_t bucket = 0; bucket < buckets.size(); ++bucket) {
192 out << buckets[bucket].size() <<
" ";