CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
ProcSort.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: MVAComputer
4 // Class : ProcSort
5 //
6 
7 // Implementation:
8 // Sorts the input variables. Each input variable must appear in the
9 // multiplicity as the others. One variable is the sorting "leader" by
10 // which all variables are reordered the same way. The ordering is
11 // determined by either ascending or descending order of the leader.
12 //
13 // Author: Christophe Saout
14 // Created: Sun Sep 16 14:52 CEST 2007
15 // $Id: ProcSort.cc,v 1.3 2009/06/03 09:50:14 saout Exp $
16 //
17 
18 #include <stdlib.h>
19 #include <algorithm>
20 #include <functional>
21 #include <iterator>
22 #include <vector>
23 
24 #include <boost/iterator/transform_iterator.hpp>
25 
28 
29 using namespace PhysicsTools;
30 
31 namespace { // anonymous
32 
33 class ProcSort : public VarProcessor {
34  public:
35  typedef VarProcessor::Registry::Registry<ProcSort,
37 
38  ProcSort(const char *name,
40  const MVAComputer *computer);
41  virtual ~ProcSort() {}
42 
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;
47 
48  private:
49  unsigned int leader;
50  bool descending;
51 };
52 
53 static ProcSort::Registry registry("ProcSort");
54 
55 ProcSort::ProcSort(const char *name,
57  const MVAComputer *computer) :
58  VarProcessor(name, calib, computer),
59  leader(calib->sortByIndex),
60  descending(calib->descending)
61 {
62 }
63 
64 void ProcSort::configure(ConfIterator iter, unsigned int n)
65 {
66  if (leader >= n)
67  return;
68 
69  iter << iter;
70  while(iter)
71  iter << iter++(Variable::FLAG_ALL);
72 }
73 
74 namespace { // anonymous
75  struct LeaderLookup : public std::unary_function<int, double> {
76  inline LeaderLookup() {}
77  inline LeaderLookup(const double *values) : values(values) {}
78 
79  inline double operator () (int index) const
80  { return values[index]; }
81 
82  const double *values;
83  };
84 } // anonymous namespace
85 
86 void ProcSort::eval(ValueIterator iter, unsigned int n) const
87 {
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());
92 
93  int *sort = (int*)alloca(size * sizeof(int));
94  for(unsigned int i = 0; i < size; i++)
95  sort[i] = (int)i;
96 
97  boost::transform_iterator<LeaderLookup, int*> begin(sort, lookup);
98  boost::transform_iterator<LeaderLookup, int*> end = begin;
99 
100  for(unsigned int i = 0; i < size; i++, end++) {
101  unsigned int pos = std::lower_bound(begin, end,
102  leaderIter[i]) - begin;
103  std::memmove(sort + (pos + 1), sort + pos,
104  (i - pos) * sizeof(*sort));
105  sort[pos] = i;
106  }
107 
108  if (descending)
109  std::reverse(sort, sort + size);
110 
111  for(unsigned int i = 0; i < size; i++)
112  iter << (double)sort[i];
113  iter();
114 
115  while(iter) {
116  for(unsigned int i = 0; i < size; i++)
117  iter << iter[sort[i]];
118  iter();
119  iter++;
120  }
121 }
122 
123 std::vector<double> ProcSort::deriv(ValueIterator iter, unsigned int n) const
124 {
125  unsigned int in = 0;
126  for(ValueIterator iter2 = iter; iter2; ++iter2)
127  in += iter2.size();
128 
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());
133 
134  std::vector<int> sort;
135  for(unsigned int i = 0; i < size; i++)
136  sort.push_back((int)i);
137 
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 =
143  begin;
144 
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()));
150  sort[pos] = i;
151  }
152 
153  if (descending)
154  std::reverse(sort.begin(), sort.end());
155 
156  std::vector<double> result(size * in, 0.0);
157 
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();
161  result.resize(row + in);
162  result[row + pos + sort[i]] = 1.0;
163  }
164  }
165 
166  return result;
167 }
168 
169 } // anonymous namespace
int i
Definition: DBlmapReader.cc:9
detail::ThreadSafeRegistry< ParameterSetID, ParameterSet, ProcessParameterSetIDCache > Registry
Definition: Registry.h:37
MVATrainerComputer * calib
Definition: MVATrainer.cc:64
Main interface class to the generic discriminator computer framework.
Definition: MVAComputer.h:40
tuple result
Definition: query.py:137
#define end
Definition: vmac.h:38
#define begin
Definition: vmac.h:31
template to generate a registry singleton for a type.
static Interceptor::Registry registry("Interceptor")
tuple size
Write out results.
Common base class for variable processors.
Definition: VarProcessor.h:39