57 auto name = appendName<T>(
"obj_");
61 py::class_<Class> carmaWrapObj(mod,
name.data(), py::buffer_protocol());
64 const py::array_t<T, py::array::f_style |
65 py::array::forcecast> &data) {
66 int ndim =
data.ndim() + 1;
67 std::vector<long> data_dims(ndim);
68 data_dims[0] =
data.ndim();
69 copy(
data.shape(),
data.shape() +
data.ndim(), begin(data_dims) + 1);
70 return std::unique_ptr<Class>(
71 new Class(&c, data_dims.data(), (
const T *)
data.data()));
74 py::arg(
"context").none(
false), py::arg(
"h_data").none(
false));
76 carmaWrapObj.def(py::init([](
CarmaContext &c,
const Class &data) {
77 return std::unique_ptr<Class>(
new Class(&c, &data));
80 py::arg(
"context").none(
false),
81 py::arg(
"d_data").none(
false));
83 carmaWrapObj.def_buffer([](Class &frame) -> py::buffer_info {
86 const long *dims =
frame.get_dims();
87 std::vector<ssize_t> shape(dims[0]);
88 std::vector<ssize_t> strides(dims[0]);
89 ssize_t stride =
sizeof(T);
100 for (ssize_t dim(0); dim < dims[0]; ++dim) {
101 shape[dim] = dims[dim + 1];
102 strides[dim] = stride;
103 stride *= shape[dim];
106 return py::buffer_info(
frame.get_h_data(),
sizeof(T),
107 py::format_descriptor<T>::format(), dims[0], shape,
114 carmaWrapObj.def_property_readonly(
"nb_streams", &Class::get_nb_streams,
117 carmaWrapObj.def(
"add_stream", (
int (Class::*)()) & Class::add_stream,
120 carmaWrapObj.def(
"add_stream", (
int (Class::*)(
int)) & Class::add_stream,
124 carmaWrapObj.def(
"del_stream", (
int (Class::*)()) & Class::del_stream,
127 carmaWrapObj.def(
"del_stream", (
int (Class::*)(
int)) & Class::del_stream,
131 carmaWrapObj.def(
"wait_stream", &Class::wait_stream,
"TODO",
134 "swap_ptr", [](Class &obj, Class &obj2) { obj.swap_ptr(obj2.get_data()); },
138 carmaWrapObj.def(
"wait_all_streams", &Class::wait_all_streams,
142 carmaWrapObj.def_property_readonly(
144 [](Class &frame) -> py::array_t<long> {
145 long nb_dim =
frame.get_dims(0);
146 const long *c_dim =
frame.get_dims() + 1;
147 return py::array_t<long>(nb_dim, c_dim);
152 carmaWrapObj.def_property_readonly(
"nbElem", &Class::get_nb_elements,
155 carmaWrapObj.def_property_readonly(
"context", &Class::get_context,
158 carmaWrapObj.def_property_readonly(
"device", &Class::get_device,
169 py::array_t<T, py::array::f_style | py::array::forcecast> &data) {
170 c.host2device(
data.data());
173 py::arg(
"data").none(
false));
178 py::array_t<T, py::array::f_style | py::array::forcecast> &data) {
179 c.device2host(
data.mutable_data());
182 py::arg(
"data").none(
false));
187 [](Class &src, Class &dest,
long nb_elem) {
189 nb_elem = src.get_nb_elements();
191 src.copy_into(dest, nb_elem);
193 "TODO", py::arg(
"dest"),
194 py::arg(
"nb_elem") = -1);
198 [](Class &dest, Class &src,
long nb_elem) {
200 nb_elem = dest.get_nb_elements();
202 dest.copy_from(src, nb_elem);
204 "TODO", py::arg(
"data"),
205 py::arg(
"nb_elem") = -1);
207 carmaWrapObj.def(
"copy_into",
208 (
int (Class::*)(ipc::Cacao<T> *)) & Class::copy_into);
209 carmaWrapObj.def(
"copy_from",
210 (
int (Class::*)(ipc::Cacao<T> *)) & Class::copy_from);
213 carmaWrapObj.def(
"reset", &Class::reset,
221 carmaWrapObj.def(
"init_reduceCub", &Class::init_reduceCub,
224 carmaWrapObj.def(
"reduceCub", &Class::reduceCub,
234 "transpose", &Class::transpose,
"TODO",
235 py::arg(
"source").none(
false));
240 carmaWrapObj.def(
"aimax", &Class::aimax,
"TODO",
241 py::arg(
"incx") = 1);
243 carmaWrapObj.def(
"aimin", &Class::aimin,
"TODO",
244 py::arg(
"incx") = 1);
260 carmaWrapObj.def(
"swap", &Class::swap,
"TODO",
261 py::arg(
"source").none(
false), py::arg(
"incx") = 1,
262 py::arg(
"incy") = 1);
264 carmaWrapObj.def(
"copy", &Class::copy,
268 carmaWrapObj.def(
"is_rng_init", &Class::is_rng_init);
270 carmaWrapObj.def(
"init_prng", (
int (Class::*)()) & Class::init_prng);
272 carmaWrapObj.def(
"init_prng", (
int (Class::*)(
long)) & Class::init_prng);
274 carmaWrapObj.def(
"destroy_prng", &Class::destroy_prng);
281 carmaWrapObj.def(
"prng",
282 (
int (Class::*)(
char,
float,
float)) & Class::prng);
284 carmaWrapObj.def(
"prng", (
int (Class::*)(
char,
float)) & Class::prng);
286 carmaWrapObj.def(
"prng", (
int (Class::*)(
char)) & Class::prng);
290 [](Class &data,
int seed,
char gtype) {
291 data.init_prng(seed);
294 py::arg(
"seed") = 1234, py::arg(
"j") =
'U');
298 [](Class &data,
int seed,
char gtype) {
299 data.init_prng_host(seed);
300 data.prng_host(gtype);
302 py::arg(
"seed") = 1234, py::arg(
"j") =
'U');
322 [](Class &data, Class &dest,
int direction) {
323 throw std::runtime_error(
"not implemented");
332 py::arg(
"dest") =
nullptr, py::arg(
"direction") = 1);
428 appendName<T>(
"magma_syevd_").data(),
429 [](Class &d_mat_a, ClassHost &eigenvals, Class *d_U,
bool computeU) {
430 if (d_U ==
nullptr) {
437 d_U->copy_from(d_mat_a, d_mat_a.get_nb_elements());
445 py::arg(
"d_mat_a"), py::arg(
"eigenvals"), py::arg(
"d_U") =
nullptr,
446 py::arg(
"computeU") =
true);
449 appendName<T>(
"syevd_").data(),
450 [](Class &d_mat_a, Class &eigenvals, Class *d_U,
bool computeU) {
451 if (d_U ==
nullptr) {
453 carma_syevd(CUSOLVER_EIG_MODE_VECTOR, &d_mat_a, &eigenvals);
455 carma_syevd(CUSOLVER_EIG_MODE_NOVECTOR, &d_mat_a, &eigenvals);
458 d_U->copy_from(d_mat_a, d_mat_a.get_nb_elements());
460 carma_syevd(CUSOLVER_EIG_MODE_VECTOR, d_U, &eigenvals);
462 carma_syevd(CUSOLVER_EIG_MODE_NOVECTOR, d_U, &eigenvals);
466 py::arg(
"d_mat_a"), py::arg(
"eigenvals"), py::arg(
"d_U") =
nullptr,
467 py::arg(
"computeU") =
true);
479 mod.def(appendName<T>(
"magma_getri_").data(), &carma_magma_getri<T>);
483 mod.def(appendName<T>(
"magma_potri_").data(), &carma_magma_potri<T>);