24 #include <boost/iterator/transform_iterator.hpp>
29 using namespace PhysicsTools;
38 ProcSort(
const char *
name,
41 virtual ~ProcSort() {}
43 virtual void configure(ConfIterator iter,
unsigned int n);
44 virtual void eval(ValueIterator iter,
unsigned int n)
const;
45 virtual std::vector<double> deriv(
46 ValueIterator iter,
unsigned int n)
const;
55 ProcSort::ProcSort(
const char *
name,
59 leader(calib->sortByIndex),
60 descending(calib->descending)
64 void ProcSort::configure(ConfIterator iter,
unsigned int n)
71 iter << iter++(Variable::FLAG_ALL);
75 struct LeaderLookup :
public std::unary_function<int, double> {
76 inline LeaderLookup() {}
77 inline LeaderLookup(
const double *
values) : values(values) {}
79 inline double operator () (
int index)
const
86 void ProcSort::eval(ValueIterator iter,
unsigned int n)
const
88 ValueIterator leaderIter = iter;
89 for(
unsigned int i = 0;
i < leader;
i++, leaderIter++);
90 unsigned int size = leaderIter.size();
91 LeaderLookup lookup(leaderIter.begin());
93 int *
sort = (
int*)alloca(size *
sizeof(
int));
94 for(
unsigned int i = 0;
i <
size;
i++)
97 boost::transform_iterator<LeaderLookup, int*>
begin(sort, lookup);
98 boost::transform_iterator<LeaderLookup, int*>
end =
begin;
100 for(
unsigned int i = 0;
i <
size;
i++, end++) {
101 unsigned int pos = std::lower_bound(
begin, end,
103 std::memmove(sort + (pos + 1), sort + pos,
104 (
i - pos) *
sizeof(*sort));
109 std::reverse(sort, sort + size);
111 for(
unsigned int i = 0;
i <
size;
i++)
112 iter << (
double)sort[
i];
116 for(
unsigned int i = 0;
i <
size;
i++)
117 iter << iter[sort[
i]];
123 std::vector<double> ProcSort::deriv(ValueIterator iter,
unsigned int n)
const
126 for(ValueIterator iter2 = iter; iter2; ++iter2)
129 ValueIterator leaderIter = iter;
130 for(
unsigned int i = 0;
i < leader;
i++, leaderIter++);
131 unsigned int size = leaderIter.size();
132 LeaderLookup lookup(leaderIter.begin());
134 std::vector<int>
sort;
135 for(
unsigned int i = 0;
i <
size;
i++)
136 sort.push_back((
int)
i);
138 boost::transform_iterator<LeaderLookup,
139 std::vector<int>::const_iterator >
begin(
140 sort.begin(), lookup);
141 boost::transform_iterator<LeaderLookup,
142 std::vector<int>::const_iterator > end =
145 for(
unsigned int i = 0; i <
size; i++, end++) {
146 unsigned int pos = std::lower_bound(
begin, end,
147 leaderIter[i]) -
begin;
148 std::memmove(&sort.front() + (pos + 1), &sort.front() +
pos,
149 (i -
pos) *
sizeof(sort.front()));
154 std::reverse(sort.begin(), sort.end());
156 std::vector<double>
result(size * in, 0.0);
158 for(
unsigned int pos = 0; iter; pos += (iter++).
size()) {
159 for(
unsigned int i = 0; i <
size; i++) {
160 unsigned int row =
result.size();
162 result[row + pos + sort[
i]] = 1.0;
detail::ThreadSafeRegistry< ParameterSetID, ParameterSet, ProcessParameterSetIDCache > Registry
MVATrainerComputer * calib
tuple size
Write out results.