#include "../Utils/leak_detector.h" #include #include #include #include #include "Cycle.h" using std::vector; using std::pair; namespace Distribution { template void Cycle:: AddArc(const pair &newAcr, const wType wArc, const attrType &attrArc, const unsigned info) { Arcs.push_back(newAcr); wArcs.push_back(wArc); attrArcs.push_back(attrArc); compressedInfo.push_back(info); } template void Cycle:: AddArc(const pair &newAcr, const pair ¶mArc, const unsigned info) { AddArc(newAcr, paramArc.first, paramArc.second, info); } template void Cycle:: AddArc(const vType V1, const vType V2, const pair ¶mArc, const unsigned info) { AddArc(std::make_pair(V1, V2), paramArc.first, paramArc.second, info); } template void Cycle:: AddArc(const vType V1, const vType V2, const wType wArc, const attrType &attrArc, const unsigned info) { AddArc(std::make_pair(V1, V2), wArc, attrArc, info); } template wType Cycle:: GetCycleSum() const { wType sum = 0.0; for (vType i = 0; i < (vType)Arcs.size(); ++i) sum += wArcs[i]; return sum; } template void Cycle:: SortArcs() { vector> toSort; // sort by key for (vType i = 0; i < (vType)wArcs.size(); ++i) toSort.push_back(std::make_pair(wArcs[i], i)); sort(toSort.begin(), toSort.end(), comparator); vector> new_Arcs(wArcs.size()); vector new_wArcs(wArcs.size()); vector new_attrArcs(wArcs.size()); vector new_info(wArcs.size()); // complete sorting for (vType i = 0; i < (vType)wArcs.size(); ++i) { const vType idx = toSort[i].second; new_Arcs[i] = Arcs[idx]; new_wArcs[i] = wArcs[idx]; new_attrArcs[i] = attrArcs[idx]; if (compressedInfo.size()) new_info[i] = compressedInfo[idx]; } attrArcs = new_attrArcs; wArcs = new_wArcs; Arcs = new_Arcs; compressedInfo = new_info; } template bool Cycle:: operator<(const Cycle &right) const { return this->GetCycleSum() > right.GetCycleSum(); } template void Cycle:: PrintValue() const { printf("acrs\n"); for (int i = 0; i < Arcs.size(); ++i) printf("%d %d\n", Arcs[i].first, Arcs[i].second); printf("we\n"); for (int i = 0; i < wArcs.size(); ++i) printf("%f\n", wArcs[i]); printf("attr\n"); for (int i = 0; i < attrArcs.size(); ++i) printf("[%d %d] [%d %d]\n", attrArcs[i].first.first, attrArcs[i].first.second, attrArcs[i].second.first, attrArcs[i].second.second); } template void Cycle:: PrintArcs() const { for (int i = 0; i < Arcs.size(); ++i) printf("[%d %d] ", Arcs[i].first, Arcs[i].second); printf("\n"); } template class Cycle; }