90 STORM_LOG_ASSERT(newBucket < oldBucket,
"Will update item " << item->getId() <<
" from " << oldBucket <<
" to higher bucket " << newBucket);
91 if (newBucket < currentBucket) {
92 currentBucket = newBucket;
96 if (buckets[oldBucket].size() >= 2) {
100 for (; oldIndex < buckets[oldBucket].size(); ++oldIndex) {
101 if (buckets[oldBucket][oldIndex]->getId() == item->getId()) {
105 STORM_LOG_ASSERT(oldIndex < buckets[oldBucket].size(),
"Id " << item->getId() <<
" not found");
106 std::iter_swap(buckets[oldBucket].begin() + oldIndex, buckets[oldBucket].end() - 1);
108 buckets[oldBucket].pop_back();
110 buckets[newBucket].push_back(item);
111 if (newBucket == currentBucket) {
114 std::push_heap(buckets[currentBucket].begin(), buckets[currentBucket].end(), compare);
122template<
typename PriorityType>
124 if (!immediateBucket.empty()) {
125 PriorityTypePointer item = immediateBucket.back();
126 immediateBucket.pop_back();
130 std::pop_heap(buckets[currentBucket].begin(), buckets[currentBucket].end(), compare);
131 PriorityTypePointer item = buckets[currentBucket].back();
132 buckets[currentBucket].pop_back();
133 if (buckets[currentBucket].empty()) {
135 for (; currentBucket < nrBuckets; ++currentBucket) {
136 if (!buckets[currentBucket].empty()) {
137 nrUnsortedItems = buckets[currentBucket].size();
148template<
typename PriorityType>
150 STORM_LOG_ASSERT(priority >= lowerValue,
"Priority " << priority <<
" is too low");
153 double tmpBucket = std::log(priority - lowerValue) / logBase;
154 tmpBucket += buckets.size() / 2;
158 size_t newBucket =
static_cast<size_t>(tmpBucket);
160 if (newBucket >= nrBuckets) {
161 newBucket = nrBuckets - 1;
164 newBucket = nrBuckets - 1 - newBucket;
166 STORM_LOG_ASSERT(newBucket < nrBuckets,
"Priority " << priority <<
" is too high");
170template<
typename PriorityType>
172 out <<
"Bucket priority queue with size " << buckets.size() <<
", lower value: " << lowerValue <<
" and logBase: " << logBase <<
'\n';
173 out <<
"Immediate bucket: ";
174 for (
auto item : immediateBucket) {
175 out << item->getId() <<
", ";
178 out <<
"Current bucket (" << currentBucket <<
") has " << nrUnsortedItems <<
" unsorted items\n";
179 for (
size_t bucket = 0; bucket < buckets.size(); ++bucket) {
180 if (!buckets[bucket].empty()) {
181 out <<
"Bucket " << bucket <<
":\n";
182 for (
auto item : buckets[bucket]) {
183 out <<
"\t" << item->getId() <<
": " << item->getPriority() <<
'\n';
189template<
typename PriorityType>
191 out <<
"Bucket sizes: " << immediateBucket.size() <<
" | ";
192 for (
size_t bucket = 0; bucket < buckets.size(); ++bucket) {
193 out << buckets[bucket].size() <<
" ";