1 #ifndef NPSTAT_SOLVEFORLORPEWEIGHTS_HH_
2 #define NPSTAT_SOLVEFORLORPEWEIGHTS_HH_
29 const bool i_converged,
30 const unsigned i_nIterations,
32 : cvResult_(cvResult),
34 nIterations_(i_nIterations),
35 converged_(i_converged)
38 assert(cvResult_.isValid());
41 inline double filterDegree()
const {
return cvResult_.filterDegree();}
42 inline double bwFactor()
const {
return cvResult_.bwFactor();}
43 inline double cvFunction()
const {
return cvResult_.cvFunction();}
44 inline bool isOnDegreeBoundary()
const {
return cvResult_.isOnDegreeBoundary();}
45 inline bool isOnBandwidthBoundary()
const {
return cvResult_.isOnBandwidthBoundary();}
47 inline double alpha()
const {
return alpha_;}
48 inline unsigned nIterations()
const {
return nIterations_;}
49 inline bool converged()
const {
return converged_;}
51 void print(std::ostream& os)
const;
56 unsigned nIterations_;
61 template<
class Lorpe,
class CvRunner,
class ConvergenceCalculator>
63 Lorpe& lorpe,
const CvRunner& cvRunner,
65 const ConvergenceCalculator& conv,
const unsigned maxIterations)
67 const auto& sample = lorpe.coords();
68 const unsigned long sampleSize = sample.size();
70 std::vector<double> signalDensity(sampleSize);
71 for (
unsigned long i=0; i<sampleSize; ++i)
72 signalDensity[i] = signal.
density(sample[i].first);
74 std::vector<double> weightBuffer(sampleSize*2);
75 double* previousWeights = &weightBuffer[0];
76 double* currentWeights = previousWeights + sampleSize;
77 for (
unsigned long i=0; i<sampleSize; ++i)
78 previousWeights[i] = sample[i].second;
80 std::vector<double> bgDensityBuffer(sampleSize*2);
81 double* previousBg = &bgDensityBuffer[0];
82 double* currentBg = previousBg + sampleSize;
90 const double filterDegree = cvResult.filterDegree();
91 const double bwFactor = cvResult.bwFactor();
93 for (
unsigned long i=0; i<sampleSize; ++i)
95 previousBg[i] = lorpe.density(
96 sample[i].first, filterDegree, bwFactor);
97 assert(previousBg[i] >= 0.0);
101 bool converged =
false;
103 for (; iter<maxIterations && !converged; ++iter)
106 for (
unsigned long i=0; i<sampleSize; ++i)
108 if (previousBg[i] > 0.0)
110 const double d = alpha*signalDensity[i] +
111 (1.0 - alpha)*previousBg[i];
113 currentWeights[i] = previousBg[i]/d;
116 currentWeights[i] = 0.0;
118 lorpe.setWeights(currentWeights, sampleSize);
121 cvResult = cvRunner.crossValidate(lorpe);
122 const double filterDegree = cvResult.filterDegree();
123 const double bwFactor = cvResult.bwFactor();
126 for (
unsigned long i=0; i<sampleSize; ++i)
128 currentBg[i] = lorpe.density(
129 sample[i].first, filterDegree, bwFactor);
130 assert(currentBg[i] >= 0.0);
134 converged = conv.converged(lorpe,
135 previousWeights, currentWeights,
136 previousBg, currentBg);
139 std::swap(previousWeights, currentWeights);
140 std::swap(previousBg, currentBg);
143 return LOrPEWeightsResult(alpha, converged, iter, cvResult);
Interface definition for 1-d continuous statistical distributions.
An object representing the result of the 1-d LOrPE cross-validation procedure.
Definition: LOrPE1DCVResult.hh:19
Definition: solveForLOrPEWeights.hh:26
Definition: AbsArrayProjector.hh:14
Definition: AbsDistribution1D.hh:31
virtual double density(double x) const =0