22 #include "pybind11/pybind11.h" 24 #include "numpy/arrayobject.h" 25 #include "ndarray/pybind11.h" 30 namespace py = pybind11;
39 py::class_<MatrixBuilder<T>, std::shared_ptr<MatrixBuilder<T>>> declareMatrixBuilder(
40 py::module &mod, std::string
const &suffix) {
41 using Class = MatrixBuilder<T>;
43 py::class_<Class, std::shared_ptr<Class>> cls(mod, (
"MatrixBuilder" + suffix).c_str());
45 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
int>(),
46 "x"_a,
"y"_a,
"order"_a);
47 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
int,
48 ShapeletFunction
const &>(),
49 "x"_a,
"y"_a,
"order"_a,
"psf"_a);
50 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
51 MultiShapeletBasis
const &>(),
52 "x"_a,
"y"_a,
"basis"_a);
53 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
54 MultiShapeletBasis
const &, MultiShapeletFunction
const &>(),
55 "x"_a,
"y"_a,
"basis"_a,
"psf"_a);
57 cls.def(
"getDataSize", &Class::getDataSize);
58 cls.def(
"getBasisSize", &Class::getBasisSize);
59 cls.def(
"allocateOutput", &Class::allocateOutput);
62 (
void (Class::*)(ndarray::Array<T, 2, -1>
const &, afw::geom::ellipses::Ellipse
const &)
const) &
64 cls.def(
"__call__", (ndarray::Array<T, 2, -2> (Class::*)(afw::geom::ellipses::Ellipse
const &)
const) &
71 py::class_<MatrixBuilderWorkspace<T>, std::shared_ptr<MatrixBuilderWorkspace<T>>>
72 declareMatrixBuilderWorkspace(py::module &mod, std::string
const &suffix) {
73 using Class = MatrixBuilderWorkspace<T>;
75 py::class_<Class, std::shared_ptr<Class>> cls(mod, (
"MatrixBuilderWorkspace" + suffix).c_str());
77 cls.def(py::init<int>(),
"size"_a);
78 cls.def(py::init<Class const &>(),
"other"_a);
80 cls.def(
"getRemaining", &Class::getRemaining);
86 py::class_<MatrixBuilderFactory<T>, std::shared_ptr<MatrixBuilderFactory<T>>> declareMatrixBuilderFactory(
87 py::module &mod, std::string
const &suffix) {
88 using Class = MatrixBuilderFactory<T>;
90 py::class_<Class, std::shared_ptr<Class>> cls(mod, (
"MatrixBuilderFactory" + suffix).c_str());
92 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
int>(),
93 "x"_a,
"y"_a,
"order"_a);
94 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
int,
95 ShapeletFunction
const &>(),
96 "x"_a,
"y"_a,
"order"_a,
"psf"_a);
97 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
98 MultiShapeletBasis
const &>(),
99 "x"_a,
"y"_a,
"basis"_a);
100 cls.def(py::init<ndarray::Array<T const, 1, 1>
const &, ndarray::Array<T const, 1, 1>
const &,
101 MultiShapeletBasis
const &, MultiShapeletFunction
const &>(),
102 "x"_a,
"y"_a,
"basis"_a,
"psf"_a);
104 cls.def(
"__call__", (MatrixBuilder<T> (Class::*)()
const) & Class::operator());
105 cls.def(
"__call__", (MatrixBuilder<T> (Class::*)(
typename Class::Workspace &)
const) & Class::operator(),
108 cls.def(
"getDataSize", &Class::getDataSize);
109 cls.def(
"getBasisSize", &Class::getBasisSize);
110 cls.def(
"computeWorkspace", &Class::computeWorkspace);
115 template <
typename T>
116 void declareMatrixBuilderTemplates(py::module &mod, std::string
const &suffix) {
117 auto clsMatrixBuilder = declareMatrixBuilder<T>(mod, suffix);
118 auto clsMatrixBuilderWorkspace = declareMatrixBuilderWorkspace<T>(mod, suffix);
119 auto clsMatrixBuilderFactory = declareMatrixBuilderFactory<T>(mod, suffix);
121 clsMatrixBuilder.attr(
"Workspace") = clsMatrixBuilderWorkspace;
122 clsMatrixBuilder.attr(
"Factory") = clsMatrixBuilderFactory;
124 clsMatrixBuilderFactory.attr(
"Workspace") = clsMatrixBuilderWorkspace;
125 clsMatrixBuilderFactory.attr(
"Builder") = clsMatrixBuilder;
131 py::module::import(
"lsst.afw.geom");
132 py::module mod(
"matrixBuilder");
134 if (_import_array() < 0) {
135 PyErr_SetString(PyExc_ImportError,
"numpy.core.multiarray failed to import");
139 declareMatrixBuilderTemplates<float>(mod,
"F");
140 declareMatrixBuilderTemplates<double>(mod,
"D");
PYBIND11_PLUGIN(matrixBuilder)