CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
VarProcessor.h
Go to the documentation of this file.
1 #ifndef PhysicsTools_MVAComputer_VarProcessor_h
2 #define PhysicsTools_MVAComputer_VarProcessor_h
3 // -*- C++ -*-
4 //
5 // Package: MVAComputer
6 // Class : VarProcessor
7 //
8 
9 //
10 // Author: Christophe Saout <christophe.saout@cern.ch>
11 // Created: Sat Apr 24 15:18 CEST 2007
12 // $Id: VarProcessor.h,v 1.9 2009/06/03 09:50:14 saout Exp $
13 //
14 
15 #include <algorithm>
16 #include <vector>
17 
19 
24 
25 namespace PhysicsTools {
26 
27 // forward declaration
28 class MVAComputer;
29 
39 class VarProcessor :
40  public ProcessRegistry<VarProcessor,
41  Calibration::VarProcessor,
42  const MVAComputer>::Factory {
43  public:
53  struct Config {
54  inline Config() : mask(Variable::FLAG_NONE), origin(0) {}
55  inline Config(Variable::Flags mask, unsigned int origin) :
56  mask(mask), origin(origin) {}
57 
59  unsigned int origin;
60  };
61 
62  class ConfigCtx {
63  public:
64  typedef std::vector<Config> Config_t;
65 
68  typedef Config_t::iterator iterator;
69  typedef Config_t::const_iterator const_iterator;
70 
71  struct Context { virtual ~Context() {} };
72 
73  ConfigCtx(std::vector<Variable::Flags> flags);
74  ~ConfigCtx() { delete ctx; }
75 
76  inline size_type size() const { return configs.size(); }
77  inline const_iterator begin() const { return configs.begin(); }
78  inline iterator begin() { return configs.begin(); }
79  inline const_iterator end() const { return configs.end(); }
80  inline iterator end() { return configs.end(); }
81  inline void push_back(const Config &config) { configs.push_back(config); }
82  inline Config &operator [] (size_type i) { return configs[i]; }
83 
84  private:
85  friend class VarProcessor;
86 
90  };
91 
92  virtual ~VarProcessor();
93 
95  void configure(ConfigCtx &config);
96 
98  inline void
99  eval(double *input, int *conf, double *output, int *outConf,
100  int *loop, unsigned int offset) const
101  {
103  output, outConf, loop, offset);
104  eval(iter, nInputVars);
105  }
106 
108  void deriv(double *input, int *conf, double *output, int *outConf,
109  int *loop, unsigned int offset, unsigned int in,
110  unsigned int out, std::vector<double> &deriv) const;
111 
113 
114  virtual LoopStatus loop(double *output, int *outConf,
115  unsigned int nOutput,
116  unsigned int &nOffset) const
117  { return kStop; }
118 
119  struct Dummy {};
121 
122  protected:
128  struct ConfIterator {
129  public:
132  {
133  config[cur()].mask =
134  (Variable::Flags)(config[cur()].mask & mask);
135  return *this;
136  }
137 
140  { config.push_back(config_); return *this; }
141 
144  { return *this << Config(mask, 0); }
145 
148  { return *this << Config(config[origin.cur()].mask, origin.cur()); }
149 
152  { return config[cur()].mask; }
153 
155  inline operator bool() const { return cur; }
156 
158  ConfIterator &operator ++ () { ++cur; return *this; }
159 
161  inline ConfIterator operator ++ (int dummy)
162  { ConfIterator orig = *this; operator ++ (); return orig; }
163 
164  protected:
165  friend class VarProcessor;
166 
168  cur(cur), config(config) {}
169 
170  private:
173  };
174 
180  struct ValueIterator {
181  public:
183  inline unsigned int size() const
184  { return loop ? (conf[1] - conf[0]) : 1; }
185 
187  inline double *begin() const { return values; }
188 
190  inline double *end() const { return values + size(); }
191 
193  inline bool empty() const { return begin() == end(); }
194 
196  inline double operator * ()
197  { return *values; }
198 
200  inline double operator [] (unsigned int idx)
201  { return values[idx]; }
202 
205  { *output++ = value; return *this; }
206 
208  inline void operator () ()
209  {
210  int pos = output - start;
211  if (*++outConf > pos)
212  output = start + *outConf;
213  else
214  *outConf = pos;
215  }
216 
218  inline void operator () (double value)
219  { *this << value; (*this)(); }
220 
222  inline operator bool() const { return cur; }
223 
226  {
227  BitSet::size_t orig = cur();
228  if (++cur) {
229  unsigned int prev = *conf;
230  conf += cur() - orig;
231  values += *conf - prev;
232  if (loop && conf >= loop) {
233  values += offset;
234  loop = 0;
235  }
236  }
237  return *this;
238  }
239 
241  inline ValueIterator operator ++ (int dummy)
242  { ValueIterator orig = *this; operator ++ (); return orig; }
243 
244  protected:
245  friend class VarProcessor;
246 
248  int *conf, double *output, int *outConf,
249  int *loop, unsigned int offset) :
250  cur(cur), offset(offset), start(values + offset),
251  values(values), conf(conf), loop(loop),
252  output(output + offset), outConf(outConf)
253  {
254  this->conf += cur();
255  this->values += *this->conf;
256  if (loop && this->conf >= loop) {
257  this->values += offset;
258  this->loop = 0;
259  }
260  }
261 
262  private:
264  const unsigned int offset;
265  double *const start;
266  double *values;
267  const int *conf;
268  const int *loop;
269  double *output;
270  int *outConf;
271  };
272 
276 
277  VarProcessor(const char *name, const Calibration::VarProcessor *calib,
278  const MVAComputer *computer);
279 
281  virtual void configure(ConfIterator iter, unsigned int n) = 0;
282 
284  virtual ConfigCtx::Context *
287 
289  virtual void eval(ValueIterator iter, unsigned int n) const = 0;
290 
292  virtual std::vector<double> deriv(ValueIterator iter,
293  unsigned int n) const
294  { return std::vector<double>(); }
295 
296  protected:
298 
299  private:
302  unsigned int nInputVars;
303 };
304 
305 template<>
308  const char*, const Calibration::VarProcessor*, const MVAComputer*);
309 
310 } // namespace PhysicsTools
311 
312 #define MVA_COMPUTER_DEFINE_PLUGIN(T) \
313  DEFINE_EDM_PLUGIN(::PhysicsTools::VarProcessor::PluginFactory, \
314  ::PhysicsTools::VarProcessor::Dummy, \
315  "VarProcessor/" #T)
316 
317 #endif // PhysicsTools_MVAComputer_VarProcessor_h
virtual ConfigCtx::Context * configureLoop(ConfigCtx::Context *ctx, ConfigCtx::iterator begin, ConfigCtx::iterator cur, ConfigCtx::iterator end)
virtual loop configure method
Definition: VarProcessor.cc:87
int i
Definition: DBlmapReader.cc:9
edmplugin::PluginFactory< Dummy *()> PluginFactory
Definition: VarProcessor.h:120
Config & operator[](size_type i)
Definition: VarProcessor.h:82
unsigned int size() const
number of values for current input variable
Definition: VarProcessor.h:183
void configure(ConfigCtx &config)
called from the discriminator computer to configure processor
Definition: VarProcessor.cc:53
Class describing an input variable.
Definition: Variable.h:34
void push_back(const Config &config)
Definition: VarProcessor.h:81
std::vector< Variable::Flags > flags
Definition: MVATrainer.cc:135
void deriv(double *input, int *conf, double *output, int *outConf, int *loop, unsigned int offset, unsigned int in, unsigned int out, std::vector< double > &deriv) const
run the processor evaluation pass on this processor and compute derivatives
ConfigCtx(std::vector< Variable::Flags > flags)
Definition: VarProcessor.cc:78
ConfIterator & operator()(Variable::Flags mask)
apply property flags mask to variable at current position
Definition: VarProcessor.h:131
void eval(double *input, int *conf, double *output, int *outConf, int *loop, unsigned int offset) const
run the processor evaluation pass on this processor
Definition: VarProcessor.h:99
ProcessRegistry< VarProcessor, Calibration::VarProcessor, const MVAComputer > Registry
Definition: VarProcessor.h:275
bool empty() const
checks for existence of values for current input variable
Definition: VarProcessor.h:193
uint16_t size_type
double * end() const
end of value array for current input variable
Definition: VarProcessor.h:190
MVATrainerComputer * calib
Definition: MVATrainer.cc:64
Main interface class to the generic discriminator computer framework.
Definition: MVAComputer.h:40
Iterator to loop over the input/output variable configuration.
Definition: VarProcessor.h:128
BitSet inputVars
bit set to select the input variables to be passed to this processor
Definition: VarProcessor.h:301
A compact container for storing single bits.
Definition: BitSet.h:30
Config_t::const_iterator const_iterator
Definition: VarProcessor.h:69
double operator*()
the (first or only) value for the current input variable
Definition: VarProcessor.h:196
#define end
Definition: vmac.h:38
unsigned int offset(bool)
Container::value_type value_type
double * begin() const
begin of value array for current input variable
Definition: VarProcessor.h:187
ConfIterator & operator++()
move to next input variable
Definition: VarProcessor.h:158
tuple conf
Definition: dbtoconf.py:185
tuple out
Definition: dbtoconf.py:99
std::size_t size_t
Definition: BitSet.h:32
const MVAComputer * computer
Definition: VarProcessor.h:297
ValueIterator & operator<<(double value)
add computed value to current output variable
Definition: VarProcessor.h:204
virtual LoopStatus loop(double *output, int *outConf, unsigned int nOutput, unsigned int &nOffset) const
Definition: VarProcessor.h:114
ConfIterator(BitSet::Iterator cur, ConfigCtx &config)
Definition: VarProcessor.h:167
void operator()()
finish current output variable, move to next slot
Definition: VarProcessor.h:208
VarProcessor(const char *name, const Calibration::VarProcessor *calib, const MVAComputer *computer)
Definition: VarProcessor.cc:38
#define begin
Definition: vmac.h:31
double operator[](unsigned int idx)
value idx of current input variable
Definition: VarProcessor.h:200
Iterator iter() const
create iterator over all set bits
Definition: BitSet.h:180
ValueIterator & operator++()
move to next input variable
Definition: VarProcessor.h:225
virtual std::vector< double > deriv(ValueIterator iter, unsigned int n) const
virtual derivative evaluation method, implemented in actual processor
Definition: VarProcessor.h:292
Iterates over all set bits of a BitSet.
Definition: BitSet.h:78
Generic registry template for polymorphic processor implementations.
ValueIterator(BitSet::Iterator cur, double *values, int *conf, double *output, int *outConf, int *loop, unsigned int offset)
Definition: VarProcessor.h:247
Helper class for discriminator computer set-up procedure.
Definition: VarProcessor.h:53
Config(Variable::Flags mask, unsigned int origin)
Definition: VarProcessor.h:55
SurfaceDeformation * create(int type, const std::vector< double > &params)
ConfIterator & operator<<(Config config_)
add a new output variable configuration config_
Definition: VarProcessor.h:139
Common base class for variable processors.
Definition: VarProcessor.h:39
Variable::Flags operator*() const
return the current input variable flags
Definition: VarProcessor.h:151
const_iterator begin() const
Definition: VarProcessor.h:77