#include #include #include #include #include #include "quantum.h" #include "scheduler.h" //最小优先队列的比较方法 namespace{ struct cmp{ bool operator() (std::pair> l, std::pair> r){ return l.first < r.first; } }; int region_usage_count(std::vector region){ int count=0; for(int i=0; i region, std::vector occupied){ for(int i=0; i region, std::vector& occupied){ for(int i=0; i region, std::vector& occupied){ for(int i=0; i& programs){ std::sort(programs.begin(),programs.end(), [](quantum_program& l, quantum_program& r){ return region_usage_count(l.region_usage[0]) > region_usage_count(r.region_usage[0]); }); //Greedily Schedule int time=0; std::vector occupied(RegionNum, false); std::priority_queue>, std::vector>>, cmp> timeline; //timeline represents in progress programs, 最小优先队列 while(true){ //Release occupied bits if(!timeline.empty()){ auto next = timeline.top(); timeline.pop(); time = next.first; region_release(next.second, occupied); } //Release bits that should be released at the same time while(!timeline.empty() && timeline.top().first == time){ auto next = timeline.top(); timeline.pop(); region_release(next.second, occupied); } for(auto& p: programs){ if(p.repeat_times > 0){ for(int i=0; i < p.map_count; i++){ if(!region_converge(p.region_usage[i], occupied)){ p.start_points.push_back(time); p.end_points.push_back(time+p.time_cost[i]); p.repeat_times--; region_occupy(p.region_usage[i], occupied); timeline.push(std::make_pair(p.end_points.back(), p.region_usage[i])); } } } } if(timeline.empty()){ break; } } return time; }