+struct ScoreCmp {
+ template<typename T>
+ bool operator()(T s1, T s2){
+ return s1.first < s2.first;
+ }
+};
+
+GeneSorter::ActionList GeneSorter::sort(const GeneOrder& go, const Model& m){
+ ActionList al;
+ GeneOrder temp(go);
+ size_t dist = inversionDistance(temp);
+ while(dist > 0){
+ //cout << "Distance: " << inversionDistance(temp) << " : ";
+ //copy(temp.begin(), temp.end(), ostream_iterator<int>(cout, " "));
+ //cout << endl;
+ ActionList safe = safeActions(temp);
+ if (safe.size() > 0){
+ priority_queue<pair<double,SortAction>,vector<pair<double,SortAction> >, ScoreCmp > pq;
+ for (ActionList::iterator sa = safe.begin(); sa != safe.end(); ++sa){
+ pq.push(pair<double,SortAction>(m.score(*sa,temp),*sa));
+ }
+ SortAction sa = pq.top().second;
+ sa(temp);
+ al.push_back(sa);
+ --dist;
+ }else
+ return ActionList(); //TODO: Need to handle hurdles.
+ }
+ return al;