コード例 #1
0
        /// <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));
                    }
                }
            }
        }
コード例 #2
0
 /// <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;
         }
     }
 }
コード例 #3
0
        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));
        }
コード例 #4
0
        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));
        }
コード例 #5
0
        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));
            }
        }
コード例 #6
0
 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));
     }
 }