LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
_functionLibrary.cc
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2008-2016 AURA/LSST.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <https://www.lsstcorp.org/LegalNotices/>.
21  */
22 #include <memory>
23 
24 #include <pybind11/pybind11.h>
25 #include <lsst/utils/python.h>
26 
27 #include <pybind11/stl.h>
28 
29 #include "lsst/geom/Box.h"
30 #include "lsst/geom/Point.h"
31 
33 #include "lsst/afw/math/Function.h"
34 
35 namespace py = pybind11;
36 using namespace pybind11::literals;
37 
39 
40 namespace lsst {
41 namespace afw {
42 namespace math {
43 
44 template <typename ReturnT>
45 void declarePolynomialFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix) {
46  /* PolynomialFunction1 */
47 
48  wrappers.wrapType(
50  Function1<ReturnT>>(wrappers.module, ("PolynomialFunction1" + suffix).c_str()),
51  [](auto &mod, auto &cls) {
52  cls.def(py::init<std::vector<double> const &>(), "params"_a);
53  cls.def(py::init<unsigned int>(), "order"_a);
54 
55  cls.def("__call__", &PolynomialFunction1<ReturnT>::operator(), "x"_a);
56  cls.def("clone", &PolynomialFunction1<ReturnT>::clone);
57  cls.def("isLinearCombination", &PolynomialFunction1<ReturnT>::isLinearCombination);
58  cls.def("getOrder", &PolynomialFunction1<ReturnT>::getOrder);
59  cls.def("toString", &PolynomialFunction1<ReturnT>::toString, "prefix"_a = "");
60  });
61  /* PolynomialFunction2 */
63  BasePolynomialFunction2<ReturnT>>(wrappers.module,
64  ("PolynomialFunction2" + suffix).c_str()),
65  [](auto &mod, auto &cls) {
66  cls.def(py::init<std::vector<double> const &>(), "params"_a);
67  cls.def(py::init<unsigned int>(), "order"_a);
68 
69  cls.def("__call__", &PolynomialFunction2<ReturnT>::operator(), "x"_a, "y"_a);
70  cls.def("clone", &PolynomialFunction2<ReturnT>::clone);
71  cls.def("getOrder", &PolynomialFunction2<ReturnT>::getOrder);
72  cls.def("getDFuncDParameters", &PolynomialFunction2<ReturnT>::getDFuncDParameters);
73  cls.def("toString", &PolynomialFunction2<ReturnT>::toString, "prefix"_a = "");
74  cls.def("isPersistable", &PolynomialFunction2<ReturnT>::isPersistable);
75  });
76 };
77 
78 template <typename ReturnT>
79 void declareChebyshevFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix) {
80  /* Chebyshev1Function1 */
81 
82  wrappers.wrapType(
84  Function1<ReturnT>>(wrappers.module, ("Chebyshev1Function1" + suffix).c_str()),
85  [](auto &mod, auto &cls) {
86  cls.def(py::init<std::vector<double>, double, double>(), "params"_a, "minX"_a = -1,
87  "maxX"_a = 1);
88  cls.def(py::init<unsigned int, double, double>(), "order"_a, "minX"_a = -1, "maxX"_a = 1);
89 
90  cls.def("__call__", &Chebyshev1Function1<ReturnT>::operator(), "x"_a);
91  cls.def("clone", &Chebyshev1Function1<ReturnT>::clone);
92  cls.def("getMinX", &Chebyshev1Function1<ReturnT>::getMinX);
93  cls.def("getMaxX", &Chebyshev1Function1<ReturnT>::getMaxX);
94  cls.def("getOrder", &Chebyshev1Function1<ReturnT>::getOrder);
95  cls.def("isLinearCombination", &Chebyshev1Function1<ReturnT>::isLinearCombination);
96  cls.def("toString", &Chebyshev1Function1<ReturnT>::toString, "prefix"_a = "");
97 
98  /* Chebyshev1Function2 */
99  });
101  BasePolynomialFunction2<ReturnT>>(wrappers.module,
102  ("Chebyshev1Function2" + suffix).c_str()),
103  [](auto &mod, auto &cls) {
104  cls.def(py::init<std::vector<double>, lsst::geom::Box2D const &>(), "params"_a,
105  "xyRange"_a = lsst::geom::Box2D(lsst::geom::Point2D(-1.0, -1.0),
106  lsst::geom::Point2D(1.0, 1.0)));
107  cls.def(py::init<unsigned int, lsst::geom::Box2D const &>(), "order"_a,
108  "xyRange"_a = lsst::geom::Box2D(lsst::geom::Point2D(-1.0, -1.0),
109  lsst::geom::Point2D(1.0, 1.0)));
110 
111  cls.def("__call__", &Chebyshev1Function2<ReturnT>::operator(), "x"_a, "y"_a);
112  cls.def("clone", &Chebyshev1Function2<ReturnT>::clone);
113  cls.def("getXYRange", &Chebyshev1Function2<ReturnT>::getXYRange);
114  cls.def("truncate", &Chebyshev1Function2<ReturnT>::truncate, "order"_a);
115  cls.def("toString", &Chebyshev1Function2<ReturnT>::toString, "prefix"_a = "");
116  cls.def("isPersistable", &Chebyshev1Function2<ReturnT>::isPersistable);
117  });
118 };
119 
120 template <typename ReturnT>
121 void declareGaussianFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix) {
122  /* GaussianFunction1 */
124  Function1<ReturnT>>(wrappers.module, ("GaussianFunction1" + suffix).c_str()),
125  [](auto &mod, auto &cls) {
126  cls.def(py::init<double>(), "sigma"_a);
127 
128  cls.def("__call__", &GaussianFunction1<ReturnT>::operator(), "x"_a);
129  cls.def("clone", &GaussianFunction1<ReturnT>::clone);
130  cls.def("toString", &GaussianFunction1<ReturnT>::toString, "prefix"_a = "");
131  });
132 
134  Function2<ReturnT>>(wrappers.module, ("GaussianFunction2" + suffix).c_str()),
135  [](auto &mod, auto &cls) {
136  /* GaussianFunction2 */
137 
138  cls.def(py::init<double, double, double>(), "sigma1"_a, "sigma2"_a,
139  "angle"_a = 0.0);
140 
141  cls.def("__call__", &GaussianFunction2<ReturnT>::operator(), "x"_a, "y"_a);
142  cls.def("clone", &GaussianFunction2<ReturnT>::clone);
143  cls.def("toString", &GaussianFunction2<ReturnT>::toString, "prefix"_a = "");
144  cls.def("isPersistable", &GaussianFunction2<ReturnT>::isPersistable);
145  });
146  /* DoubleGaussianFunction2 */
147 
148  wrappers.wrapType(
150  Function2<ReturnT>>(wrappers.module, ("DoubleGaussianFunction2" + suffix).c_str()),
151  [](auto &mod, auto &cls) {
152  cls.def(py::init<double, double, double>(), "sigma1"_a, "sigma2"_a = 0, "ampl"_a = 0);
153 
154  cls.def("__call__", &DoubleGaussianFunction2<ReturnT>::operator(), "x"_a, "y"_a);
155  cls.def("clone", &DoubleGaussianFunction2<ReturnT>::clone);
156  cls.def("toString", &DoubleGaussianFunction2<ReturnT>::toString, "prefix"_a = "");
157  cls.def("isPersistable", &DoubleGaussianFunction2<ReturnT>::isPersistable);
158  });
159 };
160 
161 template <typename ReturnT>
162 void declareIntegerDeltaFunctions(lsst::utils::python::WrapperCollection &wrappers,
163  const std::string &suffix) {
164  /* IntegerDeltaFunction1 */
165 
166  wrappers.wrapType(
168  Function1<ReturnT>>(wrappers.module, ("IntegerDeltaFunction1" + suffix).c_str()),
169  [](auto &mod, auto &cls) {
170  cls.def(py::init<double>(), "xo"_a);
171 
172  cls.def("__call__", &IntegerDeltaFunction1<ReturnT>::operator(), "x"_a);
173  cls.def("clone", &IntegerDeltaFunction1<ReturnT>::clone);
174  cls.def("toString", &IntegerDeltaFunction1<ReturnT>::toString, "prefix"_a = "");
175  });
176  /* IntegerDeltaFunction2 */
177 
178  wrappers.wrapType(
180  Function2<ReturnT>>(wrappers.module, ("IntegerDeltaFunction2" + suffix).c_str()),
181  [](auto &mod, auto &cls) {
182  cls.def(py::init<double, double>(), "xo"_a, "yo"_a);
183 
184  cls.def("__call__", &IntegerDeltaFunction2<ReturnT>::operator(), "x"_a, "y"_a);
185  cls.def("clone", &IntegerDeltaFunction2<ReturnT>::clone);
186  cls.def("toString", &IntegerDeltaFunction2<ReturnT>::toString, "prefix"_a = "");
187  });
188 };
189 
190 template <typename ReturnT>
191 void declareLanczosFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix) {
192  /* LanczosFunction1 */
193 
195  Function1<ReturnT>>(wrappers.module, ("LanczosFunction1" + suffix).c_str()),
196  [](auto &mod, auto &cls) {
197  cls.def(py::init<unsigned int, double>(), "n"_a, "xOffset"_a = 0.0);
198 
199  cls.def("__call__", &LanczosFunction1<ReturnT>::operator(), "x"_a);
200  cls.def("clone", &LanczosFunction1<ReturnT>::clone);
201  cls.def("getOrder", &LanczosFunction1<ReturnT>::getOrder);
202  cls.def("toString", &LanczosFunction1<ReturnT>::toString, "prefix"_a = "");
203  });
204  /* LanczosFunction2 */
205 
207  Function2<ReturnT>>(wrappers.module, ("LanczosFunction2" + suffix).c_str()),
208  [](auto &mod, auto &cls) {
209  /* LanczosFunction2 */
210  cls.def(py::init<unsigned int, double, double>(), "n"_a, "xOffset"_a = 0.0,
211  "yOffset"_a = 0.0);
212 
213  cls.def("__call__", &LanczosFunction2<ReturnT>::operator(), "x"_a, "y"_a);
214  cls.def("clone", &LanczosFunction2<ReturnT>::clone);
215  cls.def("getOrder", &LanczosFunction2<ReturnT>::getOrder);
216  cls.def("toString", &LanczosFunction2<ReturnT>::toString, "prefix"_a = "");
217  });
218 };
219 
220 void wrapFunctionLibrary(lsst::utils::python::WrapperCollection &wrappers) {
221  wrappers.addInheritanceDependency("lsst.geom");
222  declarePolynomialFunctions<float>(wrappers, "F");
223  declareChebyshevFunctions<float>(wrappers, "F");
224  declareGaussianFunctions<float>(wrappers, "F");
225  declareIntegerDeltaFunctions<float>(wrappers, "F");
226  declareLanczosFunctions<float>(wrappers, "F");
227 
228  declarePolynomialFunctions<double>(wrappers, "D");
229  declareChebyshevFunctions<double>(wrappers, "D");
230  declareGaussianFunctions<double>(wrappers, "D");
231  declareIntegerDeltaFunctions<double>(wrappers, "D");
232  declareLanczosFunctions<double>(wrappers, "D");
233 }
234 
235 } // namespace math
236 } // namespace afw
237 } // namespace lsst
PYBIND11_DECLARE_HOLDER_TYPE(MyType, std::shared_ptr< MyType >)
Base class for 2-dimensional polynomials of the form:
Definition: Function.h:326
1-dimensional weighted sum of Chebyshev polynomials of the first kind.
2-dimensional weighted sum of Chebyshev polynomials of the first kind.
double Guassian (sum of two Gaussians)
A Function taking one argument.
Definition: Function.h:202
A Function taking two arguments.
Definition: Function.h:259
1-dimensional integer delta function.
2-dimensional integer delta function.
1-dimensional Lanczos function
2-dimensional separable Lanczos function
1-dimensional polynomial function.
2-dimensional polynomial function with cross terms
void declareChebyshevFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix)
void declarePolynomialFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix)
void declareIntegerDeltaFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix)
void declareGaussianFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix)
void wrapFunctionLibrary(lsst::utils::python::WrapperCollection &wrappers)
void declareLanczosFunctions(lsst::utils::python::WrapperCollection &wrappers, const std::string &suffix)
A base class for image defects.