DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
ArrayEigenMatrixBatch_bind.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "../Array_bind.hpp"
5
6namespace DNDS
7{
8
10 {
11 return "ArrayEigenMatrixBatch";
12 }
13
15 {
16 return "ArrayEigenMatrixBatchPair";
17 }
18
20
22}
23
24namespace DNDS
25{
26 inline auto pybind11_ArrayEigenMatrixBatch_setitem_row(ArrayEigenMatrixBatch &self, index i, const py::list &matList)
27 {
28 using tElem = real;
29 using tReadMap = Eigen::Map<
30 const Eigen::Matrix<tElem, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::ColMajor>,
31 Eigen::Unaligned,
32 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>;
33 std::vector<tReadMap> mat_maps;
34 for (const auto &v : matList)
35 {
36 if (!py::isinstance<py::buffer>(v))
37 throw std::runtime_error("All elements must be buffer-compatible objects.");
38 py::buffer buf = v.cast<py::buffer>();
39 auto buf_info = buf.request(false);
40 DNDS_assert(buf_info.item_type_is_equivalent_to<tElem>());
41 DNDS_assert_info(buf_info.shape.size() == 2, "need to pass a 2-d array");
42 auto buf_start_ptr = reinterpret_cast<tElem *>(buf_info.ptr);
43 DNDS_assert(buf_info.strides.size() == 2);
44
45 auto c_mat_map = tReadMap(
46 buf_start_ptr,
47 buf_info.shape[0],
48 buf_info.shape[1],
49 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(buf_info.strides[1] / sizeof(tElem) /*col stride*/, buf_info.strides[0] / sizeof(tElem) /*row stride*/));
50 mat_maps.push_back(c_mat_map);
51 }
52 return self.InitializeWriteRow(i, mat_maps);
53 }
54
56 {
57 using tElem = real;
58
59 auto rowBatch = self[index_];
60 py::list ret;
61 for (int iMat = 0; iMat < rowBatch.Size(); iMat++)
62 {
63 auto mat = rowBatch[iMat];
64 ret.append(
65 py::memoryview::from_buffer<tElem>(
66 mat.data(),
67 {mat.rows(), mat.cols()},
68 {sizeof(tElem) * mat.rowStride(), sizeof(tElem) * mat.colStride()},
69 false)); //! warning: deleting list and Array could make the items dangling
70 }
71 return ret;
72 }
73
74 inline auto pybind11_ArrayEigenMatrixBatch_getitem(ArrayEigenMatrixBatch &self, std::tuple<index, rowsize> index_)
75 {
76 using tElem = real;
77
78 auto mat = self(std::get<0>(index_), std::get<1>(index_));
79 return py::memoryview::from_buffer<tElem>(
80 mat.data(),
81 {mat.rows(), mat.cols()},
82 {sizeof(tElem) * mat.rowStride(), sizeof(tElem) * mat.colStride()},
83 false);
84 }
85
86 inline auto pybind11_ArrayEigenMatrixBatch_setitem(ArrayEigenMatrixBatch &self, std::tuple<index, rowsize> index_, py::buffer row)
87 {
88 using tElem = real;
89 auto row_info = row.request(false);
90 DNDS_assert(row_info.item_type_is_equivalent_to<tElem>());
91 auto mat = self(std::get<0>(index_), std::get<1>(index_));
92 DNDS_assert_info(row_info.shape.size() == 2, "need to pass a 2-d array");
93 DNDS_assert_info(row_info.shape[0] == mat.rows(), "row size not matching");
94 DNDS_assert_info(row_info.shape[1] == mat.cols(), "col size not matching");
95
96 auto row_start_ptr = reinterpret_cast<tElem *>(row_info.ptr);
97 DNDS_assert(row_info.strides.size() == 2);
98 auto row_mat_map = Eigen::Map<
99 const Eigen::Matrix<tElem, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::ColMajor>,
100 Eigen::Unaligned,
101 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>(
102 row_start_ptr,
103 row_info.shape[0],
104 row_info.shape[1],
105 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(row_info.strides[1] / sizeof(tElem) /*col stride*/, row_info.strides[0] / sizeof(tElem) /*row stride*/));
106 mat = row_mat_map;
107 }
108}
109
110namespace DNDS
111{
114 {
115 auto ParArray_ = pybind11_ParArray_get_class<real, NonUniformSize>(m);
116 return {m, pybind11_ArrayEigenMatrixBatch_name().c_str(), ParArray_};
117 }
118
121 {
122 return {m.attr(pybind11_ArrayEigenMatrixBatch_name().c_str())};
123 }
124
125 inline void pybind11_ArrayEigenMatrixBatch_define(py::module_ &m)
126 {
127
128 using TArrayEigenMatrixBatch = ArrayEigenMatrixBatch;
129 auto ArrayEigenMatrixBatch_ = pybind11_ArrayEigenMatrixBatch_declare(m);
130
131 ArrayEigenMatrixBatch_
132 // we only bind the non-default ctor here
133 .def(py::init<const MPIInfo &>(), py::arg("nmpi"))
134 .def(
135 "BatchSize",
136 [](TArrayEigenMatrixBatch &self, index i)
137 {
138 return self.BatchSize(i);
139 },
140 py::arg("iRow"))
141 .def(
142 "InitializeWriteRow",
143 [](TArrayEigenMatrixBatch &self, index i, const py::list &matList)
144 {
145 return pybind11_ArrayEigenMatrixBatch_setitem_row(self, i, matList);
146 },
147 py::arg("i"), py::arg("matList"));
148 ArrayEigenMatrixBatch_
149 .def("clone", [](TArrayEigenMatrixBatch &self)
150 {
151 auto arr = std::make_shared<TArrayEigenMatrixBatch>(self);
152 return arr; });
153 ArrayEigenMatrixBatch_
154 .def(
155 "__getitem__",
156 [](TArrayEigenMatrixBatch &self, index index_)
157 {
159 },
160 py::keep_alive<0, 1>())
161 .def(
162 "__getitem__",
163 [](TArrayEigenMatrixBatch &self, std::tuple<index, rowsize> index_)
164 {
165 return pybind11_ArrayEigenMatrixBatch_getitem(self, index_);
166 },
167 py::keep_alive<0, 1>())
168 .def(
169 "__setitem__",
170 [](TArrayEigenMatrixBatch &self, std::tuple<index, rowsize> index_, py::buffer row)
171 {
172 return pybind11_ArrayEigenMatrixBatch_setitem(self, index_, row);
173 });
174
175 ArrayEigenMatrixBatch_
176 .def("to_device", [](TArrayEigenMatrixBatch &self, const std::string &backend)
177 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
178 .def("to_host", &TArrayEigenMatrixBatch::to_host);
179 }
180}
181
182namespace DNDS
183{
186 {
187 return {m, pybind11_ArrayEigenMatrixBatchPair_name().c_str()};
188 }
189
192 {
193 return {m.attr(pybind11_ArrayEigenMatrixBatchPair_name().c_str())};
194 }
195
197 {
198
199 using TPair = ArrayEigenMatrixBatchPair;
201
202 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
203
204 Pair_
205 .def("RowSize", [](const TPair &self, index i)
206 { return self.RowSize(i); }, py::arg("i"));
207 Pair_
208 .def(
209 "__getitem__",
210 [](TPair &self, index index_)
211 {
212 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
214 },
215 py::keep_alive<0, 1>())
216 .def(
217 "InitializeWriteRow",
218 [](TPair &self, index index_, py::buffer row)
219 {
220 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
221 { return pybind11_ArrayEigenMatrixBatch_setitem_row(ar, iC, row); });
222 });
223
224 Pair_
225 .def(
226 "__getitem__",
227 [](TPair &self, std::tuple<index, rowsize> index_)
228 {
229 return self.runFunctionAppendedIndex(std::get<0>(index_), [&](auto &ar, index iC) //*note the auto&& reference here!!!
230 { return pybind11_ArrayEigenMatrixBatch_getitem(ar, std::make_tuple(iC, std::get<1>(index_))); });
231 },
232 py::keep_alive<0, 1>())
233 .def(
234 "__setitem__",
235 [](TPair &self, std::tuple<index, rowsize> index_, py::buffer row)
236 {
237 return self.runFunctionAppendedIndex(std::get<0>(index_), [&](auto &ar, index iC) //*note the auto&& reference here!!!
238 { return pybind11_ArrayEigenMatrixBatch_setitem(ar, std::make_tuple(iC, std::get<1>(index_)), row); });
239 });
240 }
241}
242
243namespace DNDS
244{
245
251}
Batch of variable-sized Eigen matrices stored in CSR layout.
#define DNDS_assert_info(expr, info)
Debug-only assertion with an extra std::string info message.
Definition Errors.hpp:113
#define DNDS_assert(expr)
Debug-only assertion (compiled out when DNDS_NDEBUG is defined). Prints the expression + file/line + ...
Definition Errors.hpp:108
CSR array storing a variable-sized batch of Eigen matrices per row.
void InitializeWriteRow(index i, const std::vector< t_matrices_elem > &matrices)
the host side operators are provided as implemented
void pybind11_ArrayEigenMatrixBatchPair_define(py::module_ &m)
py_class_ssp< ArrayEigenMatrixBatchPair > tPy_ArrayEigenMatrixBatchPair
py::classh< T > py_class_ssp
auto pybind11_ArrayEigenMatrixBatch_setitem(ArrayEigenMatrixBatch &self, std::tuple< index, rowsize > index_, py::buffer row)
tPy_ArrayEigenMatrixBatchPair pybind11_ArrayEigenMatrixBatchPair_declare(py::module_ &m)
std::string pybind11_ArrayEigenMatrixBatch_name()
DeviceBackend device_backend_name_to_enum(std::string_view s)
Inverse of device_backend_name. Returns Unknown for unrecognised names.
tPy_ArrayEigenMatrixBatch pybind11_ArrayEigenMatrixBatch_declare(py::module_ &m)
py_class_ssp< ArrayEigenMatrixBatch > tPy_ArrayEigenMatrixBatch
tPy_ArrayEigenMatrixBatch pybind11_ArrayEigenMatrixBatch_get_class(py::module_ &m)
void pybind11_ArrayEigenMatrixBatch_define(py::module_ &m)
auto pybind11_ArrayEigenMatrixBatch_getitem(ArrayEigenMatrixBatch &self, std::tuple< index, rowsize > index_)
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
Definition Defines.hpp:107
ArrayPair< ArrayEigenMatrixBatch > ArrayEigenMatrixBatchPair
ArrayPair alias for per-row variable-size Eigen matrix batches.
auto pybind11_ArrayEigenMatrixBatch_setitem_row(ArrayEigenMatrixBatch &self, index i, const py::list &matList)
double real
Canonical floating-point scalar used throughout DNDSR (double precision).
Definition Defines.hpp:105
tPy_ArrayEigenMatrixBatchPair pybind11_ArrayEigenMatrixBatchPair_get_class(py::module_ &m)
std::string pybind11_ArrayEigenMatrixBatchPair_name()
auto pybind11_ArrayEigenMatrixBatch_getitem_row(ArrayEigenMatrixBatch &self, index index_)
void pybind11_bind_ArrayEigenMatrixBatch_All(py::module_ &m)
Eigen::Matrix< real, 5, 1 > v