LSSTApplications  17.0+124,17.0+14,17.0+73,18.0.0+37,18.0.0+80,18.0.0-4-g68ffd23+4,18.1.0-1-g0001055+12,18.1.0-1-g03d53ef+5,18.1.0-1-g1349e88+55,18.1.0-1-g2505f39+44,18.1.0-1-g5315e5e+4,18.1.0-1-g5e4b7ea+14,18.1.0-1-g7e8fceb+4,18.1.0-1-g85f8cd4+48,18.1.0-1-g8ff0b9f+4,18.1.0-1-ga2c679d+1,18.1.0-1-gd55f500+35,18.1.0-10-gb58edde+2,18.1.0-11-g0997b02+4,18.1.0-13-gfe4edf0b+12,18.1.0-14-g259bd21+21,18.1.0-19-gdb69f3f+2,18.1.0-2-g5f9922c+24,18.1.0-2-gd3b74e5+11,18.1.0-2-gfbf3545+32,18.1.0-26-g728bddb4+5,18.1.0-27-g6ff7ca9+2,18.1.0-3-g52aa583+25,18.1.0-3-g8ea57af+9,18.1.0-3-gb69f684+42,18.1.0-3-gfcaddf3+6,18.1.0-32-gd8786685a,18.1.0-4-gf3f9b77+6,18.1.0-5-g1dd662b+2,18.1.0-5-g6dbcb01+41,18.1.0-6-gae77429+3,18.1.0-7-g9d75d83+9,18.1.0-7-gae09a6d+30,18.1.0-9-gc381ef5+4,w.2019.45
LSSTDataManagementBasePackage
TruncatedGaussian.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 /*
3  * LSST Data Management System
4  * Copyright 2008-2013 LSST Corporation.
5  *
6  * This product includes software developed by the
7  * LSST Project (http://www.lsst.org/).
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the LSST License Statement and
20  * the GNU General Public License along with this program. If not,
21  * see <http://www.lsstcorp.org/LegalNotices/>.
22  */
23 
24 #ifndef LSST_MEAS_MODELFIT_TruncatedGaussian_h_INCLUDED
25 #define LSST_MEAS_MODELFIT_TruncatedGaussian_h_INCLUDED
26 
27 #include "Eigen/Core"
28 #include "ndarray.h"
29 
30 #include "lsst/base.h"
31 #include "lsst/afw/math/Random.h"
33 
34 // TODO: we should really integrate this with Mixture somehow
35 
36 namespace lsst { namespace meas { namespace modelfit {
37 
38 class TruncatedGaussianSampler;
39 class TruncatedGaussianEvaluator;
40 class TruncatedGaussianLogEvaluator;
41 
60 public:
61 
64 
85  };
86 
90 
125  static TruncatedGaussian fromSeriesParameters(Scalar q0, Vector const & gradient, Matrix const & hessian);
126 
154  static TruncatedGaussian fromStandardParameters(Vector const & mean, Matrix const & covariance);
155 
163  Sampler sample(SampleStrategy strategy) const;
164 
173  Sampler sample(Scalar minRejectionEfficiency=0.1) const;
174 
176  LogEvaluator evaluateLog() const;
177 
179  Evaluator evaluate() const;
180 
182  int getDim() const;
183 
191  Vector maximize() const;
192 
204 
211  Scalar getLogPeakAmplitude() const;
212 
226  Scalar getLogIntegral() const;
227 
229 
230 private:
231 
234 
235  class Impl;
236 
237  explicit TruncatedGaussian(PTR(Impl) impl) : _impl(impl) {}
238 
239  PTR(Impl) _impl;
240 };
241 
246 public:
247 
248  explicit TruncatedGaussianLogEvaluator(TruncatedGaussian const & parent);
249 
250  template <typename Derived>
251  Scalar operator()(Eigen::MatrixBase<Derived> const & alpha) const {
252  if ((alpha.array() < 0.0).any()) return std::numeric_limits<Scalar>::infinity();
253  _workspace = alpha - _mu;
254  return 0.5*(_rootH*_workspace).squaredNorm() + _norm;
255  }
256 
257  Scalar operator()(ndarray::Array<Scalar const,1,1> const & alpha) const;
258 
259  void operator()(
260  ndarray::Array<Scalar const,2,1> const & alpha,
261  ndarray::Array<Scalar,1,1> const & output
262  ) const;
263 
264 protected:
269 };
270 
275 public:
276 
278  _internal(parent)
279  {}
280 
281  template <typename Derived>
282  Scalar operator()(Eigen::MatrixBase<Derived> const & alpha) const {
283  return std::exp(-_internal(alpha));
284  }
285 
286  Scalar operator()(ndarray::Array<Scalar const,1,1> const & alpha) const;
287 
288  void operator()(
289  ndarray::Array<Scalar const,2,1> const & alpha,
290  ndarray::Array<Scalar,1,1> const & output
291  ) const;
292 
293 private:
295 };
296 
301 public:
302 
303  explicit TruncatedGaussianSampler(
304  TruncatedGaussian const & parent,
306  );
307 
316  Scalar operator()(afw::math::Random & rng, ndarray::Array<Scalar,1,1> const & alpha) const;
317 
327  void operator()(
328  afw::math::Random & rng,
329  ndarray::Array<Scalar,2,1> const & alpha,
330  ndarray::Array<Scalar,1,1> const & weights,
331  bool multiplyWeights=false
332  ) const;
333 
334  ~TruncatedGaussianSampler(); // defined in .cc so it can see Impl's dtor
335 
336  class Impl; // public so we can inherit from it in the .cc file
337 
338 private:
339  PTR(Impl) _impl;
340 };
341 
343  return Sampler(*this, strategy);
344 }
345 
346 inline TruncatedGaussian::Sampler TruncatedGaussian::sample(Scalar minRejectionEfficiency) const {
347  return Sampler(
348  *this,
349  (getUntruncatedFraction() < minRejectionEfficiency) ? ALIGN_AND_WEIGHT : DIRECT_WITH_REJECTION
350  );
351 }
352 
354 
356 
357 }}} // namespace lsst::meas::modelfit
358 
359 #endif // !LSST_MEAS_MODELFIT_TruncatedGaussian_h_INCLUDED
static TruncatedGaussian fromStandardParameters(Vector const &mean, Matrix const &covariance)
Create from the "standard" mean and covariance parameters of the normal distribution.
TruncatedGaussianLogEvaluator LogEvaluator
Scalar getLogPeakAmplitude() const
Return the -log of the peak amplitude of the untruncated function.
T exp(T... args)
TruncatedGaussianEvaluator(TruncatedGaussian const &parent)
Helper class for drawing samples from a TruncatedGaussian.
Sampler sample(SampleStrategy strategy) const
Create a Sampler object that uses the given strategy.
double Scalar
Typedefs to be used for probability and parameter values.
Definition: common.h:44
Scalar getUntruncatedFraction() const
Return the fraction of the Gaussian integral that was truncated by the bounds.
MatrixQ covariance
Definition: simpleShape.cc:152
Scalar operator()(Eigen::MatrixBase< Derived > const &alpha) const
A base class for image defects.
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > Matrix
Typedefs to be used for probability and parameter values.
Definition: common.h:45
Represents a multidimensional Gaussian function truncated at zero.
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Typedefs to be used for probability and parameter values.
Definition: common.h:46
Vector maximize() const
Return the location of the maximum of the truncated Gaussian.
SampleStrategy
Enum that describes different ways of sampling from a multidimensional TruncatedGaussian.
Helper class for evaluating the -log of a TruncatedGaussian.
Create a similar Gaussian with no x-y covariance, and importance sample by drawing from the independe...
LogEvaluator evaluateLog() const
Create a LogEvaluator object that can be used to efficiently evaluate the -log of the function...
Helper class for evaluating the -log of a TruncatedGaussian.
Basic LSST definitions.
Evaluator evaluate() const
Create an Evaluator object that can be used to efficiently evaluate the function. ...
Draw from the untruncated Gaussian, and discard negative draws.
Scalar operator()(Eigen::MatrixBase< Derived > const &alpha) const
TruncatedGaussianEvaluator Evaluator
int getDim() const
Return the dimensionality of the function.
Scalar getLogIntegral() const
Return the -log of the integral of the truncated function.
static TruncatedGaussian fromSeriesParameters(Scalar q0, Vector const &gradient, Matrix const &hessian)
Create from the first and second logarithmic derivatives of the Gaussian.
A class that can be used to generate sequences of random numbers according to a number of different a...
Definition: Random.h:57
#define PTR(...)
Definition: base.h:41