@@ -265,182 +265,8 @@ private unsafe NDArray[] _call_tf_sessionrun(KeyValuePair<TF_Output, Tensor>[] f
265265
266266 private static unsafe NDArray fetchValue ( IntPtr output )
267267 {
268- NDArray ret ;
269- using ( var tensor = new Tensor ( output ) )
270- {
271- var ndims = tensor . shape ;
272- var srcAddress = c_api . TF_TensorData ( output ) . ToInt64 ( ) ;
273-
274- if ( ndims . Length == 0 )
275- {
276- switch ( tensor . dtype )
277- {
278- case TF_DataType . TF_BOOL :
279- ret = NDArray . Scalar ( * ( bool * ) srcAddress ) ;
280- break ;
281- case TF_DataType . TF_STRING :
282- using ( var reader = new CodedInputStream ( new IntPtr ( srcAddress ) . Stream ( 8 , ( long ) tensor . bytesize ) ) )
283- ret = new NDArray ( reader . ReadBytes ( ) . ToByteArray ( ) ) ;
284- break ;
285- case TF_DataType . TF_UINT8 :
286- ret = NDArray . Scalar ( * ( byte * ) srcAddress ) ;
287- break ;
288- case TF_DataType . TF_INT16 :
289- ret = NDArray . Scalar ( * ( short * ) srcAddress ) ;
290- break ;
291- case TF_DataType . TF_INT32 :
292- ret = NDArray . Scalar ( * ( int * ) srcAddress ) ;
293- break ;
294- case TF_DataType . TF_INT64 :
295- ret = NDArray . Scalar ( * ( long * ) srcAddress ) ;
296- break ;
297- case TF_DataType . TF_UINT16 :
298- ret = NDArray . Scalar ( * ( ushort * ) srcAddress ) ;
299- break ;
300- case TF_DataType . TF_UINT32 :
301- ret = NDArray . Scalar ( * ( uint * ) srcAddress ) ;
302- break ;
303- case TF_DataType . TF_UINT64 :
304- ret = NDArray . Scalar ( * ( ulong * ) srcAddress ) ;
305- break ;
306- case TF_DataType . TF_FLOAT :
307- ret = NDArray . Scalar ( * ( float * ) srcAddress ) ;
308- break ;
309- case TF_DataType . TF_DOUBLE :
310- ret = NDArray . Scalar ( * ( double * ) srcAddress ) ;
311- break ;
312- default :
313- throw new NotImplementedException ( "can't fetch output" ) ;
314- }
315- }
316- else
317- {
318- //var size = (long) tensor.size;
319- //var itemsize = (long) tensor.itemsize;
320- var bytesize = ( long ) tensor . bytesize ;
321- var src = ( void * ) srcAddress ;
322-
323- #if _REGEN
324- #region Compute
325- switch ( tensor . dtype )
326- {
327- % foreach except( supported_dtypes , "Char" ) , except ( supported_dtypes_lowercase , "char" ) , except ( supported_dtypes_TF_DataType , "TF_STRING" ) %
328- case TF_DataType. #3 :
329- {
330- ret = new NDArray ( NPTypeCode . #1 , ndims , false ) ;
331- System. Buffer . MemoryCopy ( src , #( #3 == "TF_STRING" | "(byte*)ret.Unsafe.Address + 8" | "ret.Unsafe.Address" ) , bytesize , bytesize ) ;
332- break ;
333- }
334- %
335- case TF_DataType. TF_STRING:
336- {
337- //TODO:! This is not the way to handle string[], it should be done with TF_DecodeString
338- using ( var reader = new CodedInputStream ( new IntPtr ( srcAddress ) . Stream ( 8 , ( long ) tensor . bytesize ) ) )
339- ret = NDArray. FromString( reader. ReadString( ) ) ;
340- break ;
341- }
342- default :
343- throw new NotSupportedException ( ) ;
344- }
345- #endregion
346- #else
347-
348- #region Compute
349-
350- switch ( tensor . dtype )
351- {
352- case TF_DataType. TF_BOOL :
353- {
354- ret = new NDArray ( NPTypeCode . Boolean , ndims , false ) ;
355- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
356- break ;
357- }
358-
359- case TF_DataType. TF_UINT8 :
360- {
361- ret = new NDArray ( NPTypeCode . Byte , ndims , false ) ;
362- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
363- break ;
364- }
365-
366- case TF_DataType. TF_INT16 :
367- {
368- ret = new NDArray ( NPTypeCode . Int16 , ndims , false ) ;
369- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
370- break ;
371- }
372-
373- case TF_DataType. TF_UINT16 :
374- {
375- ret = new NDArray ( NPTypeCode . UInt16 , ndims , false ) ;
376- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
377- break ;
378- }
379-
380- case TF_DataType. TF_INT32 :
381- {
382- ret = new NDArray ( NPTypeCode . Int32 , ndims , false ) ;
383- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
384- break ;
385- }
386-
387- case TF_DataType . TF_UINT32 :
388- {
389- ret = new NDArray ( NPTypeCode . UInt32 , ndims , false ) ;
390- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
391- break ;
392- }
393-
394- case TF_DataType . TF_INT64 :
395- {
396- ret = new NDArray ( NPTypeCode . Int64 , ndims , false ) ;
397- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
398- break ;
399- }
400-
401- case TF_DataType . TF_UINT64 :
402- {
403- ret = new NDArray ( NPTypeCode . UInt64 , ndims , false ) ;
404- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
405- break ;
406- }
407-
408- case TF_DataType . TF_DOUBLE :
409- {
410- ret = new NDArray ( NPTypeCode . Double , ndims , false ) ;
411- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
412- break ;
413- }
414-
415- case TF_DataType . TF_FLOAT :
416- {
417- ret = new NDArray ( NPTypeCode . Single , ndims , false ) ;
418- System. Buffer . MemoryCopy ( src , ret . Unsafe . Address , bytesize , bytesize ) ;
419- break ;
420- }
421-
422- case TF_DataType . TF_STRING :
423- {
424- throw new NotImplementedException ( ) ;
425- //TODO:! This is not the way to handle string[], it should be done with TF_DecodeString
426- #pragma warning disable CS0162 // Unreachable code detected
427- using ( var reader = new CodedInputStream ( new IntPtr ( srcAddress ) . Stream ( 8 , ( long ) tensor . bytesize ) ) )
428- #pragma warning restore CS0162 // Unreachable code detected
429- ret = NDArray. FromString ( reader . ReadString ( ) ) ;
430- break ;
431- }
432-
433- default:
434- throw new NotSupportedException( ) ;
435- }
436-
437- #endregion
438-
439- #endif
440- }
441- }
442-
443- return ret;
268+ var tensor = new Tensor ( output ) ;
269+ return tensor . numpy ( ) ;
444270 }
445271
446272 /// <summary>
0 commit comments