/// <summary> /// This method maps keys and values of the map and copies them into a Dictionary /// and returns as an instance of DisposableNamedOnnxValue that does not own or dispose /// any onnx/ortValueElement. The method takes possession of ortValueTensorKeys and ortValueTensorValues /// and disposes of them. The original ortValueElement looses ownership of the Tensor. The caller is still responsible /// for disposing these arguments. Disposing ortValueElement that does not have ownership is a no-op, however, either /// of the arguments may still need to be disposed on exception. /// </summary> /// <typeparam name="K">key type</typeparam> /// <typeparam name="V">value type</typeparam> /// <param name="name">name of the output parameter</param> /// <param name="ortValueTensorKeys">tensor with map keys.</param> /// <param name="nativeOnnxValueValues">tensor with map values</param> /// <returns>instance of DisposableNamedOnnxValue with Dictionary</returns> private static DisposableNamedOnnxValue DisposableNamedOnnxValueFromNativeMapElements <K, V>(string name, OrtValue ortValueTensorKeys, OrtValue ortValueTensorValues) { using (var nativeTensorWrapperValues = new NativeOnnxTensorMemory <V>(ortValueTensorValues)) { var denseTensorValues = new DenseTensor <V>(nativeTensorWrapperValues.Memory, nativeTensorWrapperValues.Dimensions); if (typeof(K) == typeof(string)) { var map = new Dictionary <string, V>(); using (var nativeTensorWrapper = new NativeOnnxTensorMemory <string>(ortValueTensorKeys)) { var denseTensorKeys = new DenseTensor <string>(nativeTensorWrapper.GetBytesAsStringMemory(), nativeTensorWrapper.Dimensions); for (var i = 0; i < denseTensorKeys.Length; i++) { map.Add(denseTensorKeys.GetValue(i), denseTensorValues.GetValue(i)); } return(new DisposableNamedOnnxValue(name, map, OnnxValueType.ONNX_TYPE_MAP, TensorElementType.DataTypeMax, null)); } } else { var map = new Dictionary <K, V>(); using (var nativeTensorWrapper = new NativeOnnxTensorMemory <K>(ortValueTensorKeys)) { var denseTensorKeys = new DenseTensor <K>(nativeTensorWrapper.Memory, nativeTensorWrapper.Dimensions); for (var i = 0; i < denseTensorKeys.Length; i++) { map.Add(denseTensorKeys.GetValue(i), denseTensorValues.GetValue(i)); } return(new DisposableNamedOnnxValue(name, map, OnnxValueType.ONNX_TYPE_MAP, TensorElementType.DataTypeMax, null)); } } } }
/// <summary> /// This method creates an instance of DisposableNamedOnnxValue that has possession of ortValueElement /// native memory Tensor and returns it to the caller. The original ortValueElement argument looses /// ownership of the native ortValueElement handle, however, the caller is still responsible for disposing them /// on exception. Disposing of OrtValue that has no ownership is a no-op and fine. /// </summary> /// <typeparam name="T">data type</typeparam> /// <param name="name">name of the output</param> /// <param name="ortValue">native tensor</param> /// <returns>DisposableNamedOnnxValue instance</returns> private static DisposableNamedOnnxValue DisposableNamedOnnxValueFromNativeTensor <T>(string name, OrtValue ortValue) { if (typeof(T) == typeof(string)) { var nativeTensorWrapper = new NativeOnnxTensorMemory <string>(ortValue); try { var dt = new DenseTensor <string>(nativeTensorWrapper.GetBytesAsStringMemory(), nativeTensorWrapper.Dimensions); return(new DisposableNamedOnnxValue(name, dt, OnnxValueType.ONNX_TYPE_TENSOR, nativeTensorWrapper.ElementType, nativeTensorWrapper)); } catch (Exception) { nativeTensorWrapper.Dispose(); throw; } } else { NativeOnnxTensorMemory <T> nativeTensorWrapper = new NativeOnnxTensorMemory <T>(ortValue); try { DenseTensor <T> dt = new DenseTensor <T>(nativeTensorWrapper.Memory, nativeTensorWrapper.Dimensions); return(new DisposableNamedOnnxValue(name, dt, OnnxValueType.ONNX_TYPE_TENSOR, nativeTensorWrapper.ElementType, nativeTensorWrapper)); } catch (Exception) { nativeTensorWrapper.Dispose(); throw; } } }
private static NamedOnnxValue NameOnnxValueFromNativeTensor <T>(string name, IntPtr nativeOnnxValue) { NativeOnnxTensorMemory <T> nativeTensorWrapper = new NativeOnnxTensorMemory <T>(nativeOnnxValue); DenseTensor <T> dt = new DenseTensor <T>(nativeTensorWrapper.Memory, nativeTensorWrapper.Dimensions); return(NamedOnnxValue.CreateFromTensor <T>(name, dt)); }
private static DisposableNamedOnnxValue NameOnnxValueFromNativeTensor <T>(string name, IntPtr nativeOnnxValue) { NativeOnnxTensorMemory <T> nativeTensorWrapper = new NativeOnnxTensorMemory <T>(nativeOnnxValue); DenseTensor <T> dt = new DenseTensor <T>(nativeTensorWrapper.Memory, nativeTensorWrapper.Dimensions); return(new DisposableNamedOnnxValue(name, dt, nativeTensorWrapper)); }
private static DisposableNamedOnnxValue DisposableNamedOnnxValueFromNativeMap <K, V>(string name, IntPtr nativeOnnxValueKeys, IntPtr nativeOnnxValueValues) { var nativeTensorWrapperValues = new NativeOnnxTensorMemory <V>(nativeOnnxValueValues); var denseTensorValues = new DenseTensor <V>(nativeTensorWrapperValues.Memory, nativeTensorWrapperValues.Dimensions); if (typeof(K) == typeof(string)) { var map = new Dictionary <string, V>(); var nativeTensorWrapper = new NativeOnnxTensorMemory <byte>(nativeOnnxValueKeys, true); var denseTensorKeys = new DenseTensor <string>(nativeTensorWrapper.GetBytesAsStringMemory(), nativeTensorWrapper.Dimensions); for (var i = 0; i < denseTensorKeys.Length; i++) { map.Add(denseTensorKeys.GetValue(i), denseTensorValues.GetValue(i)); } // release native memory nativeTensorWrapperValues.Dispose(); nativeTensorWrapper.Dispose(); return(new DisposableNamedOnnxValue(string.Empty, map, null)); } else { var map = new Dictionary <K, V>(); var nativeTensorWrapper = new NativeOnnxTensorMemory <K>(nativeOnnxValueKeys); var denseTensorKeys = new DenseTensor <K>(nativeTensorWrapper.Memory, nativeTensorWrapper.Dimensions); for (var i = 0; i < denseTensorKeys.Length; i++) { map.Add(denseTensorKeys.GetValue(i), denseTensorValues.GetValue(i)); } // release native memory nativeTensorWrapperValues.Dispose(); nativeTensorWrapper.Dispose(); return(new DisposableNamedOnnxValue(string.Empty, map, null)); } }
private static DisposableNamedOnnxValue DisposableNamedOnnxValueFromNativeTensor <T>(string name, IntPtr nativeOnnxValue) { if (typeof(T) == typeof(string)) { var nativeTensorWrapper = new NativeOnnxTensorMemory <string>(nativeOnnxValue); var dt = new DenseTensor <string>(nativeTensorWrapper.GetBytesAsStringMemory(), nativeTensorWrapper.Dimensions); return(new DisposableNamedOnnxValue(name, dt, OnnxValueType.ONNX_TYPE_TENSOR, nativeTensorWrapper.ElementType, nativeTensorWrapper)); } else { NativeOnnxTensorMemory <T> nativeTensorWrapper = new NativeOnnxTensorMemory <T>(nativeOnnxValue); DenseTensor <T> dt = new DenseTensor <T>(nativeTensorWrapper.Memory, nativeTensorWrapper.Dimensions); return(new DisposableNamedOnnxValue(name, dt, OnnxValueType.ONNX_TYPE_TENSOR, nativeTensorWrapper.ElementType, nativeTensorWrapper)); } }