@@ -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) | ||||
{ | { | ||||