| @@ -59,6 +59,6 @@ namespace Tensorflow | |||||
| } | } | ||||
| [DllImport(TensorFlowLibName)] | [DllImport(TensorFlowLibName)] | ||||
| public static unsafe extern IntPtr TF_Version(); | |||||
| public static extern IntPtr TF_Version(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -308,15 +308,14 @@ namespace Tensorflow | |||||
| public static IEnumerable TupleToEnumerable(object tuple) | public static IEnumerable TupleToEnumerable(object tuple) | ||||
| { | { | ||||
| Type t = tuple.GetType(); | Type t = tuple.GetType(); | ||||
| if(t.IsGenericType && (t.FullName.StartsWith("System.Tuple") || t.FullName.StartsWith("System.ValueTuple"))) | |||||
| if (t.IsGenericType && (t.FullName.StartsWith("System.Tuple") || t.FullName.StartsWith("System.ValueTuple"))) | |||||
| { | { | ||||
| var flds = t.GetFields(); | var flds = t.GetFields(); | ||||
| for(int i = 0; i < flds.Length;i++) | |||||
| for (int i = 0; i < flds.Length; i++) | |||||
| { | { | ||||
| yield return flds[i].GetValue(tuple); | yield return flds[i].GetValue(tuple); | ||||
| } | } | ||||
| } | |||||
| else | |||||
| } else | |||||
| { | { | ||||
| throw new System.Exception("Expected Tuple."); | throw new System.Exception("Expected Tuple."); | ||||
| } | } | ||||
| @@ -329,12 +328,9 @@ namespace Tensorflow | |||||
| public static bool isinstance(object Item1, object tuple) | public static bool isinstance(object Item1, object tuple) | ||||
| { | { | ||||
| var tup = TupleToEnumerable(tuple); | |||||
| foreach(var t in tup) | |||||
| { | |||||
| if(isinstance(Item1, (Type)t)) | |||||
| foreach (var t in TupleToEnumerable(tuple)) | |||||
| if (isinstance(Item1, (Type) t)) | |||||
| return true; | return true; | ||||
| } | |||||
| return false; | return false; | ||||
| } | } | ||||
| } | } | ||||
| @@ -66,7 +66,7 @@ namespace Tensorflow | |||||
| return buffer.Data; | return buffer.Data; | ||||
| } | } | ||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| => c_api.TF_DeleteBuffer(handle); | => c_api.TF_DeleteBuffer(handle); | ||||
| } | } | ||||
| } | } | ||||
| @@ -29,49 +29,54 @@ namespace Tensorflow | |||||
| protected DisposableObject() { } | protected DisposableObject() { } | ||||
| public DisposableObject(IntPtr handle) | |||||
| { | |||||
| _handle = handle; | |||||
| } | |||||
| protected virtual void DisposeManagedState() | |||||
| { | |||||
| } | |||||
| protected abstract void DisposeUnManagedState(IntPtr handle); | |||||
| protected DisposableObject(IntPtr handle) | |||||
| => _handle = handle; | |||||
| protected virtual void Dispose(bool disposing) | |||||
| private void internal_dispose(bool disposing) | |||||
| { | { | ||||
| if (disposing) | if (disposing) | ||||
| { | { | ||||
| // dispose managed state (managed objects). | |||||
| DisposeManagedResources(); | |||||
| // free unmanaged resources (unmanaged objects) and override a finalizer below. | // free unmanaged resources (unmanaged objects) and override a finalizer below. | ||||
| if (_handle != IntPtr.Zero) | if (_handle != IntPtr.Zero) | ||||
| { | { | ||||
| // dispose managed state (managed objects). | |||||
| DisposeManagedState(); | |||||
| // set large fields to null. | // set large fields to null. | ||||
| DisposeUnManagedState(_handle); | |||||
| DisposeUnmanagedResources(_handle); | |||||
| _handle = IntPtr.Zero; | _handle = IntPtr.Zero; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /// <summary> | |||||
| /// Dispose any managed resources. | |||||
| /// </summary> | |||||
| /// <remarks>Equivalent to what you would perform inside <see cref="Dispose()"/></remarks> | |||||
| protected virtual void DisposeManagedResources() | |||||
| { | |||||
| } | |||||
| /// <summary> | |||||
| /// Dispose any unmanaged resources related to given <paramref name="handle"/>. | |||||
| /// </summary> | |||||
| protected abstract void DisposeUnmanagedResources(IntPtr handle); | |||||
| // override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. | // override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. | ||||
| ~DisposableObject() | ~DisposableObject() | ||||
| { | { | ||||
| // Do not change this code. Put cleanup code in Dispose(bool disposing) above. | // Do not change this code. Put cleanup code in Dispose(bool disposing) above. | ||||
| Dispose(false); | |||||
| internal_dispose(false); | |||||
| } | } | ||||
| // This code added to correctly implement the disposable pattern. | // This code added to correctly implement the disposable pattern. | ||||
| public void Dispose() | public void Dispose() | ||||
| { | { | ||||
| // Do not change this code. Put cleanup code in Dispose(bool disposing) above. | // Do not change this code. Put cleanup code in Dispose(bool disposing) above. | ||||
| Dispose(true); | |||||
| internal_dispose(true); | |||||
| // uncomment the following line if the finalizer is overridden above. | // uncomment the following line if the finalizer is overridden above. | ||||
| GC.SuppressFinalize(this); | GC.SuppressFinalize(this); | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| } | |||||
| @@ -1,8 +1,9 @@ | |||||
| using System; | using System; | ||||
| using System.IO; | |||||
| namespace Tensorflow.Eager | namespace Tensorflow.Eager | ||||
| { | { | ||||
| public class ContextOptions : IDisposable | |||||
| public class ContextOptions : IDisposable //TODO! Eli: Shouldn't this inherieting DisposableObject? | |||||
| { | { | ||||
| private IntPtr _handle; | private IntPtr _handle; | ||||
| @@ -439,12 +439,12 @@ namespace Tensorflow | |||||
| _unfetchable_ops.Add(op); | _unfetchable_ops.Add(op); | ||||
| } | } | ||||
| protected override void DisposeManagedState() | |||||
| protected override void DisposeManagedResources() | |||||
| { | { | ||||
| ops.default_graph_stack.remove(this); | ops.default_graph_stack.remove(this); | ||||
| } | } | ||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| { | { | ||||
| c_api.TF_DeleteGraph(handle); | c_api.TF_DeleteGraph(handle); | ||||
| } | } | ||||
| @@ -37,7 +37,7 @@ namespace Tensorflow | |||||
| c_api.TF_ImportGraphDefOptionsAddReturnOutput(_handle, name, index); | c_api.TF_ImportGraphDefOptionsAddReturnOutput(_handle, name, index); | ||||
| } | } | ||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| => c_api.TF_DeleteImportGraphDefOptions(handle); | => c_api.TF_DeleteImportGraphDefOptions(handle); | ||||
| public static implicit operator IntPtr(ImportGraphDefOptions opts) => opts._handle; | public static implicit operator IntPtr(ImportGraphDefOptions opts) => opts._handle; | ||||
| @@ -396,7 +396,7 @@ namespace Tensorflow | |||||
| Dispose(); | Dispose(); | ||||
| } | } | ||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| { | { | ||||
| using (var status = new Status()) | using (var status = new Status()) | ||||
| { | { | ||||
| @@ -32,7 +32,7 @@ namespace Tensorflow | |||||
| _handle = handle; | _handle = handle; | ||||
| } | } | ||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| => c_api.TF_DeleteSessionOptions(handle); | => c_api.TF_DeleteSessionOptions(handle); | ||||
| public void SetConfig(ConfigProto config) | public void SetConfig(ConfigProto config) | ||||
| @@ -50,7 +50,7 @@ namespace Tensorflow | |||||
| /// </summary> | /// </summary> | ||||
| public void Check(bool throwException = false) | public void Check(bool throwException = false) | ||||
| { | { | ||||
| if(Code != TF_Code.TF_OK) | |||||
| if (Code != TF_Code.TF_OK) | |||||
| { | { | ||||
| Console.WriteLine(Message); | Console.WriteLine(Message); | ||||
| if (throwException) | if (throwException) | ||||
| @@ -65,7 +65,7 @@ namespace Tensorflow | |||||
| return status._handle; | return status._handle; | ||||
| } | } | ||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| => c_api.TF_DeleteStatus(handle); | => c_api.TF_DeleteStatus(handle); | ||||
| } | } | ||||
| } | |||||
| } | |||||
| @@ -392,11 +392,11 @@ namespace Tensorflow | |||||
| return $"tf.Tensor '{name}' shape=({string.Join(",", shape)}) dtype={dtype}"; | return $"tf.Tensor '{name}' shape=({string.Join(",", shape)}) dtype={dtype}"; | ||||
| } | } | ||||
| protected override void DisposeManagedState() | |||||
| { | |||||
| } | |||||
| //protected override void DisposeManagedState() | |||||
| //{ | |||||
| //} | |||||
| protected override void DisposeUnManagedState(IntPtr handle) | |||||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||||
| { | { | ||||
| if(handle != IntPtr.Zero) | if(handle != IntPtr.Zero) | ||||
| { | { | ||||