1use candle_core::DType;
2use ort_sys::OrtErrorCode;
3
4mod api;
5mod memory;
6mod session;
7mod tensor;
8
9pub(crate) use ort_sys::stub::Error;
10
11pub use self::api::api;
12
13pub(crate) struct Environment {}
14
15impl Environment {
16 pub fn new_sys() -> *mut ort_sys::OrtEnv {
17 (Box::leak(Box::new(Self {})) as *mut Environment).cast()
18 }
19
20 pub unsafe fn cast_from_sys<'e>(ptr: *const ort_sys::OrtEnv) -> &'e Environment {
21 unsafe { &*ptr.cast::<Environment>() }
22 }
23
24 pub unsafe fn consume_sys(ptr: *mut ort_sys::OrtEnv) -> Box<Environment> {
25 Box::from_raw(ptr.cast::<Environment>())
26 }
27}
28
29fn convert_sys_to_dtype(sys: ort_sys::ONNXTensorElementDataType) -> Result<DType, Error> {
30 match sys {
31 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8 => Ok(DType::U8),
32 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT32 => Ok(DType::U32),
33 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT16 => Ok(DType::I16),
34 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32 => Ok(DType::I32),
35 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64 => Ok(DType::I64),
36 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_BFLOAT16 => Ok(DType::BF16),
37 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16 => Ok(DType::F16),
38 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT => Ok(DType::F32),
39 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE => Ok(DType::F64),
40 ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT8E4M3FN => Ok(DType::F8E4M3),
41 _ => Err(Error::new(OrtErrorCode::ORT_FAIL, "Element type not supported by candle"))
42 }
43}
44
45fn convert_dtype_to_sys(dtype: DType) -> Result<ort_sys::ONNXTensorElementDataType, Error> {
46 match dtype {
47 DType::U8 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8),
48 DType::U32 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT32),
49 DType::I16 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT16),
50 DType::I32 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32),
51 DType::I64 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64),
52 DType::BF16 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_BFLOAT16),
53 DType::F16 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16),
54 DType::F32 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT),
55 DType::F64 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE),
56 DType::F8E4M3 => Ok(ort_sys::ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT8E4M3FN),
57 _ => Err(Error::new(OrtErrorCode::ORT_FAIL, "Element type not supported by ONNX Runtime"))
58 }
59}