4#include "../Array_bind.hpp"
9 template <
int _n_row,
int _n_col>
12 return "ArrayEigenUniMatrixBatch" + fmt::format(
"_{}x{}",
17 template <
int _n_row,
int _n_col>
20 return "ArrayEigenUniMatrixBatchPair" + fmt::format(
"_{}x{}",
25 template <
int _n_row,
int _n_col>
28 template <
int _n_row,
int _n_col>
34 template <
class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
38 auto mat = self(std::get<0>(index_), std::get<1>(index_));
39 return py::memoryview::from_buffer<tElem>(
41 {mat.rows(), mat.cols()},
42 {sizeof(tElem) * mat.rowStride(), sizeof(tElem) * mat.colStride()},
46 template <
class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
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_));
56 auto row_start_ptr =
reinterpret_cast<tElem *
>(row_info.ptr);
58 auto row_mat_map = Eigen::Map<
59 const Eigen::Matrix<tElem, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::ColMajor>,
61 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>>(
65 Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>(row_info.strides[1] /
sizeof(tElem) , row_info.strides[0] /
sizeof(tElem) ));
69 template <
class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
73 auto mat0 = self(index_, 0);
75 return py::memoryview::from_buffer<tElem>(
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()},
82 template <
class TArrayEigenUniMatrixBatch = ArrayEigenUniMatrixBatch<3, 3>>
86 auto row_info = row.request(
false);
87 DNDS_assert(row_info.item_type_is_equivalent_to<tElem>());
90 DNDS_assert_info(row_info.shape[0] == self.BatchSize(index_),
"batch size not matching");
93 auto row_start_ptr =
reinterpret_cast<tElem *
>(row_info.ptr);
95 for (
index iB = 0; iB < row_info.shape[0]; iB++)
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);
108 template <
int _n_row,
int _n_col>
109 tPy_ArrayEigenUniMatrixBatch<_n_row, _n_col>
112 auto ParArray_ = pybind11_ParArray_get_class<real, NonUniformSize>(m);
113 return {m, pybind11_ArrayEigenUniMatrixBatch_name<_n_row, _n_col>().c_str(), ParArray_};
117 template <
int _n_row,
int _n_col>
118 tPy_ArrayEigenUniMatrixBatch<_n_row, _n_col>
121 return {m.attr(pybind11_ArrayEigenUniMatrixBatch_name<_n_row, _n_col>().c_str())};
124 template <
int _n_row,
int _n_col>
129 auto ArrayEigenUniMatrixBatch_ = pybind11_ArrayEigenUniMatrixBatch_declare<_n_row, _n_col>(m);
135 ArrayEigenUniMatrixBatch_
136 .def(
"clone", [](TArrayEigenUniMatrixBatch &self)
138 auto arr = std::make_shared<TArrayEigenUniMatrixBatch>(self);
140 ArrayEigenUniMatrixBatch_
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_
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_
174 [](TArrayEigenUniMatrixBatch &self, std::tuple<index, rowsize> index_)
178 py::keep_alive<0, 1>())
181 [](TArrayEigenUniMatrixBatch &self, std::tuple<index, rowsize> index_, py::buffer row)
187 [](TArrayEigenUniMatrixBatch &self,
index index_)
191 py::keep_alive<0, 1>())
194 [](TArrayEigenUniMatrixBatch &self,
index index_, py::buffer row)
200 template <
int _n_row,
int _n_col>
206 return pybind11_ArrayEigenUniMatrixBatch_define<_n_row, _n_col>(m);
213 template <
int _n_row,
int _n_col>
214 tPy_ArrayEigenUniMatrixBatchPair<_n_row, _n_col>
217 return {m, pybind11_ArrayEigenUniMatrixBatchPair_name<_n_row, _n_col>().c_str()};
220 template <
int _n_row,
int _n_col>
221 tPy_ArrayEigenUniMatrixBatchPair<_n_row, _n_col>
224 return {m.attr(pybind11_ArrayEigenUniMatrixBatchPair_name<_n_row, _n_col>().c_str())};
227 template <
int _n_row,
int _n_col>
232 auto Pair_ = pybind11_ArrayEigenUniMatrixBatchPair_declare<_n_row, _n_col>(m);
239 pybind11_ArrayPairGenericBindBasics<TPair>(Pair_);
242 .def(
"RowSize", [](
const TPair &self,
index i)
243 {
return self.RowSize(i); }, py::arg(
"i"));
247 [](TPair &self, std::tuple<index, rowsize> index_)
249 return self.runFunctionAppendedIndex(std::get<0>(index_), [&](
auto &ar,
index iC)
252 py::keep_alive<0, 1>())
255 [](TPair &self, std::tuple<index, rowsize> index_, py::buffer row)
257 return self.runFunctionAppendedIndex(std::get<0>(index_), [&](
auto &ar,
index iC)
262 [](TPair &self,
index index_)
264 return self.runFunctionAppendedIndex(index_, [&](
auto &ar,
index iC)
267 py::keep_alive<0, 1>())
270 [](TPair &self,
index index_, py::buffer row)
272 return self.runFunctionAppendedIndex(index_, [&](
auto &ar,
index iC)
277 .def(
"to_device", [](TPair &self,
const std::string &backend)
279 .def(
"to_host", &TPair::to_host);
282 template <
int _n_row,
int _n_col>
288 return pybind11_ArrayEigenUniMatrixBatchPair_define<_n_row, _n_col>(m);
296 template <rowsize mat_n,
size_t N, std::array<
int, N> const &Arr,
size_t... Is>
299 (_pybind11_ArrayEigenUniMatrixBatch_define_dispatch<Arr[Is], mat_n>(m), ...);
300 (_pybind11_ArrayEigenUniMatrixBatchPair_define_dispatch<Arr[Is], mat_n>(m), ...);
303 template <rowsize mat_n>
306 static constexpr auto seq = pybind11_arrayRowsizeInstantiationList;
310 seq>(m, std::make_index_sequence<seq.size()>{});
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.
#define DNDS_assert(expr)
Debug-only assertion (compiled out when DNDS_NDEBUG is defined). Prints the expression + file/line + ...
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).
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,...
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).
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).
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).
Convenience bundle of a father, son, and attached ArrayTransformer.