Bridge++  Version 1.5.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
sorter.cpp
Go to the documentation of this file.
1 
14 #include "sorter.h"
15 
16 //====================================================================
19 {
20  virtual ~by_order() {}
21 
22  virtual
23  bool operator()(const double lhs, const double rhs) const = 0;
24 
25  bool operator()(const pair_t& lhs, const pair_t& rhs) const
26  {
27  return operator()(lhs.second, rhs.second);
28  }
29 };
30 
31 //====================================================================
33 // i.e. |v_0| <= |v_1| <= ... <= |v_{n-1}|
35 {
36  bool operator()(const double lhs, const double rhs) const
37  { return fabs(lhs) < fabs(rhs); }
38 };
39 
40 //====================================================================
42 // i.e. |v_0| >= |v_1| >= ... >= |v_{n-1}|
44 {
45  bool operator()(const double lhs, const double rhs) const
46  {
47  return fabs(lhs) > fabs(rhs);
48  }
49 };
50 
51 //====================================================================
53 // i.e. v_0 <= v_1 <= ... <= v_{n-1}
55 {
56  virtual
57  bool operator()(const double lhs, const double rhs) const
58  {
59  return lhs < rhs;
60  }
61 };
62 
63 //====================================================================
65 // i.e. v_0 >= v_1 >= ... >= v_{n-1}
67 {
68  virtual
69  bool operator()(const double lhs, const double rhs) const
70  {
71  return lhs > rhs;
72  }
73 };
74 
75 //====================================================================
78 {
79  private:
81 
82  public:
83  proxy(const Sorter::by_order& order) : m_order(order) {}
84 
85  bool operator()(const double lhs, const double rhs) const
86  {
87  return m_order(lhs, rhs);
88  }
89 
90  bool operator()(const pair_t& lhs, const pair_t& rhs) const
91  {
92  return m_order(lhs, rhs);
93  }
94 };
95 
96 //====================================================================
98 Sorter::Sorter(const std::string& type) : m_order(0)
99 {
100  if (type == "abs_ascending") m_order = new by_abs_ascend;
101  if (type == "abs_descending") m_order = new by_abs_descend;
102  if (type == "ascending") m_order = new by_ascend;
103  if (type == "descending") m_order = new by_descend;
104 }
105 
106 
107 //====================================================================
110 {
111  if (m_order) delete m_order;
112 }
113 
114 
115 //====================================================================
117 void Sorter::sort(std::vector<double>& v)
118 {
119  assert(m_order != NULL);
120 
121  return std::sort(v.begin(), v.end(), proxy(*m_order));
122 }
123 
124 
125 //====================================================================
127 void Sorter::sort(std::vector<double>& v, const size_t nelem)
128 {
129  assert(m_order != NULL);
130 
131  return std::sort(v.begin(), v.begin() + nelem, proxy(*m_order));
132 }
133 
134 
135 //====================================================================
137 std::vector<int> Sorter::sort_index(std::vector<double>& v)
138 {
139  assert(m_order != NULL);
140 
141  std::vector<std::pair<int, double> > w(v.size());
142 
143  for (size_t i = 0, n = v.size(); i < n; ++i) {
144  w[i].first = i;
145  w[i].second = v[i];
146  }
147 
148  std::sort(w.begin(), w.end(), proxy(*m_order));
149 
150  std::vector<int> idx(v.size());
151 
152  for (size_t i = 0, n = v.size(); i < n; ++i) {
153  idx[i] = w[i].first;
154  v[i] = w[i].second;
155  }
156 
157  return idx;
158 }
159 
160 
161 //====================================================================
163 std::vector<int> Sorter::sort_index(std::vector<double>& v, const size_t nelem)
164 {
165  assert(m_order != NULL);
166 
167  std::vector<std::pair<int, double> > w(v.size());
168 
169  for (size_t i = 0, n = v.size(); i < n; ++i) {
170  w[i].first = i;
171  w[i].second = v[i];
172  }
173 
174  std::sort(w.begin(), w.begin() + nelem, proxy(*m_order));
175 
176  std::vector<int> idx(v.size());
177 
178  for (size_t i = 0, n = v.size(); i < n; ++i) {
179  idx[i] = w[i].first;
180  v[i] = w[i].second;
181  }
182 
183  return idx;
184 }
185 
186 
187 //====================================================================
189 bool Sorter::comp(const double lhs, const double rhs)
190 {
191  assert(m_order != NULL);
192  return m_order->operator()(lhs, rhs);
193 }
194 
195 
196 //==========================================================
197 //==================================================END=====
virtual ~by_order()
Definition: sorter.cpp:20
proxy(const Sorter::by_order &order)
Definition: sorter.cpp:83
bool operator()(const pair_t &lhs, const pair_t &rhs) const
Definition: sorter.cpp:90
void sort(std::vector< double > &v)
sort an array of values; v is sorted on exit.
Definition: sorter.cpp:117
std::pair< int, double > pair_t
Definition: sorter.h:70
ascending order
Definition: sorter.cpp:54
virtual bool operator()(const double lhs, const double rhs) const =0
bool operator()(const double lhs, const double rhs) const
Definition: sorter.cpp:45
absolute descending order
Definition: sorter.cpp:43
proxy object to pass to stl sort algorithm
Definition: sorter.cpp:77
std::vector< int > sort_index(std::vector< double > &v)
sort an array and return list of index; v is sorted on exit.
Definition: sorter.cpp:137
by_order * m_order
Definition: sorter.h:74
virtual ~Sorter()
destructor
Definition: sorter.cpp:109
virtual bool operator()(const double lhs, const double rhs) const
Definition: sorter.cpp:69
Sorter(const std::string &type)
constructor with sort ordering as a string arg
Definition: sorter.cpp:98
const Sorter::by_order & m_order
Definition: sorter.cpp:80
absolute ascending order
Definition: sorter.cpp:34
bool operator()(const double lhs, const double rhs) const
Definition: sorter.cpp:36
bool operator()(const double lhs, const double rhs) const
Definition: sorter.cpp:85
base class for sort ordering
Definition: sorter.cpp:18
bool operator()(const pair_t &lhs, const pair_t &rhs) const
Definition: sorter.cpp:25
descending order
Definition: sorter.cpp:66
bool comp(const double lhs, const double rhs)
call sort condition.
Definition: sorter.cpp:189
virtual bool operator()(const double lhs, const double rhs) const
Definition: sorter.cpp:57