DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
ArrayEigenUniMatrixBatch_bind.hpp
Go to the documentation of this file.
1#pragma once
2
4#include "../Array_bind.hpp"
5
6namespace DNDS
7{
8
9 template <int _n_row, int _n_col>
11 {
12 return "ArrayEigenUniMatrixBatch" + fmt::format("_{}x{}",
14 RowSize_To_PySnippet(_n_col));
15 }
16
17 template <int _n_row, int _n_col>
19 {
20 return "ArrayEigenUniMatrixBatchPair" + fmt::format("_{}x{}",
22 RowSize_To_PySnippet(_n_col));
23 }
24
25 template <int _n_row, int _n_col> // ! shared ptr
27
28 template <int _n_row, int _n_col> // ! shared ptr
30}
31
32namespace DNDS
33{
34 template <class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
35 auto pybind11_ArrayEigenUniMatrixBatch_getitem(TArrayEigenUniMatrixBatch &self, std::tuple<index, rowsize> index_)
36 {
37 using tElem = real;
38 auto mat = self(std::get<0>(index_), std::get<1>(index_));
39 return py::memoryview::from_buffer<tElem>(
40 mat.data(),
41 {mat.rows(), mat.cols()},
42 {sizeof(tElem) * mat.rowStride(), sizeof(tElem) * mat.colStride()},
43 false);
44 }
45
46 template <class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
47 auto pybind11_ArrayEigenUniMatrixBatch_setitem(TArrayEigenUniMatrixBatch &self, std::tuple<index, rowsize> index_, py::buffer row)
48 {
49 using tElem = real;
50 auto row_info = row.request(false);
51 DNDS_assert(row_info.item_type_is_equivalent_to<tElem>());
52 auto mat = self(std::get<0>(index_), std::get<1>(index_));
53 DNDS_assert_info(row_info.shape.size() == 2, "need to pass a 2-d array");
54 DNDS_assert_info(row_info.shape[0] == mat.rows(), "row size not matching");
55 DNDS_assert_info(row_info.shape[1] == mat.cols(), "col size not matching");
56 auto row_start_ptr = reinterpret_cast<tElem *>(row_info.ptr);
57 DNDS_assert(row_info.strides.size() == 2);
58 auto row_mat_map = Eigen::Map<
59 const Eigen::Matrix<tElem, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::ColMajor>,
60 Eigen::Unaligned,
61 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>(
62 row_start_ptr,
63 row_info.shape[0],
64 row_info.shape[1],
65 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(row_info.strides[1] / sizeof(tElem) /*col stride*/, row_info.strides[0] / sizeof(tElem) /*row stride*/));
66 mat = row_mat_map;
67 }
68
69 template <class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
70 auto pybind11_ArrayEigenUniMatrixBatch_getitem_row(TArrayEigenUniMatrixBatch &self, index index_)
71 {
72 using tElem = real;
73 auto mat0 = self(index_, 0);
74 //! warning, assume mat0.rowStride() applies to following matrices
75 return py::memoryview::from_buffer<tElem>(
76 mat0.data(),
77 std::array<index, 3>{self.BatchSize(index_), mat0.rows(), mat0.cols()},
78 std::array<index, 3>{static_cast<index>(sizeof(tElem)) * self.MSize(), static_cast<index>(sizeof(tElem)) * mat0.rowStride(), static_cast<index>(sizeof(tElem)) * mat0.colStride()},
79 false);
80 }
81
82 template <class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
83 auto pybind11_ArrayEigenUniMatrixBatch_setitem_row(TArrayEigenUniMatrixBatch &self, index index_, py::buffer row)
84 {
85 using tElem = real;
86 auto row_info = row.request(false);
87 DNDS_assert(row_info.item_type_is_equivalent_to<tElem>());
88
89 DNDS_assert_info(row_info.shape.size() == 3, "need to pass a 2-d array");
90 DNDS_assert_info(row_info.shape[0] == self.BatchSize(index_), "batch size not matching");
91 DNDS_assert_info(row_info.shape[1] == self.Rows(), "row size not matching");
92 DNDS_assert_info(row_info.shape[2] == self.Cols(), "col size not matching");
93 auto row_start_ptr = reinterpret_cast<tElem *>(row_info.ptr);
94 DNDS_assert(row_info.strides.size() == 3);
95 for (index iB = 0; iB < row_info.shape[0]; iB++)
96 {
97 auto mat = self(index_, iB);
98 for (index iM = 0; iM < row_info.shape[1]; iM++)
99 for (index iN = 0; iN < row_info.shape[2]; iN++)
100 mat(iM, iN) = *reinterpret_cast<tElem *>(
101 reinterpret_cast<uint8_t *>(row_info.ptr) + row_info.strides[0] * iB + row_info.strides[1] * iM + row_info.strides[2] * iN);
102 }
103 }
104}
105
106namespace DNDS
107{
108 template <int _n_row, int _n_col>
109 tPy_ArrayEigenUniMatrixBatch<_n_row, _n_col>
111 {
112 auto ParArray_ = pybind11_ParArray_get_class<real, NonUniformSize>(m);
113 return {m, pybind11_ArrayEigenUniMatrixBatch_name<_n_row, _n_col>().c_str(), ParArray_};
114 // std::cout << py::format_descriptor<Eigen::Matrix<double, 3, 3>>().format() << std::endl;
115 }
116
117 template <int _n_row, int _n_col>
118 tPy_ArrayEigenUniMatrixBatch<_n_row, _n_col>
120 {
121 return {m.attr(pybind11_ArrayEigenUniMatrixBatch_name<_n_row, _n_col>().c_str())};
122 }
123
124 template <int _n_row, int _n_col>
126 {
127
128 using TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<_n_row, _n_col>;
129 auto ArrayEigenUniMatrixBatch_ = pybind11_ArrayEigenUniMatrixBatch_declare<_n_row, _n_col>(m);
130
131 // // helper
132 // using TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>;
133 // auto ArrayEigenUniMatrixBatch_ = pybind11_ArrayEigenUniMatrixBatch_declare<3, 3>(m);
134 // // helper
135 ArrayEigenUniMatrixBatch_
136 .def("clone", [](TArrayEigenUniMatrixBatch &self)
137 {
138 auto arr = std::make_shared<TArrayEigenUniMatrixBatch>(self);
139 return arr; });
140 ArrayEigenUniMatrixBatch_
141 // we only bind the non-default ctor here
142 .def(py::init<const MPIInfo &>(), py::arg("nmpi"))
143 .def("Resize", [](TArrayEigenUniMatrixBatch &self, index size)
144 { return self.Resize(size); }, py::arg("size"))
145 .def("Resize", [](TArrayEigenUniMatrixBatch &self, index size, int r, int c)
146 { return self.Resize(size, r, c); }, py::arg("size"), py::arg("r"), py::arg("c"));
147 ArrayEigenUniMatrixBatch_ // the once for all resize
148 .def("Resize", [](TArrayEigenUniMatrixBatch &self, index size, int r, int c, py::array_t<int, pybind11::array::c_style | pybind11::array::forcecast> batchSizes)
149 { return self.Resize(size, r, c, [&](index i)
150 { return batchSizes.at(i); }); }, py::arg("size"), py::arg("r"), py::arg("c"), py::arg("batchSizes"));
151 ArrayEigenUniMatrixBatch_
152 .def("ResizeMatrix", [](TArrayEigenUniMatrixBatch &self, index r, index c)
153 { return self.ResizeMatrix(r, c); }, py::arg("r") = -1, py::arg("c") = -1);
154 ArrayEigenUniMatrixBatch_
155 .def_property_readonly("rows", [](const TArrayEigenUniMatrixBatch &self)
156 { return self.Rows(); })
157 .def_property_readonly("cols", [](const TArrayEigenUniMatrixBatch &self)
158 { return self.Cols(); })
159 .def_property_readonly("msize", [](const TArrayEigenUniMatrixBatch &self)
160 { return self.MSize(); });
161 ArrayEigenUniMatrixBatch_
162 .def("ResizeBatch", [](TArrayEigenUniMatrixBatch &self, index i, rowsize b_size)
163 { return self.ResizeBatch(i, b_size); }, py::arg("i"), py::arg("b_size"))
164 .def("ResizeRow", [](TArrayEigenUniMatrixBatch &self, index i, rowsize b_size)
165 { return self.ResizeRow(i, b_size); }, py::arg("i"), py::arg("b_size"));
166 ArrayEigenUniMatrixBatch_
167 .def("RowSize", [](const TArrayEigenUniMatrixBatch &self, index i)
168 { return self.RowSize(i); }, py::arg("i"))
169 .def("BatchSize", [](const TArrayEigenUniMatrixBatch &self, index i)
170 { return self.BatchSize(i); }, py::arg("i"));
171 ArrayEigenUniMatrixBatch_
172 .def(
173 "__getitem__",
174 [](TArrayEigenUniMatrixBatch &self, std::tuple<index, rowsize> index_)
175 {
177 },
178 py::keep_alive<0, 1>())
179 .def(
180 "__setitem__",
181 [](TArrayEigenUniMatrixBatch &self, std::tuple<index, rowsize> index_, py::buffer row)
182 {
183 return pybind11_ArrayEigenUniMatrixBatch_setitem(self, index_, row);
184 })
185 .def(
186 "__getitem__",
187 [](TArrayEigenUniMatrixBatch &self, index index_)
188 {
190 },
191 py::keep_alive<0, 1>())
192 .def(
193 "__setitem__",
194 [](TArrayEigenUniMatrixBatch &self, index index_, py::buffer row)
195 {
196 return pybind11_ArrayEigenUniMatrixBatch_setitem_row(self, index_, row);
197 });
198 }
199
200 template <int _n_row, int _n_col>
202 {
203 if constexpr (_n_row == UnInitRowsize || _n_col == UnInitRowsize)
204 return;
205 else
206 return pybind11_ArrayEigenUniMatrixBatch_define<_n_row, _n_col>(m);
207 }
208
209}
210
211namespace DNDS
212{
213 template <int _n_row, int _n_col>
214 tPy_ArrayEigenUniMatrixBatchPair<_n_row, _n_col>
216 {
217 return {m, pybind11_ArrayEigenUniMatrixBatchPair_name<_n_row, _n_col>().c_str()};
218 }
219
220 template <int _n_row, int _n_col>
221 tPy_ArrayEigenUniMatrixBatchPair<_n_row, _n_col>
223 {
224 return {m.attr(pybind11_ArrayEigenUniMatrixBatchPair_name<_n_row, _n_col>().c_str())};
225 }
226
227 template <int _n_row, int _n_col>
229 {
230
232 auto Pair_ = pybind11_ArrayEigenUniMatrixBatchPair_declare<_n_row, _n_col>(m);
233
234 // // helper
235 // using TPair = ArrayEigenUniMatrixBatchPair<3, 3>;
236 // auto Pair_ = pybind11_ArrayEigenUniMatrixBatchPair_declare<3, 3>(m);
237 // // helper
238
239 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
240
241 Pair_
242 .def("RowSize", [](const TPair &self, index i)
243 { return self.RowSize(i); }, py::arg("i"));
244 Pair_
245 .def(
246 "__getitem__",
247 [](TPair &self, std::tuple<index, rowsize> index_)
248 {
249 return self.runFunctionAppendedIndex(std::get<0>(index_), [&](auto &ar, index iC) //*note the auto&& reference here!!!
250 { return pybind11_ArrayEigenUniMatrixBatch_getitem(ar, std::make_tuple(iC, std::get<1>(index_))); });
251 },
252 py::keep_alive<0, 1>())
253 .def(
254 "__setitem__",
255 [](TPair &self, std::tuple<index, rowsize> index_, py::buffer row)
256 {
257 return self.runFunctionAppendedIndex(std::get<0>(index_), [&](auto &ar, index iC) //*note the auto&& reference here!!!
258 { return pybind11_ArrayEigenUniMatrixBatch_setitem(ar, std::make_tuple(iC, std::get<1>(index_)), row); });
259 })
260 .def(
261 "__getitem__",
262 [](TPair &self, index index_)
263 {
264 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
266 },
267 py::keep_alive<0, 1>())
268 .def(
269 "__setitem__",
270 [](TPair &self, index index_, py::buffer row)
271 {
272 return self.runFunctionAppendedIndex(index_, [&](auto &ar, index iC) //*note the auto&& reference here!!!
273 { return pybind11_ArrayEigenUniMatrixBatch_setitem_row(ar, iC, row); });
274 });
275
276 Pair_
277 .def("to_device", [](TPair &self, const std::string &backend)
278 { self.to_device(device_backend_name_to_enum(backend)); }, py::arg("backend"))
279 .def("to_host", &TPair::to_host);
280 }
281
282 template <int _n_row, int _n_col>
284 {
285 if constexpr (_n_row == UnInitRowsize || _n_col == UnInitRowsize)
286 return;
287 else
288 return pybind11_ArrayEigenUniMatrixBatchPair_define<_n_row, _n_col>(m);
289 }
290
291}
292
293namespace DNDS
294{
295
296 template <rowsize mat_n, size_t N, std::array<int, N> const &Arr, size_t... Is>
297 void __pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes_sequence(py::module_ &m, std::index_sequence<Is...>)
298 {
299 (_pybind11_ArrayEigenUniMatrixBatch_define_dispatch<Arr[Is], mat_n>(m), ...);
300 (_pybind11_ArrayEigenUniMatrixBatchPair_define_dispatch<Arr[Is], mat_n>(m), ...);
301 }
302
303 template <rowsize mat_n>
305 {
306 static constexpr auto seq = pybind11_arrayRowsizeInstantiationList;
308 mat_n,
309 seq.size(),
310 seq>(m, std::make_index_sequence<seq.size()>{});
311 }
312
313 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<1>(py::module_ &m);
314 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<2>(py::module_ &m);
315 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<3>(py::module_ &m);
316 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<4>(py::module_ &m);
317 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<5>(py::module_ &m);
318 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<6>(py::module_ &m);
319 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<7>(py::module_ &m);
320 extern template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes<8>(py::module_ &m);
322
324}
Batch of uniform-sized Eigen matrices per row, with variable batch count.
#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 whose rows store a batch of identically-sized Eigen matrices.
the host side operators are provided as implemented
auto pybind11_ArrayEigenUniMatrixBatch_setitem_row(TArrayEigenUniMatrixBatch &self, index index_, py::buffer row)
tPy_ArrayEigenUniMatrixBatch< _n_row, _n_col > pybind11_ArrayEigenUniMatrixBatch_get_class(py::module_ &m)
tPy_ArrayEigenUniMatrixBatchPair< _n_row, _n_col > pybind11_ArrayEigenUniMatrixBatchPair_get_class(py::module_ &m)
auto pybind11_ArrayEigenUniMatrixBatch_getitem(TArrayEigenUniMatrixBatch &self, std::tuple< index, rowsize > index_)
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 3 >(py::module_ &m)
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 8 >(py::module_ &m)
void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes(py::module_ &m)
py::classh< T > py_class_ssp
int32_t rowsize
Row-width / per-row element-count type (signed 32-bit).
Definition Defines.hpp:109
void pybind11_bind_ArrayEigenUniMatrixBatch_All(py::module_ &m)
DeviceBackend device_backend_name_to_enum(std::string_view s)
Inverse of device_backend_name. Returns Unknown for unrecognised names.
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 2 >(py::module_ &m)
std::string RowSize_To_PySnippet(rowsize rs)
Encode a rowsize constant as a short Python-binding snippet: "<number>" for fixed,...
Definition Defines.hpp:294
void pybind11_ArrayEigenUniMatrixBatchPair_define(py::module_ &m)
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 7 >(py::module_ &m)
void __pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes_sequence(py::module_ &m, std::index_sequence< Is... >)
int64_t index
Global row / DOF index type (signed 64-bit; handles multi-billion-cell meshes).
Definition Defines.hpp:107
tPy_ArrayEigenUniMatrixBatchPair< _n_row, _n_col > pybind11_ArrayEigenUniMatrixBatchPair_declare(py::module_ &m)
void _pybind11_ArrayEigenUniMatrixBatchPair_define_dispatch(py::module_ &m)
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 1 >(py::module_ &m)
std::string pybind11_ArrayEigenUniMatrixBatch_name()
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 5 >(py::module_ &m)
py_class_ssp< ArrayEigenUniMatrixBatchPair< _n_row, _n_col > > tPy_ArrayEigenUniMatrixBatchPair
double real
Canonical floating-point scalar used throughout DNDSR (double precision).
Definition Defines.hpp:105
std::string pybind11_ArrayEigenUniMatrixBatchPair_name()
auto pybind11_ArrayEigenUniMatrixBatch_setitem(TArrayEigenUniMatrixBatch &self, std::tuple< index, rowsize > index_, py::buffer row)
py_class_ssp< ArrayEigenUniMatrixBatch< _n_row, _n_col > > tPy_ArrayEigenUniMatrixBatch
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 4 >(py::module_ &m)
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< DynamicSize >(py::module_ &m)
tPy_ArrayEigenUniMatrixBatch< _n_row, _n_col > pybind11_ArrayEigenUniMatrixBatch_declare(py::module_ &m)
void pybind11_ArrayEigenUniMatrixBatch_define(py::module_ &m)
template void pybind11_callBindArrayEigenUniMatrixBatchs_rowsizes< 6 >(py::module_ &m)
auto pybind11_ArrayEigenUniMatrixBatch_getitem_row(TArrayEigenUniMatrixBatch &self, index index_)
void _pybind11_ArrayEigenUniMatrixBatch_define_dispatch(py::module_ &m)
DNDS_CONSTANT const rowsize UnInitRowsize
Sentinel "not initialised" rowsize value (= INT32_MIN).
Definition Defines.hpp:179
Convenience bundle of a father, son, and attached ArrayTransformer.
tVec r(NCells)