LSSTApplications  19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
mixture.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 <sstream> // Python.h must come before even system headers
29 
30 #include "ndarray/pybind11.h"
31 #include "ndarray/eigen.h"
32 
33 #include "lsst/utils/python.h"
35 
36 namespace py = pybind11;
37 using namespace pybind11::literals;
38 
39 namespace lsst {
40 namespace meas {
41 namespace modelfit {
42 namespace {
43 
44 using PyMixtureComponent = py::class_<MixtureComponent>;
45 using PyMixtureUpdateRestriction =
46  py::class_<MixtureUpdateRestriction, std::shared_ptr<MixtureUpdateRestriction>>;
47 using PyMixture = py::class_<Mixture, std::shared_ptr<Mixture>>;
48 
49 static PyMixtureComponent declareMixtureComponent(py::module &mod) {
50  PyMixtureComponent cls(mod, "MixtureComponent");
51  cls.def("getDimension", &MixtureComponent::getDimension);
52  cls.def_readwrite("weight", &MixtureComponent::weight);
53  cls.def("getMu", &MixtureComponent::getMu);
54  cls.def("setMu", &MixtureComponent::setMu);
55  cls.def("getSigma", &MixtureComponent::getSigma);
56  cls.def("setSigma", &MixtureComponent::setSigma);
57  cls.def("project", (MixtureComponent (MixtureComponent::*)(int) const) & MixtureComponent::project,
58  "dim"_a);
59  cls.def("project", (MixtureComponent (MixtureComponent::*)(int, int) const) & MixtureComponent::project,
60  "dim1"_a, "dim2"_a);
61  cls.def(py::init<int>(), "dim"_a);
62  cls.def(py::init<Scalar, Vector const &, Matrix const &>(), "weight"_a, "mu"_a, "sigma"_a);
63  utils::python::addOutputOp(cls, "__str__");
64  utils::python::addOutputOp(cls, "__repr__");
65  return cls;
66 }
67 
68 static PyMixtureUpdateRestriction declareMixtureUpdateRestriction(py::module &mod) {
69  PyMixtureUpdateRestriction cls(mod, "MixtureUpdateRestriction");
70  cls.def("getDimension", &MixtureUpdateRestriction::getDimension);
71  cls.def(py::init<int>(), "dim"_a);
72  // The rest of this interface isn't usable in Python, and doesn't need to be.
73  return cls;
74 }
75 
76 static PyMixture declareMixture(py::module &mod) {
77  PyMixture cls(mod, "Mixture");
78  afw::table::io::python::addPersistableMethods<Mixture>(cls);
79  cls.def("__iter__", [](Mixture &self) { return py::make_iterator(self.begin(), self.end()); },
80  py::keep_alive<0, 1>());
81  cls.def("__getitem__",
82  [](Mixture &self, std::ptrdiff_t i) { return self[utils::python::cppIndex(self.size(), i)]; },
83  py::return_value_policy::reference_internal);
84  cls.def("__len__", &Mixture::size);
85  cls.def("getComponentCount", &Mixture::getComponentCount);
86  cls.def("project", (std::shared_ptr<Mixture> (Mixture::*)(int) const) & Mixture::project, "dim"_a);
87  cls.def("project", (std::shared_ptr<Mixture> (Mixture::*)(int, int) const) & Mixture::project, "dim1"_a,
88  "dim2"_a);
89  cls.def("getDimension", &Mixture::getDimension);
90  cls.def("normalize", &Mixture::normalize);
91  cls.def("shift", &Mixture::shift, "dim"_a, "offset"_a);
92  cls.def("clip", &Mixture::clip, "threshold"_a = 0.0);
93  cls.def("getDegreesOfFreedom", &Mixture::getDegreesOfFreedom);
94  cls.def("setDegreesOfFreedom", &Mixture::setDegreesOfFreedom,
96  cls.def("evaluate",
97  [](Mixture const &self, MixtureComponent const &component,
98  ndarray::Array<Scalar, 1, 0> const &array) -> Scalar {
99  return self.evaluate(component, ndarray::asEigenMatrix(array));
100  },
101  "component"_a, "x"_a);
102  cls.def("evaluate",
103  [](Mixture const &self, ndarray::Array<Scalar, 1, 0> const &array) -> Scalar {
104  return self.evaluate(ndarray::asEigenMatrix(array));
105  },
106  "x"_a);
107  cls.def("evaluate", (void (Mixture::*)(ndarray::Array<Scalar const, 2, 1> const &,
108  ndarray::Array<Scalar, 1, 0> const &) const) &
109  Mixture::evaluate,
110  "x"_a, "p"_a);
111  cls.def("evaluateComponents", &Mixture::evaluateComponents, "x"_a, "p"_a);
112  cls.def("evaluateDerivatives",
113  py::overload_cast<ndarray::Array<Scalar const, 1, 1> const &,
114  ndarray::Array<Scalar,1,1> const &,
115  ndarray::Array<Scalar,2,1> const &>(&Mixture::evaluateDerivatives, py::const_),
116  "x"_a, "gradient"_a, "hessian"_a);
117  cls.def("draw", &Mixture::draw, "rng"_a, "x"_a);
118  cls.def("updateEM", (void (Mixture::*)(ndarray::Array<Scalar const, 2, 1> const &,
119  ndarray::Array<Scalar const, 1, 0> const &, Scalar, Scalar)) &
120  Mixture::updateEM,
121  "x"_a, "w"_a, "tau1"_a = 0.0, "tau2"_a = 0.5);
122  cls.def("updateEM", (void (Mixture::*)(ndarray::Array<Scalar const, 2, 1> const &,
123  ndarray::Array<Scalar const, 1, 0> const &,
124  MixtureUpdateRestriction const &restriction, Scalar, Scalar)) &
125  Mixture::updateEM,
126  "x"_a, "w"_a, "restriction"_a, "tau1"_a = 0.0, "tau2"_a = 0.5);
127  cls.def("updateEM", (void (Mixture::*)(ndarray::Array<Scalar const, 2, 1> const &,
128  MixtureUpdateRestriction const &restriction, Scalar, Scalar)) &
129  Mixture::updateEM,
130  "x"_a, "restriction"_a, "tau1"_a = 0.0, "tau2"_a = 0.5);
131  cls.def("clone", &Mixture::clone);
132  cls.def(py::init<int, Mixture::ComponentList &, Scalar>(), "dim"_a, "components"_a,
134  utils::python::addOutputOp(cls, "__str__");
135  utils::python::addOutputOp(cls, "__repr__");
136  return cls;
137 }
138 
139 PYBIND11_MODULE(mixture, mod) {
140  py::module::import("lsst.afw.math");
141 
142  auto clsMixtureComponent = declareMixtureComponent(mod);
143  auto clsMixtureUpdateRestriction = declareMixtureUpdateRestriction(mod);
144  auto clsMixture = declareMixture(mod);
145  clsMixture.attr("Component") = clsMixtureComponent;
146  clsMixture.attr("UpdateRestriction") = clsMixtureUpdateRestriction;
147 }
148 
149 }
150 }
151 }
152 } // namespace lsst::meas::modelfit::anonymous
lsst::utils::python::addOutputOp
void addOutputOp(PyClass &cls, std::string const &method)
Add __str__ or __repr__ method implemented by operator<<.
Definition: python.h:87
std::shared_ptr
STL class.
python.h
lsst::meas::modelfit::Scalar
double Scalar
Typedefs to be used for probability and parameter values.
Definition: common.h:44
lsst::utils::python::cppIndex
std::size_t cppIndex(std::ptrdiff_t size, std::ptrdiff_t i)
Compute a C++ index from a Python index (negative values count from the end) and range-check.
Definition: python.h:124
end
int end
Definition: BoundedField.cc:105
lsst::afw::geom.transform.transformContinued.cls
cls
Definition: transformContinued.py:33
std::numeric_limits::infinity
T infinity(T... args)
Mixture.h
weight
afw::table::Key< double > weight
Definition: CoaddBoundedField.cc:166
lsst
A base class for image defects.
Definition: imageAlgorithm.dox:1
std::begin
T begin(T... args)
std::ptrdiff_t
pybind11
Definition: _GenericMap.cc:40
lsst::afw::image.slicing.clone
clone
Definition: slicing.py:257
std::numeric_limits
lsst::meas::modelfit.psf.psfContinued.module
module
Definition: psfContinued.py:42
lsst::afw::cameraGeom::PYBIND11_MODULE
PYBIND11_MODULE(camera, mod)
Definition: camera.cc:133