1 #ifndef NPSTAT_LORPE1DFIXEDDEGREECVPICKER_HH_
2 #define NPSTAT_LORPE1DFIXEDDEGREECVPICKER_HH_
39 fixedDegree_(fixedDegree)
41 assert(fixedDegree_ >= 0.0);
46 inline virtual double operator()(
const double& bwFactor)
const
48 const double cv = lorpe_(fixedDegree_, bwFactor);
49 const auto insertResult = cvValues_.insert(std::make_pair(bwFactor,cv));
50 assert(insertResult.second);
54 inline std::pair<double,bool> getMemoized(
const double bwFactor)
const
56 const auto it = cvValues_.find(bwFactor);
57 if (it == cvValues_.end())
58 return std::make_pair(0.0,
false);
60 return std::make_pair(it->second,
true);
66 mutable std::map<double,double> cvValues_;
74 const double minBwFactor,
75 const double maxBwFactor,
76 const unsigned nBwFactors,
77 const double firstBwFactorToTry,
78 const unsigned initialStepSizeInFactorsGridCells)
81 initialStep_(initialStepSizeInFactorsGridCells)
83 if (fixedDegree_ < 0.0)
throw std::invalid_argument(
84 "In npstat::LOrPE1DFixedDegreeCVPicker constructor: "
85 "degree argument must be non-negative");
86 if (minBwFactor >= maxBwFactor)
throw std::invalid_argument(
87 "In npstat::LOrPE1DFixedDegreeCVPicker constructor: "
88 "minimum factor must be less than maximum");
89 i0_ = bandwidthFactors_.getInterval(firstBwFactorToTry).first;
90 assert(i0_ < nBwFactors);
95 inline unsigned nBwFactors()
const {
return bandwidthFactors_.nCoords();}
96 inline double getBwFactor(
const unsigned i)
const {
return bandwidthFactors_.coordinate(i);}
97 inline double searchStart()
const {
return bandwidthFactors_.coordinate(i0_);}
104 const unsigned nscan = bandwidthFactors_.nCoords();
105 const Helper helper(lorpe, fixedDegree_);
106 unsigned imin = UINT_MAX;
107 double fMinusOne, fmin, fPlusOne;
110 helper, bandwidthFactors_, i0_, initialStep_,
111 &imin, &fMinusOne, &fmin, &fPlusOne);
113 if (status == MIN_SEARCH_FAILED)
118 std::vector<double> buffer(2*nscan);
119 double* bwLogs = &buffer[0];
120 double* cvValues = bwLogs + nscan;
122 for (
unsigned i=0; i<nscan; ++i)
124 const double bwFactor = bandwidthFactors_.coordinate(i);
125 bwLogs[i] = std::log(bwFactor);
126 const std::pair<double,bool>& searched = helper.getMemoized(bwFactor);
128 cvValues[i] = searched.first;
130 cvValues[i] = lorpe(fixedDegree_, bwFactor);
136 fixedDegree_, std::exp(scanMax.location()), scanMax.value(),
137 true, scanMax.isOnTheBoundary());
139 else if (status == MIN_SEARCH_OK)
142 assert(imin + 1U < nscan);
144 const double bwMin = bandwidthFactors_.coordinate(imin-1U);
145 const double bwFactor = bandwidthFactors_.coordinate(imin);
146 const double bwMax = bandwidthFactors_.coordinate(imin+1U);
149 double extremumCoordinate, extremumValue;
151 std::log(bwMin), fMinusOne,
152 std::log(bwFactor), fmin,
153 std::log(bwMax), fPlusOne,
154 &extremumCoordinate, &extremumValue);
158 fixedDegree_, std::exp(extremumCoordinate), -extremumValue,
164 assert(imin < nscan);
165 const double bwFactor = bandwidthFactors_.coordinate(imin);
166 const std::pair<double,bool>& searched = helper.getMemoized(bwFactor);
167 assert(searched.second);
169 fixedDegree_, bwFactor, searched.first,
true,
true);
177 unsigned initialStep_;
Represent both equidistant and non-uniform coordinate sets for rectangular grids.
Equidistant sequences of points in either linear or log space.
An object representing the result of the 1-d LOrPE cross-validation procedure.
Various simple mathematical utilities which did not end up inside dedicated headers.
Finding extrema of scanned 1-d curves.
Interface definitions and concrete simple functors for a variety of functor-based calculations.
Definition: DualAxis.hh:25
Definition: EquidistantSequence.hh:55
Definition: LOrPE1DCVResult.hh:19
Definition: LOrPE1DFixedDegreeCVPicker.hh:71
Definition: LOrPE1DFixedDegreeCVPicker.hh:35
Definition: ScanExtremum1D.hh:16
Search for 1-d function minimum in log space using the golden section method.
Definition: AbsArrayProjector.hh:14
MinSearchStatus1D goldenSectionSearchOnAGrid(const Functor1< double, double > &f, const DualAxis &axis, unsigned i0, unsigned initialStep, unsigned *imin, double *fMinusOne, double *fmin, double *fPlusOne)
bool parabolicExtremum(double x0, double y0, double x1, double y1, double x2, double y2, double *extremumCoordinate, double *extremumValue)
Definition: SimpleFunctors.hh:58