| 224 | |
| 225 | template <typename seq_type, typename ctype> |
| 226 | bool pyseq2hval(seq_type obj, CompNode cn, DType dtype, HostTensorArgs& ret) { |
| 227 | auto size = obj.size(); |
| 228 | if (size > MEGDNN_MAX_NDIM) { |
| 229 | return false; |
| 230 | } |
| 231 | ctype items[size]; |
| 232 | for (size_t i = 0; i < size; ++i) { |
| 233 | py::handle item = obj[i]; |
| 234 | if (item.get_type().is(py_type<py::int_>())) { |
| 235 | items[i] = (ctype)(dt_int32)item.template cast<py::int_>(); |
| 236 | } else if (item.get_type().is(py_type<py::float_>())) { |
| 237 | items[i] = (ctype)(dt_float32)item.template cast<py::float_>(); |
| 238 | } else { |
| 239 | return false; |
| 240 | } |
| 241 | } |
| 242 | mgb_assert(sizeof(ctype) == dtype.size()); |
| 243 | auto* raw_ptr = new ctype[size]; |
| 244 | std::shared_ptr<dt_byte> raw_storage = { |
| 245 | reinterpret_cast<dt_byte*>(raw_ptr), |
| 246 | [](dt_byte* ptr) { delete[] reinterpret_cast<ctype*>(ptr); }}; |
| 247 | HostTensorStorage storage(cn); |
| 248 | storage.only_reset_raw_storage(cn, sizeof(ctype) * size, raw_storage, 0); |
| 249 | std::memcpy(storage.ptr(), items, sizeof(ctype) * size); |
| 250 | ret.dtype = dtype; |
| 251 | ret.shape = {size}; |
| 252 | ret.storage = HostStorage::make(std::move(storage)); |
| 253 | return true; |
| 254 | } |
| 255 | |
| 256 | template <typename seq_type> |
| 257 | bool pyseq2hval(seq_type obj, CompNode cn, HostTensorArgs& ret) { |