1 #ifndef _theplu_yat_normalizer_spearman_
2 #define _theplu_yat_normalizer_spearman_
28 #include "yat/utility/concept_check.h"
29 #include "yat/utility/DataIterator.h"
30 #include "yat/utility/iterator_traits.h"
31 #include "yat/utility/sort_index.h"
34 #include "yat/utility/WeightIterator.h"
36 #include <boost/concept_check.hpp>
45 namespace normalizer {
78 template<
typename RandomAccessIter1,
typename RandomAccessIter2>
79 void operator()(RandomAccessIter1 first, RandomAccessIter1 last,
80 RandomAccessIter2 result)
const
82 using boost_concepts::ReadableIterator;
83 BOOST_CONCEPT_ASSERT((ReadableIterator<RandomAccessIter1>));
84 using boost_concepts::RandomAccessTraversal;
85 BOOST_CONCEPT_ASSERT((RandomAccessTraversal<RandomAccessIter1>));
87 BOOST_CONCEPT_ASSERT((DataIteratorConcept<RandomAccessIter1>));
89 BOOST_CONCEPT_ASSERT((ReadableIterator<RandomAccessIter2>));
90 using boost_concepts::WritableIterator;
91 BOOST_CONCEPT_ASSERT((WritableIterator<RandomAccessIter2>));
92 BOOST_CONCEPT_ASSERT((RandomAccessTraversal<RandomAccessIter2>));
93 BOOST_CONCEPT_ASSERT((DataIteratorConcept<RandomAccessIter2>));
96 typename weighted_if_any2<RandomAccessIter1,RandomAccessIter2>::type tag;
97 normalize(first, last, result, tag);
103 template<
typename RandomAccessIter1,
typename RandomAccessIter2>
104 void normalize(RandomAccessIter1 first, RandomAccessIter1 last,
105 RandomAccessIter2 result,
108 std::vector<size_t> perm;
110 double n = perm.size();
112 while ( i<perm.size() ) {
114 while (i<perm.size() && first[perm[i]]<=first[perm[min_i]])
116 double res = (i + min_i)/(2.0*n);
117 for ( ; min_i < i; ++min_i)
118 result[perm[min_i]] = res;
124 template<
typename RandomAccessIter1,
typename RandomAccessIter2>
125 void normalize(RandomAccessIter1 first, RandomAccessIter1 last,
126 RandomAccessIter2 result,
127 utility::weighted_iterator_tag)
const
129 detail::copy_weight_if_weighted(first, last, result);
130 std::vector<size_t> perm;
132 utility::iterator_traits<RandomAccessIter1> trait;
133 utility::iterator_traits<RandomAccessIter2> rtrait;
138 while ( i<perm.size() ) {
141 while (i<perm.size() && (trait.weight(first+perm[i])==0 ||
142 trait.data(first+perm[i]) <=
143 trait.data(first+perm[min_i])) ) {
144 w += trait.weight(first+perm[i]);
147 double res = (sum_w + 0.5*w)/total_w;
148 for (
size_t j=min_i; j<i; ++j)
149 rtrait.data(result+perm[j]) = res;
Concept check for Data Iterator.
Definition: concept_check.h:226
double sum_weight(Iterator first, Iterator last)
Definition: utility.h:524
Some useful functions are placed here.
Definition: iterator_traits.h:47
Spearman(void)
default constructor
Definition: Spearman.h:62
void operator()(RandomAccessIter1 first, RandomAccessIter1 last, RandomAccessIter2 result) const
Definition: Spearman.h:79
Replace elements with normalized rank.
Definition: Spearman.h:56
void sort_index(InputIterator first, InputIterator last, std::vector< size_t > &sort_index)
Definition: sort_index.h:147
Definition: iterator_traits.h:159