| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| from nanoarrow._array import CDeviceArray |
| from nanoarrow._device import DEVICE_CPU, Device, DeviceType # noqa: F401 |
| from nanoarrow._schema import CSchemaBuilder |
| from nanoarrow.c_array import c_array, c_array_from_buffers |
| from nanoarrow.c_buffer import c_buffer |
| from nanoarrow.c_schema import c_schema |
| |
| |
| def cpu(): |
| return DEVICE_CPU |
| |
| |
| def resolve(device_type: DeviceType, device_id: int): |
| return Device.resolve(DeviceType(device_type).value, device_id) |
| |
| |
| def c_device_array(obj, schema=None): |
| """ArrowDeviceArray wrapper |
| |
| This class provides a user-facing interface to access the fields of an |
| ArrowDeviceArray. |
| |
| These objects are created using :func:`c_device_array`, which accepts any |
| device array or array-like object according to the Arrow device PyCapsule |
| interface, the DLPack protocol, or any object accepted by :func:`c_array`. |
| |
| Parameters |
| ---------- |
| obj : device array-like |
| An object supporting the Arrow device PyCapsule interface, the DLPack |
| protocol, or any object accepted by :func:`c_array`. |
| schema : schema-like or None |
| A schema-like object as sanitized by :func:`c_schema` or None. |
| """ |
| if schema is not None: |
| schema = c_schema(schema) |
| |
| if isinstance(obj, CDeviceArray) and schema is None: |
| return obj |
| |
| if hasattr(obj, "__arrow_c_device_array__"): |
| schema_capsule = None if schema is None else schema.__arrow_c_schema__() |
| schema_capsule, device_array_capsule = obj.__arrow_c_device_array__( |
| requested_schema=schema_capsule |
| ) |
| return CDeviceArray._import_from_c_capsule(schema_capsule, device_array_capsule) |
| |
| if hasattr(obj, "__dlpack__"): |
| buffer = c_buffer(obj, schema=schema) |
| schema = CSchemaBuilder.allocate().set_type(buffer.data_type_id).finish() |
| return c_array_from_buffers( |
| schema, |
| len(buffer), |
| [None, buffer], |
| null_count=0, |
| move=True, |
| device=buffer.device, |
| ) |
| |
| # Attempt to create a CPU array and wrap it |
| cpu_array = c_array(obj, schema=schema) |
| return CDeviceArray._init_from_array(cpu(), cpu_array._addr(), cpu_array.schema) |