|
Go to the documentation of this file. 1 #ifndef NPSTAT_LOCALMULTIFILTER1D_HH_
2 #define NPSTAT_LOCALMULTIFILTER1D_HH_
22 #include "geners/CPP11_auto_ptr.hh"
23 #include "geners/ClassId.hh"
31 #include "npstat/wrap/arrayNDToNumpy.hh"
32 #include "npstat/wrap/numpyArrayUtils.hh"
63 { return !(* this == r);}
67 inline unsigned maxDegree() const { return maxDegree_;}
68 inline unsigned dataLen() const { return nbins_;}
79 template < typename Tin, typename Tout>
80 void filter( unsigned degree, const Tin* in,
81 unsigned dataLen, Tout* out) const;
89 template < typename Tin, typename Tout>
91 unsigned dataLen, Tout* out) const;
100 inline gs::ClassId classId() const { return gs::ClassId(* this);}
101 bool write(std::ostream& os) const;
103 static inline const char* classname()
104 { return "npstat::LocalMultiFilter1D";}
105 static inline unsigned version() { return 1;}
111 mutable std::vector<long double> sumBuffer_;
112 std::vector<PolyFilter1D*> unique_;
113 std::vector<PolyFilter1D**> bins_;
117 template < typename T>
118 double convolute( const T* data, const PolyFilter1D* filter) const;
120 void addWeightedFilter( long double w, unsigned degree,
121 unsigned binNum) const;
123 void clearSumBuffer() const;
126 void copyOtherData( const LocalMultiFilter1D&);
130 void fillFilterMatrix( unsigned degree, Matrix<double>* fm) const;
134 inline PyObject* filter_2( unsigned degree,
135 const double* in, unsigned dataLen,
136 const bool makeNonNegative = false) const
138 if (dataLen != nbins_) throw std::invalid_argument(
139 "In npstat::LocalPolyFilter1D::filter_2: "
140 "incompatible data length");
143 const int typenum = NumpyTypecode<double>::code;
144 npy_intp sh = dataLen;
145 PyObject* xarr = PyArray_SimpleNew(1, &sh, typenum);
148 double* out = ( double*)PyArray_DATA((PyArrayObject*)xarr);
151 this-> filter(degree, in, dataLen, out);
153 catch ( const std::exception& e)
159 for ( unsigned i=0; i<dataLen; ++i)
166 inline PyObject* convolve_2( unsigned degree,
167 const double* in, unsigned dataLen,
168 const bool makeNonNegative = false) const
170 if (dataLen != nbins_) throw std::invalid_argument(
171 "In npstat::LocalPolyFilter1D::convolve_2: "
172 "incompatible data length");
175 const int typenum = NumpyTypecode<double>::code;
176 npy_intp sh = dataLen;
177 PyObject* xarr = PyArray_SimpleNew(1, &sh, typenum);
180 double* out = ( double*)PyArray_DATA((PyArrayObject*)xarr);
183 this-> convolve(degree, in, dataLen, out);
185 catch ( const std::exception& e)
191 for ( unsigned i=0; i<dataLen; ++i)
198 inline void filterIntoBuffer( unsigned degree,
199 const double* in, unsigned dataLen,
200 double* out, unsigned outLen,
201 const bool makeNonNegative = false) const
203 if (dataLen != outLen) throw std::invalid_argument(
204 "In npstat::LocalMultiFilter1D::filterIntoBuffer: "
205 "incompatible array sizes");
206 this-> filter(degree, in, dataLen, out);
208 for ( unsigned i=0; i<dataLen; ++i)
213 inline void convolveIntoBuffer( unsigned degree,
214 const double* in, unsigned dataLen,
215 double* out, unsigned outLen,
216 const bool makeNonNegative = false) const
218 if (dataLen != outLen) throw std::invalid_argument(
219 "In npstat::LocalMultiFilter1D::convolveIntoBuffer: "
220 "incompatible array sizes");
221 this-> convolve(degree, in, dataLen, out);
223 for ( unsigned i=0; i<dataLen; ++i)
260 int m, double bandwidth, unsigned maxDegree,
261 unsigned numberOfGridPoints, double xmin, double xmax,
263 const unsigned char* exclusionMask = 0,
264 bool excludeCentralPoint = false);
268 int m, double bandwidth, unsigned maxDegree,
269 unsigned numberOfGridPoints, double xmin, double xmax,
271 const unsigned char* exclusionMask, unsigned maskLength,
272 bool excludeCentralPoint = false)
274 const unsigned char* mask = 0;
277 assert(exclusionMask);
278 mask = exclusionMask;
279 if (maskLength != numberOfGridPoints) throw std::invalid_argument(
280 "In npstat::symbetaMultiFilter1D_2: incompatible mask length");
283 m, bandwidth, maxDegree, numberOfGridPoints, xmin, xmax,
284 boundaryMethod, mask, excludeCentralPoint);
285 return ptr.release();
290 #include "npstat/stat/LocalMultiFilter1D.icc"
Abstract interface for building local polynomial filter weights in 1-d.
API for LOrPE boundary handling methods.
Definition: BoundaryHandling.hh:21
Definition: LocalMultiFilter1D.hh:37
void filter(unsigned degree, const Tin *in, unsigned dataLen, Tout *out) const
unsigned maxDegree() const Definition: LocalMultiFilter1D.hh:67
void convolve(unsigned degree, const Tin *in, unsigned dataLen, Tout *out) const
LocalMultiFilter1D(unsigned maxDegree, const OrthoPolyFilter1DBuilder &filterBuilder, unsigned dataLen)
const PolyFilter1D & getFilter(unsigned degree, unsigned binNumber) const
Matrix< double > getFilterMatrix(unsigned degree) const
Definition: AbsFilter1DBuilder.hh:34
Definition: AbsArrayProjector.hh:14
CPP11_auto_ptr< LocalMultiFilter1D > symbetaMultiFilter1D(int m, double bandwidth, unsigned maxDegree, unsigned numberOfGridPoints, double xmin, double xmax, const BoundaryHandling &boundaryMethod, const unsigned char *exclusionMask=0, bool excludeCentralPoint=false)
Definition: AbsFilter1DBuilder.hh:129
|