npstat is hosted by Hepforge, IPPP Durham
NPStat  5.10.0
AbsSparseUnfoldingFilterND.hh
Go to the documentation of this file.
1 #ifndef EMSUNFOLD_ABSSPARSEUNFOLDINGFILTERND_HH_
2 #define EMSUNFOLD_ABSSPARSEUNFOLDINGFILTERND_HH_
3 
4 /*!
5 // \file AbsSparseUnfoldingFilterND.hh
6 //
7 // \brief Interface for smoothing filters representable by sparse matrices
8 //
9 // Author: I. Volobouev
10 //
11 // July 2014
12 */
13 
14 #include <typeinfo>
15 
16 #include "geners/ClassId.hh"
17 #include "geners/CPP11_auto_ptr.hh"
18 #include "geners/AbsReader.hh"
19 
20 #include "npstat/nm/ArrayND.hh"
22 
23 #include "Eigen/SparseCore"
24 
25 namespace emsunfold {
27  {
28  public:
29  typedef Eigen::Triplet<double,int> triplet_type;
30 
31  inline virtual ~AbsSparseUnfoldingFilterND() {}
32 
33  virtual void filter(const npstat::ArrayND<double>& in,
34  npstat::ArrayND<double>* out) const = 0;
35 
36  virtual void convolve(const npstat::ArrayND<double>& in,
37  npstat::ArrayND<double>* out) const = 0;
38 
39  virtual CPP11_auto_ptr<std::vector<triplet_type> >
40  sparseFilterTriplets() const = 0;
41 
42  inline bool operator==(const AbsSparseUnfoldingFilterND& r) const
43  {return (typeid(*this) == typeid(r)) && this->isEqual(r);}
44 
45  inline bool operator!=(const AbsSparseUnfoldingFilterND& r) const
46  {return !(*this == r);}
47 
48  //@{
49  /** Prototype needed for I/O */
50  virtual gs::ClassId classId() const = 0;
51  virtual bool write(std::ostream&) const = 0;
52  //@}
53 
54  static inline const char* classname()
55  {return "emsunfold::AbsSparseUnfoldingFilterND";}
56  static inline unsigned version() {return 1;}
57  static AbsSparseUnfoldingFilterND* read(const gs::ClassId& id,
58  std::istream&);
59  protected:
60  virtual bool isEqual(const AbsSparseUnfoldingFilterND&) const = 0;
61  };
62 
63 
64  template<class Impl>
66  {
67  public:
68  inline SparseUnfoldingFilterND(const Impl *filt, const bool own)
69  : impl_(filt), owns_(own) {assert(impl_);}
70 
71  inline virtual ~SparseUnfoldingFilterND() {if (owns_) delete impl_;}
72 
73  inline unsigned dim() const {return impl_->dim();}
74 
75  inline std::vector<unsigned> dataShape() const
76  {return impl_->dataShape();}
77 
78  inline double selfContribution(
79  const unsigned* index, const unsigned lenIndex) const
80  {return impl_->selfContribution(index, lenIndex);}
81 
82  inline double linearSelfContribution(const unsigned long index) const
83  {return impl_->linearSelfContribution(index);}
84 
85  inline void filter(const npstat::ArrayND<double>& in,
86  npstat::ArrayND<double>* out) const
87  {impl_->filter(in, out);}
88 
89  inline void convolve(const npstat::ArrayND<double>& in,
90  npstat::ArrayND<double>* out) const
91  {impl_->convolve(in, out);}
92 
93  inline CPP11_auto_ptr<std::vector<triplet_type> >
94  sparseFilterTriplets() const
95  {return impl_->template sparseFilterTriplets<triplet_type>();}
96 
97  //@{
98  /** Method related to "geners" I/O */
99  inline virtual gs::ClassId classId() const {return gs::ClassId(*this);}
100  inline virtual bool write(std::ostream& of) const
101  {return impl_->classId().write(of) && impl_->write(of);}
102  //@}
103 
104  static inline const char* classname()
105  {
106  static const std::string name(gs::template_class_name<Impl>(
107  "emsunfold::SparseUnfoldingFilterND"));
108  return name.c_str();
109  }
110 
111  static inline unsigned version() {return 1;}
112 
113  static inline SparseUnfoldingFilterND* read(const gs::ClassId& id,
114  std::istream& in)
115  {
116  static const gs::ClassId current(
117  gs::ClassId::makeId<SparseUnfoldingFilterND>());
118  current.ensureSameId(id);
119  gs::ClassId id1(in, 1);
120  CPP11_auto_ptr<Impl> ptr(Impl::read(id1, in));
121  SparseUnfoldingFilterND* p =
122  new SparseUnfoldingFilterND(ptr.get(), true);
123  ptr.release();
124  return p;
125  }
126 
127  protected:
128  inline virtual bool isEqual(const AbsSparseUnfoldingFilterND& r) const
129  {return *impl_ == *(static_cast<const SparseUnfoldingFilterND&>(r)).impl_;}
130 
131  private:
132  SparseUnfoldingFilterND();
133  SparseUnfoldingFilterND(const SparseUnfoldingFilterND&);
134  SparseUnfoldingFilterND& operator=(const SparseUnfoldingFilterND&);
135 
136  const Impl* impl_;
137  bool owns_;
138  };
139 
140 
141  class SparseUnfoldingFilterNDReader : public gs::DefaultReader<AbsSparseUnfoldingFilterND>
142  {
143  typedef gs::DefaultReader<AbsSparseUnfoldingFilterND> Base;
144  friend class gs::StaticReader<SparseUnfoldingFilterNDReader>;
146  };
147 
148 
149  /** Factory for deserializing filters representable by sparse matrices */
150  typedef gs::StaticReader<SparseUnfoldingFilterNDReader>
152 
153 
154  inline AbsSparseUnfoldingFilterND* AbsSparseUnfoldingFilterND::read(
155  const gs::ClassId& id, std::istream& in)
156  {
157  return StaticSparseUnfoldingFilterNDReader::instance().read(id, in);
158  }
159 }
160 
161 #endif // EMSUNFOLD_ABSSPARSEUNFOLDINGFILTERND_HH_
Interface definition for multivariate smoothers that can be cross-validated.
Arbitrary-dimensional array template.
Definition: AbsSparseUnfoldingFilterND.hh:27
virtual gs::ClassId classId() const =0
Definition: AbsSparseUnfoldingFilterND.hh:142
Definition: AbsSparseUnfoldingFilterND.hh:66
double selfContribution(const unsigned *index, const unsigned lenIndex) const
Definition: AbsSparseUnfoldingFilterND.hh:78
double linearSelfContribution(const unsigned long index) const
Definition: AbsSparseUnfoldingFilterND.hh:82
std::vector< unsigned > dataShape() const
Definition: AbsSparseUnfoldingFilterND.hh:75
unsigned dim() const
Definition: AbsSparseUnfoldingFilterND.hh:73
virtual gs::ClassId classId() const
Definition: AbsSparseUnfoldingFilterND.hh:99
Definition: AbsSparseUnfoldingFilterND.hh:25
gs::StaticReader< SparseUnfoldingFilterNDReader > StaticSparseUnfoldingFilterNDReader
Definition: AbsSparseUnfoldingFilterND.hh:151
Definition: AbsPolyFilterND.hh:27