22 #include <boost/iterator/transform_iterator.hpp> 36 ProcSort(
const char *
name,
39 ~ProcSort()
override {}
41 void configure(ConfIterator iter,
unsigned int n)
override;
42 void eval(ValueIterator iter,
unsigned int n)
const override;
43 std::vector<double> deriv(
44 ValueIterator iter,
unsigned int n)
const override;
53 ProcSort::ProcSort(
const char *
name,
57 leader(calib->sortByIndex),
58 descending(calib->descending)
62 void ProcSort::configure(ConfIterator iter,
unsigned int n)
69 iter << iter++(Variable::FLAG_ALL);
74 inline LeaderLookup() {}
75 inline LeaderLookup(
const double *
values) : values(values) {}
77 inline double operator () (
int index)
const 84 void ProcSort::eval(ValueIterator iter,
unsigned int n)
const 86 ValueIterator leaderIter = iter;
87 for(
unsigned int i = 0;
i < leader;
i++, leaderIter++);
88 unsigned int size = leaderIter.size();
89 LeaderLookup lookup(leaderIter.begin());
91 int *
sort = (
int*)alloca(size *
sizeof(
int));
92 for(
unsigned int i = 0;
i <
size;
i++)
95 boost::transform_iterator<LeaderLookup, int*>
begin(sort, lookup);
96 boost::transform_iterator<LeaderLookup, int*>
end =
begin;
98 for(
unsigned int i = 0;
i <
size;
i++, end++) {
101 std::memmove(sort + (pos + 1), sort + pos,
102 (
i - pos) *
sizeof(*sort));
109 for(
unsigned int i = 0;
i <
size;
i++)
110 iter << (
double)sort[
i];
114 for(
unsigned int i = 0;
i <
size;
i++)
115 iter << iter[sort[
i]];
121 std::vector<double> ProcSort::deriv(ValueIterator iter,
unsigned int n)
const 124 for(ValueIterator iter2 = iter; iter2; ++iter2)
127 ValueIterator leaderIter = iter;
128 for(
unsigned int i = 0;
i < leader;
i++, leaderIter++);
129 unsigned int size = leaderIter.size();
130 LeaderLookup lookup(leaderIter.begin());
132 std::vector<int>
sort;
133 for(
unsigned int i = 0;
i <
size;
i++)
134 sort.push_back((
int)
i);
136 boost::transform_iterator<LeaderLookup,
137 std::vector<int>::const_iterator >
begin(
138 sort.begin(), lookup);
139 boost::transform_iterator<LeaderLookup,
140 std::vector<int>::const_iterator > end =
143 for(
unsigned int i = 0; i <
size; i++, end++) {
145 leaderIter[i]) -
begin;
146 std::memmove(&sort.front() + (pos + 1), &sort.front() + pos,
147 (i - pos) *
sizeof(sort.front()));
154 std::vector<double>
result(size * in, 0.0);
156 for(
unsigned int pos = 0; iter; pos += (iter++).
size()) {
157 for(
unsigned int i = 0; i <
size; i++) {
158 unsigned int row =
result.size();
160 result[row + pos + sort[
i]] = 1.0;