21#include <pybind11/numpy.h>
22#include <pybind11/pybind11.h>
32 static py::array_t<T> convert(std::vector<T> vec) {
36 py::array_t<T> ret({len});
37 auto r = ret.mutable_unchecked();
39 for (
u32 i = 0; i < len; i++) {
43 return std::move(ret);
50 static py::array_t<T> convert(std::vector<sycl::vec<T, 2>> vec) {
54 py::array_t<T> ret({len, 2U});
55 auto r = ret.mutable_unchecked();
57 for (
u32 i = 0; i < len; i++) {
61 return std::move(ret);
68 static py::array_t<T> convert(std::vector<sycl::vec<T, 3>> vec) {
72 py::array_t<T> ret({len, 3U});
73 auto r = ret.mutable_unchecked();
75 for (
u32 i = 0; i < len; i++) {
80 return std::move(ret);
87 static py::array_t<T> convert(std::vector<sycl::vec<T, 4>> vec) {
91 py::array_t<T> ret({len, 4U});
92 auto r = ret.mutable_unchecked();
94 for (
u32 i = 0; i < len; i++) {
100 return std::move(ret);
107 static py::array_t<T> convert(std::vector<sycl::vec<T, 8>> vec) {
109 u32 len = vec.size();
111 py::array_t<T> ret({len, 8U});
112 auto r = ret.mutable_unchecked();
114 for (
u32 i = 0; i < len; i++) {
115 r(i, 0) = vec[i].s0();
116 r(i, 1) = vec[i].s1();
117 r(i, 2) = vec[i].s2();
118 r(i, 3) = vec[i].s3();
119 r(i, 4) = vec[i].s4();
120 r(i, 5) = vec[i].s5();
121 r(i, 6) = vec[i].s6();
122 r(i, 7) = vec[i].s7();
124 return std::move(ret);
131 static py::array_t<T> convert(std::vector<sycl::vec<T, 16>> vec) {
133 u32 len = vec.size();
135 py::array_t<T> ret({len, 16U});
136 auto r = ret.mutable_unchecked();
138 for (
u32 i = 0; i < len; i++) {
139 r(i, 0) = vec[i].s0();
140 r(i, 1) = vec[i].s1();
141 r(i, 2) = vec[i].s2();
142 r(i, 3) = vec[i].s3();
143 r(i, 4) = vec[i].s4();
144 r(i, 5) = vec[i].s5();
145 r(i, 6) = vec[i].s6();
146 r(i, 7) = vec[i].s7();
147 r(i, 8) = vec[i].s8();
148 r(i, 9) = vec[i].s9();
149 r(i, 10) = vec[i].sA();
150 r(i, 11) = vec[i].sB();
151 r(i, 12) = vec[i].sC();
152 r(i, 13) = vec[i].sD();
153 r(i, 14) = vec[i].sE();
154 r(i, 15) = vec[i].sF();
157 return std::move(ret);
164 std::vector<std::reference_wrapper<shamrock::patch::PatchDataLayer>> ref_lst,
169 auto appender = [&](
auto &field) {
170 if (field.get_name() == key) {
175 auto acc = field.get_buf().copy_to_stdvec();
176 u32 len = field.get_val_cnt();
178 for (
u32 i = 0; i < len; i++) {
179 vec.push_back(acc[i]);
185 for (
auto &pdat_ref : ref_lst) {
186 auto &pdat = pdat_ref.get();
187 if (pdat.get_obj_cnt() > 0) {
188 pdat.for_each_field<T>([&](
auto &field) {
195 auto arr = VecToNumpy<T>::convert(vec);
197 logger::debug_ln(
"PatchDataToPy",
"adding -> ", key);
199 if (dic_out.contains(key.c_str())) {
202 dic_out[key.c_str()] = arr;
210 std::vector<std::unique_ptr<shamrock::patch::PatchDataLayer>> &lst,
213 std::vector<std::reference_wrapper<shamrock::patch::PatchDataLayer>> ref_lst;
214 for (
auto &pdat : lst) {
216 ref_lst.push_back(*pdat);
220 append_to_map<T>(key, ref_lst, dic_out);
223 inline py::dict pdat_to_dic(shamrock::patch::PatchDataLayer &pdat) {
226 std::reference_wrapper<shamrock::patch::PatchDataLayer> ref_pdat = pdat;
228 using namespace shamrock;
231 append_to_map<f32>(fname, {ref_pdat}, dic_out);
232 append_to_map<f32_2>(fname, {ref_pdat}, dic_out);
233 append_to_map<f32_3>(fname, {ref_pdat}, dic_out);
234 append_to_map<f32_4>(fname, {ref_pdat}, dic_out);
235 append_to_map<f32_8>(fname, {ref_pdat}, dic_out);
236 append_to_map<f32_16>(fname, {ref_pdat}, dic_out);
237 append_to_map<f64>(fname, {ref_pdat}, dic_out);
238 append_to_map<f64_2>(fname, {ref_pdat}, dic_out);
239 append_to_map<f64_3>(fname, {ref_pdat}, dic_out);
240 append_to_map<f64_4>(fname, {ref_pdat}, dic_out);
241 append_to_map<f64_8>(fname, {ref_pdat}, dic_out);
242 append_to_map<f64_16>(fname, {ref_pdat}, dic_out);
243 append_to_map<u32>(fname, {ref_pdat}, dic_out);
244 append_to_map<u64>(fname, {ref_pdat}, dic_out);
245 append_to_map<u32_3>(fname, {ref_pdat}, dic_out);
246 append_to_map<u64_3>(fname, {ref_pdat}, dic_out);
247 append_to_map<i64_3>(fname, {ref_pdat}, dic_out);
255 inline bool try_get_field_as_np(
256 shamrock::patch::PatchDataLayer &pdat,
257 const std::string &key,
258 std::optional<py::object> &ret) {
260 pdat.for_each_field<T>([&](
auto &field) {
261 if (ret.has_value() || field.get_name() != key) {
264 ret = VecToNumpy<T>::convert(field.get_buf().copy_to_stdvec());
267 return ret.has_value();
279 class PatchDataLazyGetter {
285 py::object get_item(
const std::string &key)
const {
286 std::optional<py::object> ret;
289 details::try_get_field_as_np<f32>(pdat, key, ret)
290 || details::try_get_field_as_np<f32_2>(pdat, key, ret)
291 || details::try_get_field_as_np<f32_3>(pdat, key, ret)
292 || details::try_get_field_as_np<f32_4>(pdat, key, ret)
293 || details::try_get_field_as_np<f32_8>(pdat, key, ret)
294 || details::try_get_field_as_np<f32_16>(pdat, key, ret)
295 || details::try_get_field_as_np<f64>(pdat, key, ret)
296 || details::try_get_field_as_np<f64_2>(pdat, key, ret)
297 || details::try_get_field_as_np<f64_3>(pdat, key, ret)
298 || details::try_get_field_as_np<f64_4>(pdat, key, ret)
299 || details::try_get_field_as_np<f64_8>(pdat, key, ret)
300 || details::try_get_field_as_np<f64_16>(pdat, key, ret)
301 || details::try_get_field_as_np<u32>(pdat, key, ret)
302 || details::try_get_field_as_np<u64>(pdat, key, ret)
303 || details::try_get_field_as_np<u32_3>(pdat, key, ret)
304 || details::try_get_field_as_np<u64_3>(pdat, key, ret)
305 || details::try_get_field_as_np<i64_3>(pdat, key, ret);
308 if (!ret.has_value()) {
309 throw py::key_error(key);
std::uint32_t u32
32 bit unsigned integer
std::vector< std::string > get_field_names()
Get the list of field names.
PatchDataLayer container class, the layout is described in patchdata_layout.
ExcptTypes make_except_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Create an exception with a message and a location.
namespace for the main framework
Pybind11 include and definitions.
void debug_ln(std::string module_name, Types... var2)
Prints a log message with multiple arguments followed by a newline.