42 class lt {
public:
static int compare(T a, T b) {
return(a < b); } };
44 class gt {
public:
static int compare(T a, T b) {
return(a > b); } };
46 template <
class T,
class C>
54 ranker(
const vector<T>& v) :
p(&v[0]),
sz(v.size()) { }
63 for (
typename vector<S>::iterator i = w.begin(); i != w.end() - 1; ++i)
65 std::sort(w.begin(), w.end(), *
this);
70 if (num >
sz) num =
sz;
73 for (
typename vector<S>::iterator i = w.begin(); i != w.end() - 1; ++i)
75 std::partial_sort(w.begin(), w.begin() + num, w.end(), *
this);
80 void get_ranks(vector<S>& w,
const string& method)
const {
82 vector<uint> tmp(w.size());
84 if (method ==
"average") {
85 for (
uint c = 0, reps; c < w.size(); c += reps) { reps = 1;
86 while (c + reps < w.size() &&
p[tmp[c]] ==
p[tmp[c + reps]]) ++reps;
87 for (
uint k = 0; k < reps; ++k)
88 w[tmp[c + k]] = S(2 * c + reps - 1) / 2 + 1;
90 }
else if (method ==
"min") {
91 for (
uint c = 0, reps; c < w.size(); c += reps) { reps = 1;
92 while (c + reps < w.size() &&
p[tmp[c]] ==
p[tmp[c + reps]]) ++reps;
93 for (
uint k = 0; k < reps; ++k) w[tmp[c + k]] = c + 1;
95 }
else if (method ==
"max") {
96 for (
uint c = 0, reps; c < w.size(); c += reps) { reps = 1;
97 while (c + reps < w.size() &&
p[tmp[c]] ==
p[tmp[c + reps]]) ++reps;
98 for (
uint k = 0; k < reps; ++k) w[tmp[c + k]] = c + reps;
101 for (
uint c = 0; c < w.size(); ++c) w[tmp[c]] = c + 1;
106 if (num >
sz) num =
sz;
107 vector<uint> tmp(
sz);
110 fill(w.begin(), w.end(), 0);
111 if (method ==
"average") {
112 for (
uint c = 0, reps; c < num; c += reps) { reps = 1;
113 while (c + reps < num &&
p[tmp[c]] ==
p[tmp[c + reps]]) ++reps;
114 for (
uint k = 0; k < reps; ++k)
115 w[tmp[c + k]] = S(2 * c + reps - 1) / 2 + 1;
117 }
else if (method ==
"min") {
118 for (
uint c = 0, reps; c < num; c += reps) { reps = 1;
119 while (c + reps < num &&
p[tmp[c]] ==
p[tmp[c + reps]]) ++reps;
120 for (
uint k = 0; k < reps; ++k) w[tmp[c + k]] = c + 1;
122 }
else if (method ==
"max") {
123 for (
uint c = 0, reps; c < num; c += reps) { reps = 1;
124 while (c + reps < num &&
p[tmp[c]] ==
p[tmp[c + reps]]) ++reps;
125 for (
uint k = 0; k < reps; ++k) w[tmp[c + k]] = c + reps;
128 for (
uint c = 0; c < num; ++c) w[tmp[c]] = c + 1;
133 template <
class T,
class S>
134 inline void rank(
const vector<T>& v, vector<S>& w,
135 const string& method =
"average")
138 template <
class T,
class S>
139 inline void rank(
const T* d,
uint size, vector<S>& w,
140 const string& method =
"average")
143 template <
class T,
class S>
145 const string& method =
"average")
148 template <
class T,
class S>
150 const string& method =
"average")
153 template <
class T,
class S>
154 inline void order(
const vector<T>& v, vector<S>& w)
157 template <
class T,
class S>
161 template <
class T,
class S>
165 template <
class T,
class S>
169 template <
class T,
class S>
170 inline void rankhigh(
const vector<T>& v, vector<S>& w,
171 const string& method =
"average")
174 template <
class T,
class S>
176 const string& method =
"average")
179 template <
class T,
class S>
181 const string& method =
"average")
184 template <
class T,
class S>
186 const string& method =
"average")
189 template <
class T,
class S>
193 template <
class T,
class S>
197 template <
class T,
class S>
201 template <
class T,
class S>
208 if (size == 0)
return T(0);
209 if (size == 1)
return d[0];
210 if (q <= 0)
return *std::min_element(d, d + size);
211 if (q >= 1)
return *std::max_element(d, d + size);
213 double pos = (size - 1) * q;
215 double delta = pos - ind;
216 vector<T> w(size); std::copy(d, d + size, w.begin());
217 std::nth_element(w.begin(), w.begin() + ind, w.end());
218 T i1 = *(w.begin() + ind);
219 T i2 = *std::min_element(w.begin() + ind + 1, w.end());
220 return (T) (i1 * (1.0 - delta) + i2 * delta);
224 inline T
quantile(
const vector<T>& v,
const double q)
225 {
return quantile(&v[0], v.size(), q); }
T quantile(const T *d, const uint size, const double q)
int operator()(uint i1, uint i2) const
void get_partial_orders(vector< S > &w, uint num) const
ranker(const T *tp, uint s)
void partial_rankhigh(const vector< T > &v, vector< S > &w, uint num, const string &method="average")
ranker(const vector< T > &v)
void get_partial_ranks(vector< S > &w, const string &method, size_t num) const
void rankhigh(const vector< T > &v, vector< S > &w, const string &method="average")
void partial_order(const vector< T > &v, vector< S > &w, uint num)
void rank(const vector< T > &v, vector< S > &w, const string &method="average")
void get_orders(vector< S > &w) const
void order(const vector< T > &v, vector< S > &w)
void partial_orderhigh(const vector< T > &v, vector< S > &w, uint num)
static int compare(T a, T b)
void orderhigh(const vector< T > &v, vector< S > &w)
void get_ranks(vector< S > &w, const string &method) const
static int compare(T a, T b)
void partial_rank(const vector< T > &v, vector< S > &w, uint num, const string &method="average")