1 #ifndef _theplu_yat_normalizer_spearman_
2 #define _theplu_yat_normalizer_spearman_
28 #include "yat/utility/DataIterator.h"
29 #include "yat/utility/iterator_traits.h"
30 #include "yat/utility/sort_index.h"
31 #include "yat/utility/WeightIterator.h"
33 #include <boost/concept_check.hpp>
41 namespace normalizer {
70 template<
typename RandomAccessIter1,
typename RandomAccessIter2>
71 void operator()(RandomAccessIter1 first, RandomAccessIter1 last,
72 RandomAccessIter2 result)
const
74 BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<RandomAccessIter1>));
75 BOOST_CONCEPT_ASSERT((boost::Mutable_RandomAccessIterator<RandomAccessIter2>));
77 typename weighted_if_any2<RandomAccessIter1,RandomAccessIter2>::type tag;
78 normalize(first, last, result, tag);
84 template<
typename RandomAccessIter1,
typename RandomAccessIter2>
85 void normalize(RandomAccessIter1 first, RandomAccessIter1 last,
86 RandomAccessIter2 result,
89 std::vector<size_t> perm;
91 double n = perm.size();
93 while ( i<perm.size() ) {
95 while (i<perm.size() && first[perm[i]]<=first[perm[min_i]])
97 double res =
static_cast<double>(i + min_i)/(2*n);
98 for ( ; min_i < i; ++min_i)
99 result[perm[min_i]] = res;
105 template<
typename RandomAccessIter1,
typename RandomAccessIter2>
106 void normalize(RandomAccessIter1 first, RandomAccessIter1 last,
107 RandomAccessIter2 result,
108 utility::weighted_iterator_tag)
const
110 detail::copy_weight_if_weighted(first, last, result);
111 std::vector<double> input_vec;
112 input_vec.reserve(last-first);
114 utility::iterator_traits<RandomAccessIter1> trait;
115 for (RandomAccessIter1 i=first; i!=last; ++i) {
116 if (trait.weight(i)==0)
117 input_vec.push_back(0.0);
119 input_vec.push_back(trait.data(i));
122 std::vector<size_t> perm(input_vec.size());
124 utility::iterator_traits<RandomAccessIter2> rtrait;
128 while ( i<perm.size() ) {
131 while (i<perm.size() && (trait.weight(first+perm[i])==0 ||
132 trait.data(first+perm[i]) <=
133 trait.data(first+perm[min_i])) ) {
134 w += trait.weight(first+perm[i]);
137 double res=sum_w + 0.5*w;
138 for (
size_t j=min_i; j<i; ++j)
139 rtrait.data(result+perm[j]) = res;
143 size_t n = std::distance(first, last);
144 std::transform(utility::data_iterator(result),
145 utility::data_iterator(result+n),
146 utility::data_iterator(result),
147 std::bind2nd(std::divides<double>(), sum_w));
Definition: iterator_traits.h:46
Spearman(void)
default constructor
Definition: Spearman.h:58
void operator()(RandomAccessIter1 first, RandomAccessIter1 last, RandomAccessIter2 result) const
Definition: Spearman.h:71
Replace elements with normalized rank.
Definition: Spearman.h:52
void sort_index(ForwardIterator first, ForwardIterator last, std::vector< size_t > &sort_index)
Definition: sort_index.h:94
Definition: iterator_traits.h:153