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.cc
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#include "pybind11/pybind11.h"
25#include "pybind11/eigen.h"
26#include "pybind11/stl.h"
27
28#include "ndarray/pybind11.h"
29
31
32namespace py = pybind11;
33using namespace pybind11::literals;
34
35namespace lsst {
36namespace meas {
37namespace modelfit {
38namespace {
39
40using Sampler = TruncatedGaussianSampler;
41using Evaluator = TruncatedGaussianEvaluator;
42using LogEvaluator = TruncatedGaussianLogEvaluator;
43
44using PyTruncatedGaussian = py::class_<TruncatedGaussian, std::shared_ptr<TruncatedGaussian>>;
45using PySampler = py::class_<Sampler, std::shared_ptr<Sampler>>;
46using PyEvaluator = py::class_<Evaluator, std::shared_ptr<Evaluator>>;
47using PyLogEvaluator = py::class_<LogEvaluator, std::shared_ptr<LogEvaluator>>;
48
49// Shared wrapper code for the TruncatedGaussianLogEvaluator and
50// TruncatedGaussianEvaluator classes, which have the exact same interface.
51// 'name' should be one of ("Evaluator", "LogEvaluator").
52template <typename Class, typename PyClass>
53static PyClass declareEvaluator(py::module &mod, std::string const &name) {
54 PyClass cls(mod, ("TruncatedGaussian" + name).c_str());
55 cls.def(py::init<TruncatedGaussian const &>(), "parent"_a);
56 cls.def("__call__",
57 (Scalar (Class::*)(ndarray::Array<Scalar const, 1, 1> const &) const) & Class::operator(),
58 "alpha"_a);
59 cls.def("__call__", (void (Class::*)(ndarray::Array<Scalar const, 2, 1> const &,
60 ndarray::Array<Scalar, 1, 1> const &) const) &
61 Class::operator(),
62 "alpha"_a, "output"_a);
63 // Third overload of operator() is just an Eigen version of the ndarray one, so it's
64 // redundant in Python.
65 return cls;
66}
67
68PYBIND11_MODULE(truncatedGaussian, mod) {
69 py::module::import("lsst.afw.math");
70
71 PyTruncatedGaussian cls(mod, "TruncatedGaussian");
72 py::enum_<TruncatedGaussian::SampleStrategy>(cls, "SampleStrategy")
73 .value("DIRECT_WITH_REJECTION", TruncatedGaussian::DIRECT_WITH_REJECTION)
74 .value("ALIGN_AND_WEIGHT", TruncatedGaussian::ALIGN_AND_WEIGHT)
75 .export_values();
76 cls.def_static("fromSeriesParameters", &TruncatedGaussian::fromSeriesParameters, "q0"_a, "gradient"_a,
77 "hessian"_a);
78 cls.def_static("fromStandardParameters", &TruncatedGaussian::fromStandardParameters, "mean"_a,
79 "covariance"_a);
80 cls.def("sample", (Sampler (TruncatedGaussian::*)(TruncatedGaussian::SampleStrategy) const) &
82 "strategy"_a);
83 cls.def("sample", (Sampler (TruncatedGaussian::*)(Scalar) const) & TruncatedGaussian::sample,
84 "minRejectionEfficiency"_a = 0.1);
85 cls.def("evaluateLog", &TruncatedGaussian::evaluateLog);
86 cls.def("evaluate", &TruncatedGaussian::evaluate);
87 cls.def("getDim", &TruncatedGaussian::getDim);
88 cls.def("maximize", &TruncatedGaussian::maximize);
89 cls.def("getUntruncatedFraction", &TruncatedGaussian::getUntruncatedFraction);
90 cls.def("getLogPeakAmplitude", &TruncatedGaussian::getLogPeakAmplitude);
91 cls.def("getLogIntegral", &TruncatedGaussian::getLogIntegral);
92
93 cls.attr("LogEvaluator") = declareEvaluator<LogEvaluator, PyLogEvaluator>(mod, "LogEvaluator");
94 cls.attr("Evaluator") = declareEvaluator<Evaluator, PyEvaluator>(mod, "Evaluator");
95
96 PySampler clsSampler(mod, "TruncatedGaussianSampler");
97 clsSampler.def(py::init<TruncatedGaussian const &, TruncatedGaussian::SampleStrategy>(), "parent"_a,
98 "strategy"_a);
99 clsSampler.def("__call__",
100 (Scalar (Sampler::*)(afw::math::Random &, ndarray::Array<Scalar, 1, 1> const &) const) &
101 Sampler::operator(),
102 "rng"_a, "alpha"_a);
103 clsSampler.def("__call__", (void (Sampler::*)(afw::math::Random &, ndarray::Array<Scalar, 2, 1> const &,
104 ndarray::Array<Scalar, 1, 1> const &, bool) const) &
105 Sampler::operator(),
106 "rng"_a, "alpha"_a, "weights"_a, "multiplyWeights"_a = false);
107
108 cls.attr("Sampler") = clsSampler;
109}
110
111}
112}
113}
114} // namespace lsst::meas::modelfit::anonymous
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.
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.
PYBIND11_MODULE(_cameraGeom, mod)
Definition: _cameraGeom.cc:38
py::class_< PixelAreaBoundedField, std::shared_ptr< PixelAreaBoundedField >, BoundedField > PyClass
double Scalar
Typedefs to be used for probability and parameter values.
Definition: common.h:44