LSST Applications g070148d5b3+33e5256705,g0d53e28543+25c8b88941,g0da5cf3356+2dd1178308,g1081da9e2a+62d12e78cb,g17e5ecfddb+7e422d6136,g1c76d35bf8+ede3a706f7,g295839609d+225697d880,g2e2c1a68ba+cc1f6f037e,g2ffcdf413f+853cd4dcde,g38293774b4+62d12e78cb,g3b44f30a73+d953f1ac34,g48ccf36440+885b902d19,g4b2f1765b6+7dedbde6d2,g5320a0a9f6+0c5d6105b6,g56b687f8c9+ede3a706f7,g5c4744a4d9+ef6ac23297,g5ffd174ac0+0c5d6105b6,g6075d09f38+66af417445,g667d525e37+2ced63db88,g670421136f+2ced63db88,g71f27ac40c+2ced63db88,g774830318a+463cbe8d1f,g7876bc68e5+1d137996f1,g7985c39107+62d12e78cb,g7fdac2220c+0fd8241c05,g96f01af41f+368e6903a7,g9ca82378b8+2ced63db88,g9d27549199+ef6ac23297,gabe93b2c52+e3573e3735,gb065e2a02a+3dfbe639da,gbc3249ced9+0c5d6105b6,gbec6a3398f+0c5d6105b6,gc9534b9d65+35b9f25267,gd01420fc67+0c5d6105b6,geee7ff78d7+a14128c129,gf63283c776+ede3a706f7,gfed783d017+0c5d6105b6,w.2022.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
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"
33
34// TODO: we should really integrate this with Mixture somehow
35
36namespace lsst { namespace meas { namespace modelfit {
37
38class TruncatedGaussianSampler;
39class TruncatedGaussianEvaluator;
40class TruncatedGaussianLogEvaluator;
41
60public:
61
64
85 };
86
90
125 static TruncatedGaussian fromSeriesParameters(Scalar q0, Vector const & gradient, Matrix const & hessian);
126
155
163 Sampler sample(SampleStrategy strategy) const;
164
173 Sampler sample(Scalar minRejectionEfficiency=0.1) const;
174
177
179 Evaluator evaluate() const;
180
182 int getDim() const;
183
192
204
212
227
229
230private:
231
234
235 class Impl;
236
237 explicit TruncatedGaussian(std::shared_ptr<Impl> impl) : _impl(impl) {}
238
240};
241
246public:
247
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
260 ndarray::Array<Scalar const,2,1> const & alpha,
261 ndarray::Array<Scalar,1,1> const & output
262 ) const;
263
264protected:
269};
270
275public:
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
289 ndarray::Array<Scalar const,2,1> const & alpha,
290 ndarray::Array<Scalar,1,1> const & output
291 ) const;
292
293private:
295};
296
301public:
302
304 TruncatedGaussian const & parent,
306 );
307
316 Scalar operator()(afw::math::Random & rng, ndarray::Array<Scalar,1,1> const & alpha) const;
317
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
338private:
340};
341
343 return Sampler(*this, strategy);
344}
345
346inline 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
Basic LSST definitions.
A class that can be used to generate sequences of random numbers according to a number of different a...
Definition: Random.h:57
Helper class for evaluating the -log of a TruncatedGaussian.
void operator()(ndarray::Array< Scalar const, 2, 1 > const &alpha, ndarray::Array< Scalar, 1, 1 > const &output) const
Scalar operator()(Eigen::MatrixBase< Derived > const &alpha) const
TruncatedGaussianEvaluator(TruncatedGaussian const &parent)
Scalar operator()(ndarray::Array< Scalar const, 1, 1 > const &alpha) const
Represents a multidimensional Gaussian function truncated at zero.
TruncatedGaussianLogEvaluator LogEvaluator
LogEvaluator evaluateLog() const
Create a LogEvaluator object that can be used to efficiently evaluate the -log of the function.
Scalar getLogIntegral() const
Return the -log of the integral of the truncated function.
Scalar getLogPeakAmplitude() const
Return the -log of the peak amplitude of the untruncated function.
Vector maximize() const
Return the location of the maximum of the truncated Gaussian.
int getDim() const
Return the dimensionality of the function.
TruncatedGaussianEvaluator Evaluator
static TruncatedGaussian fromStandardParameters(Vector const &mean, Matrix const &covariance)
Create from the "standard" mean and covariance parameters of the normal distribution.
SampleStrategy
Enum that describes different ways of sampling from a multidimensional TruncatedGaussian.
@ ALIGN_AND_WEIGHT
Create a similar Gaussian with no x-y covariance, and importance sample by drawing from the independe...
@ DIRECT_WITH_REJECTION
Draw from the untruncated Gaussian, and discard negative draws.
Scalar getUntruncatedFraction() const
Return the fraction of the Gaussian integral that was truncated by the bounds.
static TruncatedGaussian fromSeriesParameters(Scalar q0, Vector const &gradient, Matrix const &hessian)
Create from the first and second logarithmic derivatives of the Gaussian.
Evaluator evaluate() const
Create an Evaluator object that can be used to efficiently evaluate the function.
Sampler sample(SampleStrategy strategy) const
Create a Sampler object that uses the given strategy.
Helper class for evaluating the -log of a TruncatedGaussian.
void operator()(ndarray::Array< Scalar const, 2, 1 > const &alpha, ndarray::Array< Scalar, 1, 1 > const &output) const
Scalar operator()(ndarray::Array< Scalar const, 1, 1 > const &alpha) const
TruncatedGaussianLogEvaluator(TruncatedGaussian const &parent)
Scalar operator()(Eigen::MatrixBase< Derived > const &alpha) const
Helper class for drawing samples from a TruncatedGaussian.
Scalar operator()(afw::math::Random &rng, ndarray::Array< Scalar, 1, 1 > const &alpha) const
Draw a single sample from a TruncatedGaussian.
TruncatedGaussianSampler(TruncatedGaussian const &parent, TruncatedGaussian::SampleStrategy strategy)
void operator()(afw::math::Random &rng, ndarray::Array< Scalar, 2, 1 > const &alpha, ndarray::Array< Scalar, 1, 1 > const &weights, bool multiplyWeights=false) const
Draw multiple samples from a TruncatedGaussian.
T exp(T... args)
T infinity(T... args)
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > Vector
Definition: common.h:46
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic > Matrix
Definition: common.h:45
double Scalar
Typedefs to be used for probability and parameter values.
Definition: common.h:44
MatrixQ covariance
Definition: simpleShape.cc:152