@@ -21,6 +21,7 @@ limitations under the License.
2121using System . Numerics ;
2222using System . Text ;
2323using static Tensorflow . c_api ;
24+ using static Tensorflow . Binding ;
2425
2526namespace Tensorflow
2627{
@@ -31,7 +32,7 @@ public partial class Tensor
3132
3233 public Tensor ( )
3334 {
34-
35+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
3536 }
3637
3738 /// <summary>
@@ -41,60 +42,7 @@ public Tensor()
4142 public Tensor ( IntPtr handle )
4243 {
4344 _handle = handle ;
44- //no need to set AllocationType = AllocationType.None;
45- #if TRACK_TENSOR_LIFE
46- print ( $ "New Tensor 0x{ _handle . ToString ( "x16" ) } { AllocationType } String Data: 0x{ TensorDataPointer . ToString ( "x16" ) } ") ;
47- #endif
48- }
49-
50- unsafe internal Tensor ( Shape shape , TF_DataType dtype )
51- => _handle = TF_NewTensor ( shape , dtype , null ) ;
52-
53- internal Tensor ( Array array , Shape ? shape = null )
54- => InitTensor ( array , shape ) ;
55-
56- unsafe void InitTensor ( Array array , Shape ? shape = null )
57- {
58- shape = shape ?? array . GetShape ( ) ;
59- var dtype = array . GetType ( ) . GetElementType ( ) . as_tf_dtype ( ) ;
60-
61- switch ( array )
62- {
63- case bool [ ] val :
64- fixed ( void * addr = & val [ 0 ] )
65- _handle = TF_NewTensor ( shape , dtype , addr ) ;
66- break ;
67- case int [ ] val :
68- fixed ( void * addr = & val [ 0 ] )
69- _handle = TF_NewTensor ( shape , dtype , addr ) ;
70- break ;
71- case int [ , ] val :
72- fixed ( void * addr = & val [ 0 , 0 ] )
73- _handle = TF_NewTensor ( shape , dtype , addr ) ;
74- break ;
75- case long [ ] val :
76- fixed ( void * addr = & val [ 0 ] )
77- _handle = TF_NewTensor ( shape , dtype , addr ) ;
78- break ;
79- case float [ ] val :
80- fixed ( void * addr = & val [ 0 ] )
81- _handle = TF_NewTensor ( shape , dtype , addr ) ;
82- break ;
83- case float [ , ] val :
84- fixed ( void * addr = & val [ 0 , 0 ] )
85- _handle = TF_NewTensor ( shape , dtype , addr ) ;
86- break ;
87- case double [ ] val :
88- fixed ( void * addr = & val [ 0 ] )
89- _handle = TF_NewTensor ( shape , dtype , addr ) ;
90- break ;
91- case double [ , ] val :
92- fixed ( void * addr = & val [ 0 , 0 ] )
93- _handle = TF_NewTensor ( shape , dtype , addr ) ;
94- break ;
95- default :
96- throw new NotImplementedException ( "" ) ;
97- }
45+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
9846 }
9947
10048 /// <summary>
@@ -109,22 +57,26 @@ unsafe void InitTensor(Array array, Shape? shape = null)
10957 public Tensor ( IntPtr data_ptr , long [ ] shape , TF_DataType dType , int num_bytes )
11058 {
11159 _handle = TF_NewTensor ( dType , dims : shape , num_dims : shape . Length , data : data_ptr , len : ( ulong ) num_bytes ) ;
60+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
11261 }
11362
11463 public unsafe Tensor ( NDArray nd )
115- => _handle = TF_NewTensor ( nd . shape , nd . dtype , nd . data . ToPointer ( ) ) ;
64+ {
65+ _handle = TF_NewTensor ( nd . shape , nd . dtype , nd . data . ToPointer ( ) ) ;
66+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
67+ }
11668
11769 #region scala
118- public Tensor ( bool value ) => _handle = TF_NewTensor ( value ) ;
119- public Tensor ( byte value ) => _handle = TF_NewTensor ( value ) ;
120- public Tensor ( sbyte value ) => _handle = TF_NewTensor ( value ) ;
121- public Tensor ( short value ) => _handle = TF_NewTensor ( value ) ;
122- public Tensor ( int value ) => _handle = TF_NewTensor ( value ) ;
123- public Tensor ( uint value ) => _handle = TF_NewTensor ( value ) ;
124- public Tensor ( long value ) => _handle = TF_NewTensor ( value ) ;
125- public Tensor ( ulong value ) => _handle = TF_NewTensor ( value ) ;
126- public Tensor ( float value ) => _handle = TF_NewTensor ( value ) ;
127- public Tensor ( double value ) => _handle = TF_NewTensor ( value ) ;
70+ public Tensor ( bool value ) => InitTensor ( value ) ;
71+ public Tensor ( byte value ) => InitTensor ( value ) ;
72+ public Tensor ( sbyte value ) => InitTensor ( value ) ;
73+ public Tensor ( short value ) => InitTensor ( value ) ;
74+ public Tensor ( int value ) => InitTensor ( value ) ;
75+ public Tensor ( uint value ) => InitTensor ( value ) ;
76+ public Tensor ( long value ) => InitTensor ( value ) ;
77+ public Tensor ( ulong value ) => InitTensor ( value ) ;
78+ public Tensor ( float value ) => InitTensor ( value ) ;
79+ public Tensor ( double value ) => InitTensor ( value ) ;
12880 #endregion
12981
13082 #region 1d array
@@ -142,31 +94,74 @@ public unsafe Tensor(NDArray nd)
14294 public Tensor ( Complex [ ] data , Shape ? shape = null ) => InitTensor ( data , shape ) ;
14395 #endregion
14496
145- /// <summary>
146- /// Create a string Tensor from the given string
147- /// </summary>
148- public Tensor ( string str )
97+ public Tensor ( Operation op , int value_index , TF_DataType dtype )
98+ {
99+ _op = op ;
100+ _value_index = value_index ;
101+ _override_dtype = dtype ;
102+ _id = ops . uid ( ) ;
103+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
104+ }
105+
106+ internal Tensor ( Shape shape , TF_DataType dtype ) => InitTensor ( shape , dtype ) ;
107+ internal Tensor ( Array array , Shape ? shape = null ) => InitTensor ( array , shape ) ;
108+ internal Tensor ( string value ) => InitTensor ( value ) ;
109+
110+ protected unsafe void InitTensor < T > ( T data ) where T : unmanaged
149111 {
150- _handle = StringTensor ( new string [ ] { str } , TensorShape . Scalar ) ;
151- #if TRACK_TENSOR_LIFE
152- print ( $ "New Tensor 0x{ _handle . ToString ( "x16" ) } { AllocationType } String Data: 0x{ TensorDataPointer . ToString ( "x16" ) } ") ;
153- #endif
112+ _handle = TF_NewTensor ( data ) ;
113+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
154114 }
155115
156- public Tensor ( string [ ] strings )
116+ protected unsafe void InitTensor ( Shape shape , TF_DataType dtype )
157117 {
158- _handle = StringTensor ( strings , new TensorShape ( strings . Length ) ) ;
159- #if TRACK_TENSOR_LIFE
160- print ( $ "New Tensor 0x{ _handle . ToString ( "x16" ) } { AllocationType } String Data: 0x{ TensorDataPointer . ToString ( "x16" ) } ") ;
161- #endif
118+ _handle = TF_NewTensor ( shape , dtype , null ) ;
119+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
162120 }
163121
164- public Tensor ( Operation op , int value_index , TF_DataType dtype )
122+ protected void InitTensor ( string value )
165123 {
166- _op = op ;
167- _value_index = value_index ;
168- _override_dtype = dtype ;
169- _id = ops . uid ( ) ;
124+ _handle = StringTensor ( new [ ] { value } , TensorShape . Scalar ) ;
125+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
126+ }
127+
128+ protected unsafe void InitTensor ( Array array , Shape ? shape = null )
129+ {
130+ shape = shape ?? array . GetShape ( ) ;
131+ var dtype = array . GetType ( ) . GetElementType ( ) . as_tf_dtype ( ) ;
132+
133+ switch ( array )
134+ {
135+ case bool [ ] val : fixed ( void * addr = & val [ 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
136+ case bool [ , ] val : fixed ( void * addr = & val [ 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
137+ case bool [ , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
138+ case bool [ , , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
139+ case byte [ ] val : fixed ( void * addr = & val [ 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
140+ case byte [ , ] val : fixed ( void * addr = & val [ 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
141+ case byte [ , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
142+ case byte [ , , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
143+ case int [ ] val : fixed ( void * addr = & val [ 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
144+ case int [ , ] val : fixed ( void * addr = & val [ 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
145+ case int [ , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
146+ case int [ , , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
147+ case long [ ] val : fixed ( void * addr = & val [ 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
148+ case long [ , ] val : fixed ( void * addr = & val [ 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
149+ case long [ , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
150+ case long [ , , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
151+ case float [ ] val : fixed ( void * addr = & val [ 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
152+ case float [ , ] val : fixed ( void * addr = & val [ 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
153+ case float [ , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
154+ case float [ , , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
155+ case double [ ] val : fixed ( void * addr = & val [ 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
156+ case double [ , ] val : fixed ( void * addr = & val [ 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
157+ case double [ , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
158+ case double [ , , , ] val : fixed ( void * addr = & val [ 0 , 0 , 0 , 0 ] ) _handle = TF_NewTensor ( shape , dtype , addr ) ; break ;
159+ case string [ ] val : _handle = StringTensor ( val , shape ) ; break ;
160+ default :
161+ throw new NotImplementedException ( "" ) ;
162+ }
163+
164+ isCreatedInGraphMode = ! tf . executing_eagerly ( ) ;
170165 }
171166 }
172167}
0 commit comments