};
auto cache_order_cmp = [&](const auto &it1, const auto &it2) -> auto {
- auto o1 = tsort_unmask(it1.get()), o2 = tsort_unmask(it2.get());
- double w1 = 0., w2 = 0.;
-
- if (o1 == o2) {
- /* No topological order */
- if (it1->priority == it2->priority) {
-
- auto augmentations1 = it1->get_augmentation_weight();
- auto augmentations2 = it2->get_augmentation_weight();
-
- if (augmentations1 == augmentations2) {
- auto avg_freq = ((double) total_hits / used_items);
- auto avg_weight = (total_weight / used_items);
- auto f1 = (double) it1->st->total_hits / avg_freq;
- auto f2 = (double) it2->st->total_hits / avg_freq;
- auto weight1 = std::fabs(it1->st->weight) / avg_weight;
- auto weight2 = std::fabs(it2->st->weight) / avg_weight;
- auto t1 = it1->st->avg_time;
- auto t2 = it2->st->avg_time;
- w1 = score_functor(weight1, f1, t1);
- w2 = score_functor(weight2, f2, t2);
- }
- else {
- w1 = augmentations1;
- w2 = augmentations2;
- }
- }
- else {
- /* Strict sorting */
- w1 = std::abs(it1->priority);
- w2 = std::abs(it2->priority);
- }
- }
- else {
- w1 = o1;
- w2 = o2;
- }
-
- if (w2 > w1) {
- return 1;
- }
- else if (w2 < w1) {
- return -1;
- }
-
- return 0;
+ constexpr const auto topology_mult = 1e7,
+ priority_mult = 1e6,
+ augmentations1_mult = 1e5;
+ auto w1 = tsort_unmask(it1.get()) * topology_mult,
+ w2 = tsort_unmask(it2.get()) * topology_mult;
+
+ w1 += it1->priority * priority_mult;
+ w2 += it2->priority * priority_mult;
+ w1 += it1->get_augmentation_weight() * augmentations1_mult;
+ w2 += it2->get_augmentation_weight() * augmentations1_mult;
+
+ auto avg_freq = ((double) total_hits / used_items);
+ auto avg_weight = (total_weight / used_items);
+ auto f1 = (double) it1->st->total_hits / avg_freq;
+ auto f2 = (double) it2->st->total_hits / avg_freq;
+ auto weight1 = std::fabs(it1->st->weight) / avg_weight;
+ auto weight2 = std::fabs(it2->st->weight) / avg_weight;
+ auto t1 = it1->st->avg_time;
+ auto t2 = it2->st->avg_time;
+ w1 += score_functor(weight1, f1, t1);
+ w2 += score_functor(weight2, f2, t2);
+
+ return w1 > w2;
};
std::stable_sort(std::begin(ord->d), std::end(ord->d), cache_order_cmp);